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 | 先调自己的下单接口,不要伪造支付串 |
对接顺序
- 服务端创建订单,调用支付宝
alipay.trade.app.pay,把签名后的整串作为orderString返回客户端。 - 客户端
Alipay.pay(orderString);方法会阻塞直到收银台结束。 - 看返回的
resultStatus:9000表示 SDK 侧成功。 - 以服务端为准:再轮询自己的订单查询 / 激活接口,确认到账后再开通权益。不要只信客户端
9000。
pay(orderString)
参数:
orderString {string}服务端返回的支付宝 App 支付串(整段 query,含app_id、biz_content、sign等)
返回: {object}
| 字段 | 类型 | 说明 |
|---|---|---|
ok | boolean | 是否成功(等价于 resultStatus === "9000") |
resultStatus | string | 支付宝状态码,成功为 9000 |
memo | string | 说明文案(取消、失败时常见) |
result | string | SDK 原始 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 时无法调起(例如纯后台线程且没有当前页)。
- 业务开通、会员到期以服务端订单状态 / 异步通知为准。
相关
- 二维码 QrCode — 当面付
qrCode生成本地图 - App —
openUrl打开 H5 支付链接 - Http — 下单与查单
- 设备 Device — 设备标识(下单常用)
