本指南围绕自建网站调用TP钱包展开,先梳理核心原理:TP钱包基于区块链DApp生态的连接机制,涉及钱包授权、链上交互的底层逻辑;再提供可落地的实操方案,涵盖环境搭建、钱包授权流程、链上交易发起与交互验证等关键步骤,助力开发者快速解决网站与TP钱包对接的技术痛点,降低开发门槛,保障交互安全,适用于各类区块链应用的前端对接场景。
随着Web3生态的快速普及,越来越多的自建网站开始集成链上功能——从NFT铸造、加密支付到DeFi交互,这些功能都需要与数字钱包完成对接,TP钱包作为国内用户基数领先的移动端数字钱包之一,凭借对多链生态的支持和完善的开发者工具,成为众多网站的首选对接对象,本文将从底层交互原理出发,结合最新的实操步骤,帮助开发者快速完成自建网站与TP钱包的无缝对接。
核心原理:TP钱包的交互逻辑
TP钱包的调用本质是遵循Web3标准协议的跨端交互,核心依赖两个以太坊改进提案(EIP)标准,这也是所有合规Web3钱包交互的基础:
- EIP-1193:定义了钱包与去中心化应用(DApp)的通用接口(如请求账户、发起交易),是DApp与钱包交互的核心规范;
- EIP-1102:明确了钱包授权流程,要求DApp必须主动请求用户授权,才能获取链上地址或发起交易,这一设计是为了保障用户资产安全,避免钱包被恶意调用。
TP钱包的交互场景需区分PC端与移动端,两者实现逻辑略有不同:
- PC端:用户安装TP钱包浏览器插件后,通过
window.ethereum对象直接与钱包交互,该对象由插件注入浏览器环境; - 移动端:用户安装TP钱包App后,通过URL Scheme唤起协议,让DApp主动跳转到TP钱包完成授权或交易,是移动端Web3交互的标准做法。
前置准备工作
- 环境要求:网站必须部署在HTTPS协议(本地
localhost/0.0.1可兼容),否则浏览器会限制Web3相关API调用(因涉及用户资产安全,浏览器强制要求加密环境); - 依赖引入:推荐使用
Ethers.js(轻量易用,开发者主流选择)或Web3.js简化链上交互,本文以Ethers.js v6为例; - 参考官方文档:TP钱包开发者中心(https://developer.tokenpocket.pro/)会同步最新API、唤起规则和链支持列表,需提前查阅,避免协议变更导致功能失效。
实操步骤:分场景实现调用
步骤1:检测钱包环境(PC/移动端)
必须绑定用户主动触发的事件(如按钮点击),否则浏览器会拦截Web3请求(安全策略要求)。
// 引入Ethers.js(生产环境推荐npm安装,CDN适合快速调试)
import { ethers } from "https://cdn.ethers.org/v6.7.0/ethers.min.js";
// 检测设备类型:区分移动端与PC端
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
// 按钮点击事件(核心:用户主动触发)
async function connectTPWallet() {
if (isMobile) {
// 移动端:UA检测是否安装TP钱包App(官方推荐方式)
const isTPInstalled = /TPWallet|tpwallet/i.test(navigator.userAgent);
if (!isTPInstalled) {
alert("请先安装TP钱包App,点击确定跳转下载页");
window.location.href = "https://www.tokenpocket.pro/download";
return;
}
// 移动端唤起TP钱包的URL Scheme(不同链需调整参数,如BSC需加chainId)
const currentUrl = encodeURIComponent(window.location.href);
const tpScheme = `tp://dapp_connect?url=${currentUrl}`;
window.location.href = tpScheme;
// 兜底:唤起失败时提示手动操作
setTimeout(() => alert("若未自动唤起,请手动打开TP钱包完成授权"), 1500);
} else {
// PC端:检测TP钱包插件是否存在(插件标识为isTokenPocket,区分其他钱包)
if (!window.ethereum || !window.ethereum.isTokenPocket) {
alert("请先安装TP钱包浏览器插件,点击确定跳转下载页");
window.location.href = "https://www.tokenpocket.pro/download";
return;
}
}
}
步骤2:钱包授权连接
授权后获取用户链上地址,是后续所有链上交互的基础。
async function authorizeWallet() {
try {
// 初始化Ethers Provider,连接钱包注入的window.ethereum对象
const provider = new ethers.providers.Web3Provider(window.ethereum);
// 请求用户授权(遵循EIP-1193标准)
await provider.send("eth_requestAccounts", []);
// 获取签名者对象(用于交易/签名)
const signer = provider.getSigner();
// 获取用户链上地址
const userAddress = await signer.getAddress();
console.log("已连接TP钱包,地址:", userAddress);
// 存储地址(本地存储或后端,用于后续交互)
localStorage.setItem("tp_wallet_address", userAddress);
return userAddress;
} catch (error) {
// 友好错误提示:区分用户拒绝和其他错误
if (error.code === 4001) {
alert("您已拒绝钱包授权,请点击连接按钮重试");
} else {
console.error("授权失败:", error);
alert("授权失败,请检查钱包是否正常打开");
}
return null;
}
}
步骤3:链上交互(以发起ETH转账为例)
授权后即可调用钱包发起交易,注意单位转换(Ethers.js提供便捷方法)。
async function sendTransaction(toAddress, amount) {
try {
// 复用已初始化的Provider和Signer(无需重复连接)
const provider = new ethers.providers.Web3Provider(window.ethereum);
const signer = provider.getSigner();
// 构造交易参数:to为接收地址,value为转账金额(单位:ETH,转换为wei)
// 示例:转账0.01 ETH,amount传"0.01"
const tx = await signer.sendTransaction({
to: toAddress,
value: ethers.utils.parseEther(amount)
});
console.log("交易已发送,哈希:", tx.hash);
// 等待交易上链确认(一般2次确认即可)
const receipt = await tx.wait(2);
console.log("交易确认完成,区块号:", receipt.blockNumber);
alert("转账成功,交易哈希:" + tx.hash);
return receipt;
} catch (error) {
// 错误处理:区分常见场景
if (error.code === 4001) {
alert("您已拒绝交易请求");
} else if (error.code === "INSUFFICIENT_FUNDS") {
alert("余额不足,请检查钱包余额");
} else {
console.error("交易失败:", error);
alert("交易失败,请稍后重试");
}
return null;
}
}
常见问题与解决方案
-
移动端唤起失败:
- 检查URL Scheme是否符合官方最新规则;
- 确保按钮是用户主动点击触发(页面加载自动唤起会被拦截);
- 兜底方案:引导用户手动打开TP钱包,在DApp页面点击“连接钱包”。
-
网络不匹配:
- 网站默认链与钱包链不一致时,调用
wallet_switchEthereumChain切换网络,示例:async function switchTPNetwork(chainId) { try { // chainId为十六进制:以太坊主网"0x1",BSC"0x38" await window.ethereum.request({ method: "wallet_switchEthereumChain", params: [{ chainId: ethers.utils.hexValue(chainId) }] }); } catch (error) { if (error.code === 4902) alert("该网络需手动添加到TP钱包"); } }
- 网站默认链与钱包链不一致时,调用
-
授权被拒绝:
- 提示用户在TP钱包中点击“同意授权”,确保钱包处于解锁状态;
- 排除其他钱包注入(如MetaMask),通过
window.ethereum.isTokenPocket判断是否为TP钱包。
安全注意事项
- 绝对不存储用户私钥:所有签名、交易操作均由TP钱包本地完成,网站仅存储公开地址;
- 验证钱包返回结果:防止钓鱼攻击,示例(验证签名):
async function verifySignature(message, signature, signerAddress) { try { const recovered = ethers.verifyMessage(message, signature); return recovered.toLowerCase() === signerAddress.toLowerCase(); } catch { return false; } } - 仅用HTTPS部署:避免中间人劫持,本地开发用
localhost。
通过以上步骤,即可快速完成自建网站与TP钱包的对接,实现各类链上功能,建议项目中加入API版本检测,定期同步官方更新,同时严格遵循Web3安全规范,保障用户资产安全,TP钱包的生态支持持续完善,开发者需保持对官方文档的关注,适配最新规则,提升用户体验。