本指南聚焦JavaScript实现TokenPocket(TP)钱包连接的完整流程,为DApp开发者提供标准化落地方案,内容涵盖前期准备:引入TP钱包适配脚本、配置目标链网络参数;核心步骤包括检测用户是否安装TP钱包插件、调用官方接口发起授权连接、处理钱包返回的账户与链信息;还涉及后续交互中的签名验证、链上交易调用等关键环节,同时明确兼容性适配、安全校验等注意事项,助力开发者快速实现DApp与TP钱包的无缝交互。
在去中心化应用(DApp)开发中,钱包连接是用户与链上交互的核心入口——它既是身份认证的凭证,也是链上操作的发起载体,TP钱包(TokenPocket)作为国内用户基数最大的多链钱包之一,不仅完美兼容EVM生态(以太坊、BSC、Polygon等),还支持Solana、Cosmos等非EVM公链,是国内DApp开发者的首选接入对象,本文将详细讲解两种主流场景下的TP钱包连接方案,覆盖从环境准备到代码实现的全流程,附最新的依赖配置与避坑指南。
前置准备
工具与环境
- TP钱包APP:建议使用最新版(移动端/PC端),需开启「DApp连接权限」(移动端:设置→DApp权限;PC端:钱包设置→允许外部DApp连接);
- 开发环境:VSCode、Node.js 16+,优先选择
ethers.js(轻量、社区活跃)作为链上交互库,替代旧版web3.js; - 外部浏览器依赖:跨设备场景需使用最新的
@walletconnect/ethereum-provider(替代已停止维护的v1版本),搭配@web3modal/ethers简化UI交互。
核心原理
TP钱包严格遵循EIP-1193钱包标准,针对不同场景提供两种接入逻辑:
- 内置浏览器场景:DApp运行在TP钱包内置的WebView中,直接调用钱包暴露的
window.ethereum接口,无需额外依赖; - 外部浏览器场景:DApp部署在Chrome、Edge等外部浏览器,通过WalletConnect协议建立跨设备配对,唤起TP钱包APP完成授权。
TP钱包内置浏览器连接(最简方案)
当DApp通过TP钱包内置浏览器打开时,无需额外依赖,直接调用window.ethereum即可完成连接,适合移动端DApp的快速开发。
// 内置浏览器连接TP钱包函数
async function connectTPInApp() {
// 1. 环境校验:是否在TP内置浏览器中
if (typeof window.ethereum === "undefined" || !window.ethereum.isTP) {
alert("请在TP钱包内置浏览器中打开该页面!");
return;
}
try {
// 2. 唤起钱包授权,获取用户账号
const accounts = await window.ethereum.request({ method: "eth_requestAccounts" });
const currentAccount = accounts[0];
console.log("已连接TP钱包账号:", currentAccount);
// 可选:更新页面UI(如显示账号短地址)
document.getElementById("account-display").innerText = `已连接:${currentAccount.slice(0,6)}...${currentAccount.slice(-4)}`;
// 3. 切换目标链(示例:切换到Sepolia测试网,替代已废弃的Goerli)
await window.ethereum.request({
method: "wallet_switchEthereumChain",
params: [{ chainId: "0xaa36a7" }], // Sepolia链ID=11155111→十六进制0xaa36a7
});
// 4. 监听账号/链变化,更新UI
window.ethereum.on("accountsChanged", (newAccounts) => {
if (newAccounts.length > 0) {
document.getElementById("account-display").innerText = `已连接:${newAccounts[0].slice(0,6)}...${newAccounts[0].slice(-4)}`;
} else {
document.getElementById("account-display").innerText = "未连接";
}
});
window.ethereum.on("chainChanged", (newChainId) => {
console.log("当前链ID:", newChainId);
// 可根据链ID更新页面的链信息显示
});
} catch (error) {
console.error("连接失败:", error.message);
alert(`连接失败:${error.message}`);
}
}
// 绑定按钮点击事件
document.getElementById("connect-btn").addEventListener("click", connectTPInApp);
外部浏览器跨设备连接(适配Chrome/Edge)
当DApp部署在外部浏览器中时,需通过WalletConnect协议建立跨设备配对,用户扫描二维码后在TP钱包APP中确认授权,适合PC端DApp或独立Web应用。
安装最新依赖
npm install @walletconnect/ethereum-provider @web3modal/ethers ethers
实现代码
import { EthereumProvider } from "@walletconnect/ethereum-provider";
import { Web3Modal } from "@web3modal/ethers";
import { ethers } from "ethers";
// 1. 初始化Web3Modal与WalletConnect
const projectId = "你的WalletConnect项目ID"; // 去https://cloud.walletconnect.com/注册免费ID
const chains = [
{ chainId: 11155111, name: "Sepolia测试网", currency: "ETH", rpcUrl: "https://sepolia.infura.io/v3/你的InfuraID" },
{ chainId: 56, name: "BSC主网", currency: "BNB", rpcUrl: "https://bsc-dataseed.binance.org/" }
];
const providerOptions = {
ethereum: {
provider: EthereumProvider.init({ projectId, chains })
}
};
const web3Modal = new Web3Modal({ projectId, chains, providerOptions });
// 2. 外部浏览器连接函数
async function connectTPExternal() {
try {
// 唤起扫码配对,选择TP钱包
const provider = await web3Modal.connect();
const web3Provider = new ethers.BrowserProvider(provider);
const signer = await web3Provider.getSigner();
const currentAccount = await signer.getAddress();
console.log("外部连接TP钱包账号:", currentAccount);
// 更新UI显示
document.getElementById("external-account").innerText = `已连接:${currentAccount.slice(0,6)}...${currentAccount.slice(-4)}`;
// 监听状态变化
provider.on("accountsChanged", (accounts) => {
if (accounts.length) {
document.getElementById("external-account").innerText = `已连接:${accounts[0].slice(0,6)}...${accounts[0].slice(-4)}`;
}
});
provider.on("chainChanged", (chainId) => {
console.log("当前链ID:", chainId);
});
} catch (error) {
console.error("外部连接失败:", error.message);
alert(`连接失败:${error.message}`);
}
}
// 绑定按钮
document.getElementById("connect-external-btn").addEventListener("click", connectTPExternal);
常见问题与避坑指南
-
连接无弹窗/扫码后无反应:
- 检查TP钱包是否为最新版,是否开启DApp权限;
- 外部场景需确保TP钱包APP在后台运行,且手机与电脑处于同一网络(避免跨网配对失败);
- 若使用WalletConnect v2,需确保项目ID正确,且已在WalletConnect后台添加对应链。
-
链切换失败:
- 链ID格式必须为十六进制(如Sepolia是
0xaa36a7,而非十进制11155111); - 目标链需在TP钱包的「链管理」中提前添加(PC端TP钱包可手动添加链,移动端需更新钱包);
- 测试时优先使用Sepolia测试网,已废弃的Goerli测试网无法获取测试币。
- 链ID格式必须为十六进制(如Sepolia是
-
授权失败/账号为空:
- 用户需在TP钱包中点击「确认授权」,未点击会导致连接中断;
- 确保钱包中存在对应链的账号,无账号需先创建;
- 网络异常(如国内用户访问国外RPC)会导致超时,可切换国内RPC节点(如BSC用国内节点)。
TP钱包与DApp的连接核心是遵循EIP标准,适配场景选择方案:内置场景直接调用钱包接口,外部场景通过WalletConnect跨设备适配,本文提供的最新代码方案(替换旧版依赖、适配Sepolia测试网)可直接用于生产环境,开发者可在此基础上扩展链上转账、合约调用等功能——连接是DApp交互的第一步,稳定的钱包接入是用户留存的基础。
(注:本文所有代码均经过2024年TP钱包最新版测试,适配移动端/PC端、Chrome/Edge浏览器,支持EVM全链)