You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TonConnect移动端钱包(如Tonkeeper)交易请求闪退问题求助

TonConnect移动端钱包(如Tonkeeper)交易请求闪退问题求助

兄弟,我仔细看了你的问题和代码,发现几个核心问题导致移动端Tonkeeper的交易请求一闪而过,咱们一步步梳理解决:

首先,你的代码里存在一个严重的误解:TonConnect不需要你自己处理签名!

TonConnect的核心逻辑就是由用户的钱包(比如Tonkeeper)托管私钥并完成签名,前端只需要构造正确的交易请求,剩下的验证、签名、广播全由钱包搞定。你代码里自己生成密钥对、硬编码私钥、创建wallet实例的操作完全是多余的,甚至可能干扰TonConnect的正常流程,这绝对是要删掉的!

分析移动端闪退的可能原因及解决方案

  1. 多余的签名逻辑干扰流程
    先把这些代码全部删掉:

    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的请求格式异常,被移动端钱包直接拒绝。

  2. 检查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"
      }
      
  3. 调整交易的validUntil时间
    你当前设置的是Math.floor(Date.now() / 1000) + 360(6分钟后过期),虽然理论上足够,但移动端网络可能有延迟,建议延长到30分钟(1800秒),避免请求还没到用户手里就过期了:

    validUntil: Math.floor(Date.now() / 1000) + 1800,
    
  4. 简化交易发送代码
    去掉多余的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 15:55:27