PAYATHON 2026

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。

备注:内容仅供参考。