TonConnect移动端钱包(如Tonkeeper)交易请求闪退问题求助
TonConnect移动端钱包(如Tonkeeper)交易请求闪退问题求助
兄弟,我仔细看了你的问题和代码,发现几个核心问题导致移动端Tonkeeper的交易请求一闪而过,咱们一步步梳理解决:
首先,你的代码里存在一个严重的误解:TonConnect不需要你自己处理签名!
TonConnect的核心逻辑就是由用户的钱包(比如Tonkeeper)托管私钥并完成签名,前端只需要构造正确的交易请求,剩下的验证、签名、广播全由钱包搞定。你代码里自己生成密钥对、硬编码私钥、创建wallet实例的操作完全是多余的,甚至可能干扰TonConnect的正常流程,这绝对是要删掉的!
分析移动端闪退的可能原因及解决方案
多余的签名逻辑干扰流程
先把这些代码全部删掉:const nacl = TonWeb.utils.nacl; const tonweb = new TonWeb(); const keyPair = nacl.sign.keyPair(); let secretKey = keyPair.secretKey; let wallet = tonweb.wallet.create({ publicKey: keyPair.publicKey }); wallet = tonweb.wallet.create({ address: ad }); secretKey = TonWeb.utils.hexToBytes('1209645867598672398567298346723894769879'); const address = await wallet.getAddress(); const address_o = address.toString(true, true, true, false);这些代码不仅没用,还可能因为引入不必要的变量或逻辑,导致TonConnect的请求格式异常,被移动端钱包直接拒绝。
检查TonConnect Manifest文件的有效性
移动端钱包会严格验证你的manifestUrl指向的文件,确保你的网站是合法的。请确认:- Manifest文件是公网可访问的HTTPS地址(不能用localhost,必须是线上可访问的)
- 文件里的
name、iconUrl、url等字段填写正确,没有拼写错误 - 格式符合TonConnect的规范,比如:
{ "url": "https://your-domain.com", "name": "你的项目名称", "iconUrl": "https://your-domain.com/icon.png", "termsOfUseUrl": "https://your-domain.com/terms", "privacyPolicyUrl": "https://your-domain.com/privacy" }
调整交易的
validUntil时间
你当前设置的是Math.floor(Date.now() / 1000) + 360(6分钟后过期),虽然理论上足够,但移动端网络可能有延迟,建议延长到30分钟(1800秒),避免请求还没到用户手里就过期了:validUntil: Math.floor(Date.now() / 1000) + 1800,简化交易发送代码
去掉多余的AJAX请求(如果需要记录交易,可以在sendTransaction成功后再处理),只保留最核心的交易构造和发送逻辑:
修改后的完整核心代码示例
const tonConnectUI = new TON_CONNECT_UI.TonConnectUI({ manifestUrl: 'https://example.com/tonconnect-manifest.json', buttonRootId: 'ton-connect' }); async function initiateTransaction(amount) { const recipientAddress = 'UQDVqo3lguMUvPwdD6xk7lMz3g_cHFFMhnEO6hI1n2XXLt0I'; const transaction = { validUntil: Math.floor(Date.now() / 1000) + 1800, // 延长到30分钟过期 messages: [ { address: recipientAddress, amount: (amount * 1000000000).toString() // 转换为nanoton,格式正确 } ] }; try { // 直接发送交易请求,剩下的交给钱包处理 const result = await tonConnectUI.sendTransaction(transaction, { modals: ['before', 'success', 'error'], notifications: ['before', 'success', 'error'] }); console.log('Транзакция отправлена', result); if (result.success) { console.log('Транзакция успешно выполнена'); alert('Транзакция успешно отправлена'); // 这里可以添加你的AJAX请求,记录交易信息 // $.ajax({...}); } else { console.error('Транзакция не удалась', result.errorMessage); alert('Ошибка отправки транзакции: ' + result.errorMessage); } } catch (error) { console.error('Ошибка при отправке транзакции', error); alert('Ошибка отправки транзакции: ' + error.message); } }
最后再排查几个细节
- 确保用户的Tonkeeper是最新版本,旧版本可能存在兼容性问题
- 测试时用真实的公网域名,不要用本地环境(移动端钱包无法访问localhost)
- 检查交易的
amount是否为有效数字,避免传入非数字值导致格式错误
按照这个思路调整后,移动端的交易请求应该就能正常显示,不会再闪退了!
备注:内容来源于stack exchange,提问作者Rare
相关产品推荐
相关产品推荐

