JS连接TP钱包实战教程,Web3前端开发入门指南
随着Web3生态的快速发展,连接钱包成为DApp前端开发的基础操作之一,TP钱包作为国内用户基数较大的多链钱包,支持EVM、Solana等多条公链,本文将详细讲解基于EVM链的JavaScript连接...
随着Web3生态的爆发式增长,钱包连接已经成为去中心化应用(DApp)前端开发的核心基础操作之一,TokenPocket(简称TP钱包)作为国内用户基数最大的多链去中心化钱包之一,覆盖EVM、Solana、TRON等数十条公链,本文将详细讲解基于EVM链的JavaScript连接TP钱包的两种主流实现方式,适配纯静态页面与现代前端工程化项目,适合前端开发者快速上手落地。
前置准备
在开始编码前,需要完成以下准备工作:
- 安装TP钱包:可以从TP钱包官网下载移动端APP或Chrome/Edge浏览器插件版本,建议使用最新版本以获得最佳兼容性。
- 了解运行环境适配规则:
- PC端:在TP钱包内置浏览器打开项目可直接获取注入对象,无需额外配置;若使用外部浏览器,需通过WalletConnect协议实现跨端扫码连接,部分浏览器需提前安装TP钱包插件才能识别钱包注入对象。
- 移动端:直接在手机自带浏览器打开项目页面,会自动唤起TP钱包完成授权;微信内置浏览器存在协议跳转限制,需引导用户点击右上角选择「在外部浏览器打开」后再进行连接。
- 引入依赖工具:
- 纯静态HTML项目:通过CDN引入对应库
- 工程化项目(Vue/React等):通过npm安装依赖:
npm install ethers @walletconnect/qrcode-modal @walletconnect/client - 如需简化链上交互,推荐引入
ethers.js封装底层Web3操作
TP内置浏览器注入连接(极简开发方案)
TP钱包内置浏览器会自动注入标准的window.ethereum对象,API与MetaMask完全兼容,是开发效率最高的连接方式,仅适用于TP钱包生态内的场景。
完整代码实现
<!-- 引入ethers.js用于链上交互 --> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ethers.umd.min.js"></script> <button id="connectBtn" disabled>连接TP钱包</button> <div id="accountDisplay" style="margin-top:10px;"></div> <script> const connectBtn = document.getElementById('connectBtn'); const accountDisplay = document.getElementById('accountDisplay'); // 优化版环境检测:兼容新旧版本TP钱包与多钱包共存场景 function checkTpWalletEnv() { const { ethereum } = window; if (!ethereum) return false; // 兼容多钱包注入场景 const hasTpProvider = ethereum.providers?.some(provider => provider.label === 'TokenPocket') || ethereum.provider?.label === 'TokenPocket' || ethereum.isTpWallet; return hasTpProvider; } async function connectTpWallet() { connectBtn.textContent = "正在连接中..."; connectBtn.disabled = true; if (!checkTpWalletEnv()) { alert('请在TP钱包内置浏览器中打开此页面,或安装TP钱包浏览器插件'); connectBtn.textContent = "连接TP钱包"; connectBtn.disabled = false; return; } try { // 请求用户授权连接钱包 const accounts = await window.ethereum.request({ method: "eth_requestAccounts" }); const currentAccount = accounts[0]; accountDisplay.textContent = `当前连接账户:${currentAccount.slice(0,6)}...${currentAccount.slice(-4)}`; console.log("连接成功,当前账户:", currentAccount); // 初始化ethers提供商 const provider = new ethers.providers.Web3Provider(window.ethereum); const signer = provider.getSigner(); // 获取当前连接的链ID const chainId = await window.ethereum.request({ method: "eth_chainId" }); console.log("当前链ID:", chainId); // 监听账户变更,自动更新前端页面 window.ethereum.on("accountsChanged", (newAccounts) => { const newAccount = newAccounts[0] || ''; accountDisplay.textContent = newAccount ? `当前连接账户:${newAccount.slice(0,6)}...${newAccount.slice(-4)}` : '未连接钱包'; // 自动更新余额展示 if(newAccount) getWalletBalance(newAccount, provider); }); // 监听链网络变更 window.ethereum.on("chainChanged", (newChainId) => { console.log("链网络已切换为:", newChainId); alert(`检测到链网络切换,当前链ID:${newChainId}`); // 可在此处重新加载链上数据 }); connectBtn.textContent = "已连接钱包"; } catch (error) { console.error("连接TP钱包失败:", error.message); alert(`连接失败:${error.message}`); connectBtn.textContent = "连接TP钱包"; connectBtn.disabled = false; } } // 绑定按钮点击事件 connectBtn.addEventListener('click', connectTpWallet); // 页面加载完成后检测环境,启用按钮 window.addEventListener('load', () => { if(checkTpWalletEnv()) connectBtn.disabled = false; }) // 示例:获取钱包余额(可复用至进阶操作) async function getWalletBalance(address, provider) { if(!provider) provider = new ethers.providers.Web3Provider(window.ethereum); const balance = await provider.getBalance(address); const formatBalance = ethers.utils.formatEther(balance); console.log("当前账户余额:", formatBalance); return formatBalance; } </script>
代码说明
eth_requestAccounts:遵循EIP-1193标准的授权方法,会唤起钱包授权弹窗获取用户授权的钱包地址,是当前Web3钱包连接的通用标准方法。- 内置的账户与链网络监听可以自动同步钱包状态,避免前端页面与钱包实际状态不一致的问题。
- 优化了按钮的加载状态与环境自动检测逻辑,适配实际开发中的用户体验需求。
跨浏览器WalletConnect连接(通用兼容方案)
如果在Chrome、Edge等外部浏览器中使用TP钱包,无法直接获取注入对象,可以通过WalletConnect协议实现扫码连接,适配所有支持Web3的浏览器与钱包。
💡 注意:WalletConnect V1已于2023年12月停止服务,以下为适配最新V2版本的代码示例,如需兼容旧版本可参考官方迁移文档。
完整代码实现
<!-- WalletConnect V2依赖 --> <script src="https://unpkg.com/@walletconnect/[email protected]/dist/index.umd.min.js"></script> <script src="https://unpkg.com/@walletconnect/[email protected]/dist/index.umd.min.js"></script> <!-- 引入ethers.js --> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ethers.umd.min.js"></script> <button id="wcConnectBtn">扫码连接TP钱包</button> <div id="wcAccountDisplay" style="margin-top:10px;"></div> <script> const wcConnectBtn = document.getElementById('wcConnectBtn'); const wcAccountDisplay = document.getElementById('wcAccountDisplay'); let client; async function initWalletConnect() { // 初始化WalletConnect客户端 client = await window.signClient.init({ projectId: "YOUR_WALLETCONNECT_PROJECT_ID", // 需要在WalletConnect官网申请免费项目ID relayUrl: "wss://relay.walletconnect.com", metadata: { name: "我的测试DApp", description: "演示JS连接TP钱包", url: window.location.origin, icons: ["https://your-dapp-icon-url.png"] } }); // 监听连接成功事件 client.on("session_proposal", async (proposal) => { const { uri } = await client.connect({ pairingTopic: proposal.pairingTopic, requiredNamespaces
