Tonconnect/react-ui通过Tonkeeper移动端发送交易失败求助
问题:TonConnect React UI 移动端Tonkeeper发送交易报Bad Request错误
现象
通过TonConnect React UI实现交易发送功能,桌面端Tonkeeper连接钱包后交易发送正常;但使用移动端Tonkeeper连接后,发送交易时抛出Bad request错误。
错误信息
TonComponent.jsx:35 Transaction error: Error: Bad request at SendTransactionParser.parseAndThrowError (@tonconnect_ui-react…?v=021f6157:4172:11) at TonConnect.<anonymous> (@tonconnect_ui-react…?v=021f6157:6244:38) at Generator.next (<anonymous>) at fulfilled (@tonconnect_ui-react…?v=021f6157:3976:24) handleClick @ TonComponent.jsx:35
当前组件代码
const TonComponent = observer(({ title }) => { const wallet = useTonWallet(); const [tonConnectUI, setOptions] = useTonConnectUI(); const { amount } = ModalStore; const transaction = { // validUntil: validUntil, messages: [ { address: "UQCXWm9dAZD6bzyiPMLjTLSnfrk0nej38XmnZYVVm2exEmK3", amount: '500000', // payload: UserStore.id } ] } console.log('Transaction:', transaction); const handleClick = async () => { try { await tonConnectUI.sendTransaction(transaction); console.log('Transaction sent successfully'); } catch (err) { console.error('Transaction error:', err); } }; return wallet ? ( <Button variant={'contained'} color={'success'} onClick={handleClick}> {title} </Button> ) : ( <TonConnectButton /> ); }); export default TonComponent;
已尝试方案
添加validUntil参数,但问题未解决:
const validUntil = Math.floor(Number(new Date()) / 1000) + 360;
解决建议
校验目标地址格式
移动端Tonkeeper对地址格式校验更严格,建议使用@ton/core的Address类标准化地址,避免格式问题:import { Address } from '@ton/core'; // 修改transaction中的address字段 address: Address.parse("UQCXWm9dAZD6bzyiPMLjTLSnfrk0nej38XmnZYVVm2exEmK3").toString({ testOnly: false }),注意根据你的网络环境(主网/测试网)调整
testOnly参数。完善交易参数完整性
确保amount是纯数字字符串(无空格、非空),如果目标合约是新部署的,显式添加stateInit字段;同时确认validUntil的时间戳足够大(建议设置为当前时间+1800秒,即30分钟,避免移动端操作超时)。更新TonConnect UI版本
旧版本的@tonconnect/ui-react可能和移动端Tonkeeper的协议不兼容,执行命令更新到最新稳定版:npm install @tonconnect/ui-react@latest调试交易请求
在sendTransaction前打印完整交易对象,对比桌面端和移动端的请求差异;也可以查看TonConnect的调试日志,确认发送给钱包的payload是否符合TON Connect协议规范。处理payload(若需)
如果交易需要携带payload,确保它是正确的Base64编码或十六进制字符串,移动端钱包对无效payload的容错率更低。
内容的提问来源于stack exchange,提问作者OnionMosquito
相关产品推荐
相关产品推荐

