本指南是面向前端开发者的Web3交互入门实用教程,核心聚焦于通过JavaScript实现与TP钱包的对接操作,作为入门级全指南,它系统梳理了从基础环境搭建、必要依赖引入,到编写核心连接代码、完成钱包授权与基础链上交互的全流程,帮助新手快速掌握前端Web3交互的核心逻辑,避开对接TP钱包过程中的常见误区,为后续更复杂的去中心化应用开发打下坚实基础。
在Web3生态快速迭代的今天,去中心化应用(DAPP)与加密钱包的交互是构建用户信任的核心基础环节,TP钱包(原名TokenPocket)作为国内用户量庞大的多链加密钱包,支持移动端、桌面端全场景使用,为前端开发者提供了便捷的连接能力,本文将详细讲解如何用JavaScript实现与TP钱包的连接,附完整可运行代码,帮助开发者快速上手Web3钱包集成。
前置准备
环境要求
- 前端项目(支持ES6+语法,原生JS、React、Vue等框架均可)
- 已安装TP钱包App(移动端)或桌面端TP钱包客户端
- 本地开发可用
http://localhost,生产环境需部署在HTTPS协议下(WalletConnect协议要求DApp必须在安全环境中运行,本地localhost例外,否则会触发安全限制导致连接失败)
依赖选择
我们采用行业通用的WalletConnect协议实现连接,该协议是Web3领域最主流的跨钱包连接标准,兼容TP钱包及绝大多数主流加密钱包,无需针对TP单独开发,只需适配协议即可支持多链钱包,需安装两个核心依赖:
npm install @walletconnect/client qrcode
@walletconnect/client:实现钱包连接的核心协议库,负责会话管理、事件监听等qrcode:将配对URI生成二维码,供TP钱包扫码识别,建立钱包与DApp的安全连接
核心实现步骤
步骤1:初始化WalletConnect实例
初始化时需指定桥节点和目标链ID:
- 桥节点(bridge)是WalletConnect协议中用于中转连接请求的服务器,官方桥节点
https://bridge.walletconnect.org已足够稳定,若有需求也可自定义部署桥节点 - TP钱包支持以太坊、BSC、Polygon等多条公链,链ID可根据需求修改(以太坊主网为1,BSC主网为56,Polygon主网为137)
步骤2:生成配对URI(二维码)
调用createSession()方法生成配对URI,将其转为二维码后展示给用户:
- 配对URI是钱包与DApp建立会话的唯一标识,类似“连接密钥”
- 用户用TP钱包扫码后,钱包会自动解析该URI发起连接请求,弹出授权确认框
步骤3:监听连接状态
通过事件监听处理连接全流程状态:
- 除了连接成功、断开连接事件,还需监听
session_request事件,处理用户在钱包端的授权选择(用户扫码后,钱包会弹出确认框,此时DApp需监听该事件获取用户的同意/拒绝结果)
完整代码示例(原生JS实现)
以下是可直接复制运行的完整代码,建议通过本地服务器(如Live Server、http-server)运行,直接打开HTML文件会因浏览器安全策略阻止模块加载:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">连接TP钱包示例</title>
</head>
<body>
<button id="connectBtn" style="padding: 10px 20px; font-size: 16px; cursor: pointer;">连接TP钱包</button>
<div id="qrcodeContainer" style="margin: 20px 0;"></div>
<div id="walletInfo" style="color: #333; font-size: 14px; line-height: 1.5;"></div>
<script type="module">
import WalletConnect from '@walletconnect/client';
import QRCode from 'qrcode';
document.getElementById('connectBtn').addEventListener('click', async () => {
// 初始化WalletConnect实例
const connector = new WalletConnect({
bridge: 'https://bridge.walletconnect.org', // 官方稳定桥节点
chainId: 1, // 默认以太坊主网,切换BSC改为56,Polygon改为137
});
// 避免重复连接:若已连接则直接显示钱包信息
if (connector.connected) {
showWalletInfo(connector.accounts[0], connector.chainId);
return;
}
try {
// 创建会话,获取配对URI
await connector.createSession();
// 生成二维码,宽度200px适配移动端扫码
const qrcodeUrl = await QRCode.toDataURL(connector.uri, { width: 200 });
document.getElementById('qrcodeContainer').innerHTML =
`<img src="${qrcodeUrl}" alt="扫码连接TP钱包" style="border: 1px solid #eee; border-radius: 8px;">`;
// 监听连接成功事件
connector.on('connect', (error, payload) => {
if (error) throw error;
const { accounts, chainId } = payload.params[0];
showWalletInfo(accounts[0], chainId);
document.getElementById('qrcodeContainer').innerHTML = ''; // 隐藏二维码
});
// 监听断开连接事件
connector.on('disconnect', () => {
document.getElementById('walletInfo').innerText = '已断开连接,请点击按钮重新连接';
});
// 监听用户在钱包端的会话请求(核心:处理用户扫码后的授权)
connector.on('session_request', (error, payload) => {
if (error) throw error;
// 这里可添加自定义逻辑:比如提示用户在钱包中确认连接
console.log('钱包请求连接:', payload.params[0]);
});
} catch (err) {
console.error('连接流程出错:', err);
alert('连接失败,请检查:1. TP钱包是否开启WalletConnect功能;2. 网络是否正常;3. 链ID是否匹配');
}
});
// 显示钱包授权信息
function showWalletInfo(address, chainId) {
const chainName = {
1: '以太坊主网',
56: 'BSC主网',
137: 'Polygon主网'
}[chainId] || `自定义链(${chainId})`;
document.getElementById('walletInfo').innerText =
`✅ 已成功连接钱包\n钱包地址:${address}\n当前链:${chainName}`;
}
</script>
</body>
</html>
关键注意事项
- TP钱包设置:移动端TP钱包需进入「我的→设置→WalletConnect」开启对应功能;桌面端TP钱包需进入「设置→连接DApp」开启,否则无法扫码连接
- 链ID匹配:TP钱包中切换的链ID需与前端初始化时设置的一致,否则会连接失败(比如前端设为BSC的56,钱包需切换到BSC主网)
- 网络适配:扫码时手机与电脑需在同一网络环境;若桌面端TP钱包支持手动输入配对URI(二维码下方可复制URI),适合手机和电脑不在同一网络的场景
- 安全规范:连接过程中数据传输是加密的,但切勿在前端存储私钥等敏感信息;所有签名、交易操作必须在TP钱包内完成,DApp仅能获取用户授权后的钱包地址,无法访问私钥
进阶操作(连接成功后)
连接成功后,可进一步实现核心Web3功能:
- 发起交易:
connector.sendTransaction(txParams),txParams格式示例:const txParams = { from: 授权后的钱包地址, to: 交易接收地址, value: '0x16345785d8a0000', // 转账金额(以wei为单位,0.1ETH) gas: '0x5208', // gas限制(21000) gasPrice: '0x3b9aca00' // gas价格(1Gwei) }; - 消息签名:
connector.signMessage(address, message),用于验证用户身份(message为字符串,签名后返回签名结果) - 切换链:
connector.updateChain(chainId),钱包会弹出确认框,用户确认后完成链切换,DApp自动更新chainId
通过以上步骤,即可快速实现JavaScript与TP钱包的基础连接,为DApp的后续功能开发打下坚实基础。
相关阅读: