本指南专为网页端DApp开发者打造,聚焦TokenPocket钱包的代码实现对接方案,旨在解决网页应用与TokenPocket钱包的安全交互问题,指南详细拆解了调用TokenPocket钱包的核心代码逻辑,涵盖适配多浏览器环境、处理钱包授权、签名交互等关键步骤,同时梳理了常见异常场景的处理方法,帮助开发者快速完成集成,实现网页端与TokenPocket钱包的顺畅联动,为用户提供便捷的链上操作体验。
在去中心化应用(DApp)开发中,链上交互的核心前提是让用户便捷连接钱包——无论是授权、转账还是合约调用,快速唤起TokenPocket(以下简称TP钱包)都是开发者必须掌握的基础能力,很多新手开发者在集成时容易踩坑,比如唤起失败、跳转下载不及时、跨端兼容问题等,本文将详细拆解两种主流场景(移动端H5唤起、桌面端插件连接)的完整实现方案,附可直接复用的代码,帮助开发者快速完成TP钱包的集成。
核心原理
TP钱包为网页开发者提供了两类标准化接入方案,分别对应移动端APP和桌面端浏览器插件,二者遵循不同的技术规范,适配不同的使用场景:
- 移动端URL Scheme:通过自定义协议
tpwallet://唤起已安装的TP钱包APP,未安装时自动跳转对应应用市场下载,适合移动端H5页面的一键唤起; - 桌面端Web3 API:基于EIP-1193标准,通过浏览器插件(TokenPocket Wallet)实现网页与钱包的双向交互,支持多链操作、链上交易等复杂功能,是桌面端DApp的主流接入方式。
移动端H5唤起TP钱包的代码实现
适用场景
适用于所有移动端H5页面,是DApp最常用的接入方式,核心逻辑为「设备类型检测→唤起TP协议→兜底下载→特殊浏览器适配」,解决唤起失败和下载引导的问题。
HTML触发按钮
<!-- 移动端唤起按钮 --> <button id="openTpMobile" style="padding:10px 22px; background:#007bff; color:#fff; border:none; border-radius:6px; cursor:pointer;">打开TP钱包</button>
JS逻辑代码
实现唤起、兜底下载及特殊浏览器适配的完整逻辑:
// 绑定按钮点击事件
document.getElementById('openTpMobile').addEventListener('click', openTPWallet);
function openTPWallet() {
// 1. 定义TP钱包协议与下载链接
const TP_SCHEME = 'tpwallet://'; // TP钱包官方自定义协议
const APP_STORE_URL = 'https://apps.apple.com/cn/app/tokenpocket/id1505760000'; // iOS应用商店链接
const ANDROID_DOWNLOAD = 'https://www.tokenpocket.pro/download'; // Android官方下载页
// 2. 检测设备类型与浏览器环境
const userAgent = navigator.userAgent.toLowerCase();
const isIOS = /iphone|ipad|ipod/.test(userAgent);
const isAndroid = /android/.test(userAgent);
const isWeChat = /micromessenger/i.test(userAgent); // 微信内置浏览器判断
// 3. 特殊浏览器适配:微信需引导至外部浏览器打开
if (isWeChat) {
alert('请点击右上角...选择「在浏览器中打开」,以唤起TP钱包');
return;
}
// 4. 唤起逻辑+兜底处理
if (isIOS || isAndroid) {
// 尝试唤起TP钱包
window.location.href = TP_SCHEME;
// 1秒后未唤起则跳转对应应用市场(避免误判)
setTimeout(() => {
window.location.href = isIOS ? APP_STORE_URL : ANDROID_DOWNLOAD;
}, 1000);
} else {
// 桌面端提示跳转移动端或下载插件
alert('请在移动端打开此页面,或下载TP桌面插件');
window.location.href = ANDROID_DOWNLOAD;
}
}
扩展功能:唤起指定DApp页面
若需唤起TP钱包并直接跳转至指定DApp页面,可修改协议为带参数格式:
tpwallet://dapp?url=https://your-dapp.com&chainId=0x1
其中url为目标DApp地址,chainId为目标公链ID(如以太坊主网为0x1,BSC为0x38),替换为实际参数即可实现一键跳转至指定链的DApp页面。
桌面端连接TP钱包插件的代码实现
适用场景
适用于桌面端Chrome、Edge等浏览器,用户已安装TP浏览器插件时,可通过Web3 API实现账户授权、链信息获取、交易签名等操作,支持多链切换,是桌面端DApp的标准接入方式。
HTML触发按钮
<!-- 桌面端连接按钮 --> <button id="connectTpDesktop" style="padding:10px 22px; background:#28a745; color:#fff; border:none; border-radius:6px; cursor:pointer;">桌面端连接TP</button>
JS交互代码
实现插件检测、账户授权、链操作及交易发起的完整逻辑:
// 绑定桌面端按钮事件
document.getElementById('connectTpDesktop').addEventListener('click', connectTPDesktop);
async function connectTPDesktop() {
// 1. 检测是否安装TP钱包插件(兼容新旧版本)
const isTPPlugin = window.ethereum && (window.ethereum.isTokenPocket || window.ethereum.isTP);
if (!isTPPlugin) {
alert('请先安装TokenPocket浏览器插件');
window.location.href = 'https://www.tokenpocket.pro/download';
return;
}
try {
// 2. 请求用户授权钱包账户
const accounts = await window.ethereum.request({ method: 'eth_requestAccounts' });
const currentAccount = accounts[0];
console.log('已连接账户:', currentAccount);
// 3. 获取当前链ID(支持以太坊、BSC、Polygon等多链)
const chainId = await window.ethereum.request({ method: 'eth_chainId' });
console.log('当前链ID:', chainId);
// 4. 示例:切换至BSC链
await switchToChain('0x38');
// 5. 示例:发起转账(需传入收款地址和金额)
// await sendTransaction('0x...收款地址...', 0.01);
} catch (error) {
console.error('连接失败:', error.message);
alert('用户拒绝授权或插件未就绪');
}
}
// 辅助函数:切换公链
async function switchToChain(chainId) {
try {
await window.ethereum.request({
method: 'wallet_switchEthereumChain',
params: [{ chainId }]
});
console.log(`已切换至链ID:${chainId}`);
} catch (error) {
// 若链未添加,自动添加该链
if (error.code === 4902) {
const chainConfig = getChainConfig(chainId);
if (chainConfig) {
await window.ethereum.request({
method: 'wallet_addEthereumChain',
params: [chainConfig]
});
}
}
}
}
// 辅助函数:获取链配置(示例)
function getChainConfig(chainId) {
const chains = {
'0x38': { // BSC
chainName: 'Binance Smart Chain',
nativeCurrency: { name: 'BNB', symbol: 'BNB', decimals: 18 },
rpcUrls: ['https://bsc-dataseed.binance.org/'],
blockExplorerUrls: ['https://bscscan.com/']
},
'0x1': { // 以太坊主网
chainName: 'Ethereum Mainnet',
nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 },
rpcUrls: ['https://mainnet.infura.io/v3/'],
blockExplorerUrls: ['https://etherscan.io/']
}
};
return chains[chainId] ? { chainId, ...chains[chainId] } : null;
}
// 辅助函数:发起转账
async function sendTransaction(to, amount) {
try {
const txHash = await window.ethereum.request({
method: 'eth_sendTransaction',
params: [{
from: (await window.ethereum.request({ method: 'eth_accounts' }))[0],
to: to,
value: '0x' + (amount * 1e18).toString(16), // 转换为Wei的十六进制值
gasLimit: '0x5028', // gas上限(示例值)
gasPrice: '0x2540be400' // gas价格(示例值)
}]
});
console.log('交易已发送,哈希:', txHash);
return txHash;
} catch (error) {
console.error('转账失败:', error.message);
}
}
注意事项
- 协议兼容性:使用最新TP协议
tpwallet://,旧版本协议(如tokenpocket://)可能失效,建议定期查看TP官方开发者文档更新; - 兜底延迟:1秒延迟是行业通用值,过短易误判唤起失败,过长会影响用户体验,若遇到部分设备唤起较慢,可调整为1.2秒,但建议不超过1.5秒;
- 特殊浏览器适配:微信、QQ内置浏览器会拦截外部Scheme链接,需额外判断并引导用户在外部浏览器打开,避免唤起失败;
- 安全合规:跳转链接需使用TP官方下载地址,避免第三方链接防止钓鱼;唤起指定DApp时,需校验目标域名安全性;
- 多链支持:桌面端API支持
wallet_switchEthereumChain切换公链,未添加的链可通过wallet_addEthereumChain自动添加,适配多链DApp需求; - 插件兼容:桌面端优先用
window.ethereum.isTokenPocket标记检测插件,兼容旧版本可增加window.ethereum.isTP判断。
本文覆盖了移动端和桌面端集成TP钱包的核心场景,代码均经过验证可直接复用,开发者可根据自身DApp的需求调整样式和功能,若遇到集成问题,可参考TP官方开发者文档或联系技术支持获取帮助。