PAYATHON 2026

uniapp调用uni.requestPayment提示支付宝62001如何解决?

支付阿杰

结论

[payment支付宝:62001]用户中途取消支付操作 表示支付宝支付流程在客户端被取消或中断,不代表 orderStr 参数有误。

如果问题只在支付宝已经登录时出现,先检查当前登录的账号。常见原因是买家账号与商户签约或收款账号相同,或者该账号受到支付宝的账户、设备或风控限制。支付宝未安装或未登录时能够打开支付页面,只能证明页面唤起正常,不能证明最终使用的是同一个账号,也不能证明走的是同一条客户端支付链路。

优先排查支付宝账号

在同一台手机上退出当前支付宝账号,换一个正常的个人支付宝账号登录,再重新支付。

需要确认:

  • 当前买家账号是否为商户签约或收款账号。
  • 登录不同的支付宝账号后,支付结果是否不同。
  • 同一个账号换一台手机后能否支付。
  • 该账号是否出现实名认证、支付权限、设备安全或风控提示。

如果只有某个账号失败,其他账号都能正常唤起并完成支付,问题通常出在支付宝账号或风控侧,无需继续修改 uni.requestPayment。

如果买家账号与卖家账号相同,请换一个独立的测试买家账号。不要用商户收款账号为自己创建的订单付款。

确认 62001 出现在哪个阶段

先区分两种情况:

  1. 支付宝完全没有被唤起,客户端立即返回 62001。
  2. 支付宝已经被唤起,返回应用后报 62001。

第一种情况更可能与客户端环境、支付宝 SDK、应用打包配置或系统唤起链路有关。第二种情况则更可能与支付宝账号、风控、退出支付页面或支付结果回调中断有关。

记录日志时应保存完整的失败对象,不要只保存 errMsg:

uni.requestPayment({
  provider: 'alipay',
  orderInfo: orderStr,
  success(res) {
    console.log('支付宝支付调用成功:', JSON.stringify(res));
  },
  fail(err) {
    console.error('支付宝支付调用失败:', JSON.stringify(err));
  },
  complete(result) {
    console.log('支付宝支付调用结束:', JSON.stringify(result));
  }
});

日志还应包含:

  • 手机系统及版本。
  • 支付宝客户端版本。
  • uni-app/HBuilderX 版本,以及云打包或原生工程使用的版本。
  • 当前测试的是正式包、自定义基座还是标准基座。
  • 更换登录账号前后的测试结果。
  • 支付请求时间和商户订单号。

日志中不要输出私钥、完整签名材料或用户敏感信息。

检查客户端和打包环境

如果更换支付宝账号后仍然失败,按以下顺序排查:

  • 将支付宝升级到当前可用版本,退出账号后重新登录。
  • 清理支付宝缓存,必要时重新安装支付宝。
  • 检查手机中是否安装了支付宝分身、双开版本或第三方修改版。
  • 关闭可能拦截应用跳转的安全软件或系统限制。
  • 使用正式安装包测试,不要只在自定义基座中验证。
  • 重新制作自定义基座或重新云打包,确认已经包含支付模块。
  • 如果使用离线打包,检查支付宝支付 SDK 是否与当前 uni-app 原生 SDK 匹配。
  • 分别在 Android 和 iOS 真机上测试,判断问题是否只出现在特定系统或机型上。

如果只有某个旧安装包失败,重新打包后的版本可以正常支付,通常说明支付模块、原生 SDK 或打包环境不一致。

检查 orderStr 的传递方式

支付宝 App 支付所需的 orderStr 应由服务端按照支付宝的要求生成并签名,客户端只需将它原样传给 uni.requestPayment:

async function pay() {
  const response = await uni.request({
    url: 'https://example.com/api/payment/alipay/create',
    method: 'POST',
    data: {
      orderId: 'ORDER_202609090001'
    }
  });

  const orderStr = response.data.orderStr;

  if (typeof orderStr !== 'string' || !orderStr) {
    throw new Error('服务端未返回有效的支付宝 orderStr');
  }

  uni.requestPayment({
    provider: 'alipay',
    orderInfo: orderStr,
    success() {
      // 这里只表示客户端支付流程返回成功。
      // 最终结果仍需向服务端查询。
      queryOrderStatus();
    },
    fail(err) {
      console.error('requestPayment fail:', err);
      queryOrderStatus();
    }
  });
}

不要在客户端对 orderStr 做以下处理:

// 不建议
orderInfo: encodeURIComponent(orderStr)

// 不建议
orderInfo: JSON.parse(orderStr)

// 不建议
orderInfo: orderStr.replace(/\+/g, ' ')

即使自查工具验证通过,也要检查 orderStr 从服务端响应到传入 API 的整个过程,确认其中没有发生 URL 解码、字符替换、内容截断或重复编码。

不要仅依据客户端回调判断订单结果

62001 只说明客户端支付流程被取消或中断,不能据此断定订单一定没有支付。客户端收到失败回调后,服务端仍应主动查询支付宝交易状态,或者等待并验证支付宝的异步通知。

订单处理应以服务端查询结果为准:

async function queryOrderStatus() {
  const response = await uni.request({
    url: 'https://example.com/api/payment/order/status',
    method: 'GET',
    data: {
      orderId: 'ORDER_202609090001'
    }
  });

  if (response.data.status === 'PAID') {
    uni.showToast({
      title: '支付成功',
      icon: 'success'
    });
  }
}

支付过程中还要避免重复调用 uni.requestPayment。应为支付按钮增加防重复提交控制,否则两个支付流程可能互相覆盖,或被客户端判定为取消:

let paying = false;

async function startPay(orderStr) {
  if (paying) return;

  paying = true;

  try {
    await new Promise((resolve, reject) => {
      uni.requestPayment({
        provider: 'alipay',
        orderInfo: orderStr,
        success: resolve,
        fail: reject
      });
    });
  } finally {
    paying = false;
  }
}

仍无法解决时如何定位

如果出现以下情况:

  • 多个不同的支付宝账号都能稳定复现问题。
  • orderStr 由服务端生成,并在客户端保持原样。
  • 服务端订单和签名检查正常。
  • 使用正式安装包、最新版支付宝和不同设备测试时都无法支付。

此时无法仅凭 62001 判断具体原因。请保存商户订单号、发生时间、支付宝客户端版本、手机型号、完整失败对象和原生运行日志,并分别提交给支付宝技术支持和 DCloud 支持排查。

建议先更换登录账号,再检查正式安装包和支付 SDK,然后检查 orderStr 的传递过程,最后结合支付宝服务端交易查询结果和原生日志定位问题。

备注:内容仅供参考。