iOS中AlipayJSBridge.call支付成功后不执行回调
支付老李
结论
iOS 和安卓返回的 resultCode 类型可能不同。安卓通常返回字符串 '9000',部分 iOS 环境则可能返回数字 9000。如果使用严格比较:
res.resultCode === '9000'
即使支付成功,也可能无法进入成功分支。
建议先统一类型:
const resultCode = String(res.resultCode);
然后再判断是否等于 '9000'。需要注意,客户端回调只能用于交互提示。最终支付结果应由服务端查询订单状态,或通过支付宝异步通知确认。
兼容写法
AlipayJSBridge.call(
'tradePay',
{
tradeNO: id
},
function (res) {
const resultCode = String(res && res.resultCode);
if (resultCode === '9000') {
// 建议先向业务服务器查询订单的真实支付状态
checkOrderStatus(id);
} else if (resultCode === '6001') {
// 用户取消或支付未完成
return;
} else {
uni.showToast({
title: `${(res && res.memo) || '支付未完成'}.[${resultCode}]`,
duration: 2000,
icon: 'none'
});
}
}
);
function checkOrderStatus(orderId) {
uni.request({
url: '/api/order/pay-status',
method: 'GET',
data: {
orderId
},
success: function (response) {
// 字段需要根据实际接口调整
if (response.data && response.data.paid === true) {
uni.showModal({
content: '支付成功',
showCancel: false,
confirmText: '确定',
confirmColor: '#000',
success: function (modalResult) {
if (modalResult.confirm) {
uni.switchTab({
url: '/pages/order/order'
});
}
}
});
} else {
uni.showToast({
title: '支付结果确认中,请稍后查看订单',
duration: 2000,
icon: 'none'
});
}
},
fail: function () {
uni.showToast({
title: '支付结果查询失败,请稍后查看订单',
duration: 2000,
icon: 'none'
});
}
});
}
也可以使用宽松比较:
if (res.resultCode == 9000) {
// 支付成功
}
不过,显式转换类型更清楚,遇到异常返回值时也更容易排查:
if (String(res.resultCode) === '9000') {
// 支付成功
}
如果回调函数确实完全没有执行
先在回调入口打印完整结果,确认是没有触发回调,还是触发后没有进入成功分支:
AlipayJSBridge.call('tradePay', { tradeNO: id }, function (res) {
console.log('tradePay callback:', JSON.stringify(res));
});
如果日志完全没有出现,只修改 resultCode 的判断方式并不能解决问题。此时还需要在页面恢复后查询订单状态。用户从支付页面返回时,可以在页面的 onShow 中向服务端查询:
export default {
data() {
return {
payingOrderId: ''
};
},
onShow() {
if (this.payingOrderId) {
this.queryPayStatus(this.payingOrderId);
}
},
methods: {
startPay(orderId, tradeNO) {
this.payingOrderId = orderId;
AlipayJSBridge.call(
'tradePay',
{ tradeNO },
(res) => {
const resultCode = String(res && res.resultCode);
if (resultCode === '9000') {
this.queryPayStatus(orderId);
} else if (resultCode !== '6001') {
uni.showToast({
title: `${(res && res.memo) || '支付未完成'}.[${resultCode}]`,
icon: 'none'
});
}
}
);
},
queryPayStatus(orderId) {
// 调用业务服务器接口查询订单状态
}
}
};
调用 API 前,还要确认 Bridge 已完成初始化:
function ready(callback) {
if (window.AlipayJSBridge) {
callback();
} else {
document.addEventListener('AlipayJSBridgeReady', callback, false);
}
}
ready(function () {
AlipayJSBridge.call('tradePay', {
tradeNO: id
}, function (res) {
const resultCode = String(res && res.resultCode);
console.log('tradePay result:', res);
// 根据 resultCode 更新页面,并向服务端确认订单状态
});
});
注意事项
- 不要直接判断
res.resultCode === '9000',应先用String()统一类型。 - 前端返回的
9000不能作为最终到账凭证。回调可能丢失或延迟,也可能因页面切换而没有执行。 - 服务端应处理支付宝异步通知,并根据实际接入方式验证签名、订单号、金额和商户信息。
- 用户返回页面后,应主动查询服务端订单状态,以应对 iOS 回调缺失的情况。
- 在订单状态尚未确认时,不要重复创建支付订单。重新支付前应先查询原订单,避免重复付款。
res.memo不一定存在,展示错误信息时需要提供默认文案。- 如果统一类型后仍然完全收不到回调,应结合支付宝客户端版本、容器环境和调用时机继续排查,不能直接认定 iOS 不支持
9000。
备注:内容仅供参考。
