支付宝鸿蒙SDK是否支持调起支付宝小程序支付?
结论
支付宝鸿蒙 SDK 提供的通常是原生 App 支付能力,并非“支付宝小程序支付 SDK”。如果需要从鸿蒙应用进入支付宝小程序完成支付,可以按以下流程实现:
- 鸿蒙应用通过支付宝支持的 URL Scheme 或开放能力打开指定的支付宝小程序。
- 小程序向业务服务端获取支付宝交易号。
- 小程序调用
my.tradePay发起支付。 - 业务服务端根据支付宝异步通知确认最终支付结果。
能否落地不只取决于鸿蒙 SDK,还要确认支付宝客户端是否支持相应的小程序跳转方式,以及应用、小程序和支付产品是否已完成签约与配置。具体支持范围以当前支付宝开放平台和鸿蒙 SDK 官方文档为准。
实现流程
1. 服务端创建支付宝交易
支付宝应用私钥不能保存在鸿蒙客户端或支付宝小程序中。创建订单、参数签名和验签都应由业务服务端完成。
服务端创建交易后,向客户端返回业务订单号和支付宝交易号,例如:
{
"orderNo": "ORDER_202609090001",
"tradeNo": "2026090922000000000000000000"
}
这里的 tradeNo 只是格式示例,不是真实交易数据。
2. 鸿蒙应用调起支付宝小程序
如果支付宝当前仍支持通过 Scheme 打开小程序,可以构造类似下面的地址:
alipays://platformapi/startapp?appId=支付宝小程序APPID&page=pages%2Fcashier%2Findex&query=orderNo%3DORDER_202609090001
参数含义如下:
appId:目标支付宝小程序的 App ID。page:需要打开的小程序页面路径,需进行 URL 编码。query:传给小程序页面的业务参数,也需进行 URL 编码。
鸿蒙应用可以使用系统提供的外部链接打开能力发起跳转。下面是一个 ArkTS 结构示例:
import { common, Want } from '@kit.AbilityKit';
async function openAlipayMiniProgram(context: common.UIAbilityContext): Promise<void> {
const miniProgramAppId = 'YOUR_ALIPAY_MINI_PROGRAM_APP_ID';
const page = encodeURIComponent('pages/cashier/index');
const query = encodeURIComponent('orderNo=ORDER_202609090001');
const uri =
`alipays://platformapi/startapp?appId=${miniProgramAppId}` +
`&page=${page}&query=${query}`;
const want: Want = {
action: 'ohos.want.action.viewData',
uri
};
await context.startAbility(want);
}
不同 HarmonyOS API 版本在外部 URI 的打开方式、权限配置和异常处理上可能有所不同。这段代码主要用于说明参数如何组织以及如何发起调用,实际项目应以所用 API Level 对应的 HarmonyOS 文档为准。
传给小程序的参数最好只包含 orderNo、一次性令牌等业务标识,不要直接传递金额、收款账号或可信支付状态。
3. 小程序查询订单并发起支付
支付宝小程序进入收银台页面后,根据 orderNo 向业务服务端查询订单。服务端验证当前用户和订单状态,再返回支付所需的 tradeNo。
Page({
onLoad(query) {
const orderNo = query.orderNo;
if (!orderNo) {
my.alert({
title: '无法支付',
content: '缺少订单号'
});
return;
}
this.loadTradeAndPay(orderNo);
},
loadTradeAndPay(orderNo) {
my.request({
url: 'https://api.example.com/payment/alipay/trade',
method: 'POST',
data: {
orderNo
},
success: (response) => {
const tradeNo = response.data && response.data.tradeNo;
if (!tradeNo) {
my.alert({
title: '无法支付',
content: '未取得支付宝交易号'
});
return;
}
this.startPayment(tradeNo);
},
fail: () => {
my.alert({
title: '请求失败',
content: '暂时无法获取支付信息'
});
}
});
},
startPayment(tradeNo) {
my.tradePay({
tradeNO: tradeNo,
success: (result) => {
// 此处只能作为交互结果,不能作为最终入账依据
this.queryPaymentResult();
},
fail: () => {
// 用户取消、网络异常或支付失败都可能进入这里
this.queryPaymentResult();
}
});
},
queryPaymentResult() {
// 向业务服务端查询订单最终状态
}
});
my.tradePay 的参数形式可能随接入的支付宝支付产品而变化。例如,部分场景使用 tradeNO,其他场景可能需要不同的订单参数。接入时应参照实际签约产品对应的支付宝小程序支付文档,不能混用 App 支付和小程序支付的订单参数。
4. 服务端确认支付结果
小程序收到成功回调,只能说明客户端支付流程返回了成功结果,不能直接据此发货、充值或开通服务。
服务端还要完成以下处理:
- 接收支付宝异步通知。
- 验证通知签名。
- 校验商户号、应用 ID、订单号、金额和币种。
- 幂等更新订单状态。
- 必要时主动查询支付宝交易状态。
- 将最终状态返回给小程序或鸿蒙应用。
支付完成后,用户可能继续停留在支付宝小程序中,也可能手动返回鸿蒙应用。因此,鸿蒙应用重新进入前台时,也应向服务端查询订单状态,不能只依赖跨应用跳转的返回值。
注意事项
鸿蒙 SDK 与小程序支付属于不同链路
鸿蒙 SDK 的 App 支付接口通常用于鸿蒙原生应用直接发起支付宝支付。跳转至支付宝小程序后调用 my.tradePay,走的是支付宝小程序支付链路。两者的产品签约、订单创建接口和客户端参数可能不同,不能直接将 App 支付的订单字符串传给 my.tradePay。
不要把支付凭据放入 Scheme
Scheme 参数可能被日志、系统组件或其他应用观察到,不能包含私钥、签名密钥、完整支付参数或长期有效的登录凭证。更稳妥的方式是只携带随机的一次性令牌,再由小程序向服务端换取订单信息。
处理未安装支付宝的情况
调起前后都应处理异常。支付宝未安装、Scheme 未注册、目标小程序不存在、页面路径错误或客户端版本不兼容,都可能造成跳转失败。遇到这些情况,可以提示用户安装或升级支付宝,也可以提供业务允许的其他支付入口。
返回原应用需要单独设计
“鸿蒙应用打开支付宝小程序”并不意味着支付结束后一定会自动返回原应用。如果业务需要回跳,应先确认支付宝小程序能否打开对应的鸿蒙应用链接,再按照支付宝和 HarmonyOS 当前支持的应用链接机制进行配置。即使已经配置回跳,订单状态仍须由服务端确认。
上线前核对官方支持范围
URL Scheme、可传递的参数、小程序支付产品和鸿蒙外部链接策略都可能发生调整。上线前应重点核对:
- 当前支付宝鸿蒙 SDK 是否提供直接打开小程序的正式 API。
alipays://platformapi/startapp在目标支付宝版本上的支持情况。- 小程序是否具备支付权限并已完成相应的产品签约。
my.tradePay所需的准确参数。- HarmonyOS 应用对外部 URI 的配置要求。
如果官方 SDK 已提供专门的小程序跳转接口,应优先使用。只有在官方明确支持 Scheme 调起的情况下,才建议在生产环境中采用 Scheme 方案。
备注:内容仅供参考。
