Skip to content

Alipay ​

Alipay 把服务端签好的 App 支付串交给底座里的支付宝 SDK(PayTask.payV2),拉起支付宝 App 完成付款。页面脚本和任务脚本都能用。

不要对 Alipay 使用 typeof(Rhino 对 Java 注入对象会报「JavaScript 值无效」)。直接调用方法,用 try/catch 兜底。

扫码、H5 网页支付不要走本模块:扫码把后端返回的 qrCode 字符串交给 QrCode 生成本地图再展示;H5 用 App.openUrl(payUrl)。本模块只处理 App 支付 的 orderString。

javascript
let r = Alipay.pay(orderString);
if (r && r.ok) {
    console.log('SDK 侧支付成功');
}
方法作用
pay(orderString)同步调起支付宝,等待用户完成或取消
payV2(orderString)同 pay
isSuccess(payResult)判断是否 resultStatus === "9000"

何时用 / 何时不用 ​

场景用法
自有后端已按支付宝「APP 支付」签好单Alipay.pay(payParams.orderString)
只要用户扫码付款展示二维码即可,不用本 API
打开手机网站支付链接App.openUrl(payUrl),不用本 API
未拿到 orderString先调自己的下单接口,不要伪造支付串

对接顺序 ​

  1. 服务端创建订单,调用支付宝 alipay.trade.app.pay,把签名后的整串作为 orderString 返回客户端。
  2. 客户端 Alipay.pay(orderString);方法会阻塞直到收银台结束。
  3. 看返回的 resultStatus:9000 表示 SDK 侧成功。
  4. 以服务端为准:再轮询自己的订单查询 / 激活接口,确认到账后再开通权益。不要只信客户端 9000。

pay(orderString) ​

参数:

  • orderString {string} 服务端返回的支付宝 App 支付串(整段 query,含 app_id、biz_content、sign 等)

返回: {object}

字段类型说明
okboolean是否成功(等价于 resultStatus === "9000")
resultStatusstring支付宝状态码,成功为 9000
memostring说明文案(取消、失败时常见)
resultstringSDK 原始 result 字段

需要当前有可用 Activity。支付过程会拉起支付宝 App;用户停留可能较久,调用方应做好加载提示。

javascript
this.showLoading('正在调起支付宝…');
let payResult = null;
try {
    payResult = Alipay.pay(String(orderString));
} catch (e) {
    this.hideLoading();
    this.toast((e && e.message) || '调起失败');
    return;
}
this.hideLoading();

if (payResult && payResult.ok) {
    this.toast('支付完成,正在确认…');
    // 再请求服务端查询订单 / 激活
} else {
    let memo = payResult && payResult.memo ? String(payResult.memo) : '';
    this.toast(memo || '支付未完成');
}

常见 resultStatus(以支付宝 SDK 为准):

值含义
9000订单支付成功
8000正在处理中
4000订单支付失败
5000重复请求
6001用户中途取消
6002网络连接出错

payV2(orderString) ​

参数: 同 pay

返回: 同 pay

与 pay 相同,命名对齐支付宝 SDK 的 payV2。

isSuccess(payResult) ​

参数:

  • payResult {object} pay / payV2 的返回值

返回: {boolean} true 表示 ok === true 或 resultStatus === "9000"

javascript
let r = Alipay.pay(orderString);
if (Alipay.isSuccess(r)) {
    console.log('支付成功');
}

完整示例(页面下单后调起) ​

下面假设后端 POST /api/v1/app/orders 在 payParams.orderString 返回支付串(字段名以你的后端为准):

javascript
Page({
  data: {
    paying: false
  },
  onPayApp() {
    if (this.data.paying) {
      return;
    }
    this.setData({ paying: true });
    this.showLoading('下单中…');

    let res = Http.post('https://example.com/api/v1/app/orders', {
      code: 'D0001',
      plan: 'month',
      device_id: Device.getAndroidId(),
      pay_method: 'alipay',
      channel: 'app'
    });

    this.hideLoading();
    if (!res || !res.data || !res.data.payParams || !res.data.payParams.orderString) {
      this.setData({ paying: false });
      this.toast((res && res.message) || '下单失败');
      return;
    }

    let orderNo = res.data.orderNo || '';
    let orderString = String(res.data.payParams.orderString);

    this.showLoading('正在调起支付宝…');
    let payResult = null;
    try {
      payResult = Alipay.pay(orderString);
    } catch (e) {
      this.hideLoading();
      this.setData({ paying: false });
      this.toast((e && e.message) || '调起支付宝失败');
      return;
    }
    this.hideLoading();
    this.setData({ paying: false });

    // 无论 SDK 结果如何,都建议向服务端确认(异步通知可能已到账)
    this.pollOrder(orderNo);

    if (Alipay.isSuccess(payResult) || (payResult && payResult.ok)) {
      this.toast('支付完成,正在确认开通…');
    } else {
      let memo = payResult && payResult.memo ? String(payResult.memo) : '';
      this.toast(memo || '支付未完成');
    }
  },
  pollOrder(orderNo) {
    // 轮询 GET /orders/{orderNo} 直到 status === 'paid',再调激活接口
  }
});

在 DeekeScript Pro → 示例 → 接口 → 支付宝 Alipay 可粘贴支付串点测调起。源码:deekeScriptV2Demo 的 pages/apiAlipay。

注意 ​

  • 支付串必须由服务端用应用私钥签名,客户端不要存私钥、不要自己拼 sign。
  • 空串会返回失败结果(memo 为「支付串为空」),不会调起支付宝。
  • 无前台 Activity 时无法调起(例如纯后台线程且没有当前页)。
  • 业务开通、会员到期以服务端订单状态 / 异步通知为准。

相关 ​