支付宝支付是否计划适配鸿蒙 ArkTS
明确结论
根据现有参考信息,目前无法确认支付宝是否已经公布鸿蒙 ArkTS 原生支付 SDK 的适配计划,也无法确认发布时间和具体支持范围。在支付宝开放平台发布正式公告、SDK 文档或接入指南前,不能把“计划适配”当作确定消息。
如果应用运行在 HarmonyOS NEXT 等无法直接使用 Android SDK 的环境中,可以根据业务需求考虑以下方案:
- 优先评估支付宝的网页支付能力,使用 ArkTS 的
Web组件承载收银台。 - 由服务端创建支付订单,鸿蒙应用负责打开支付页面并展示支付结果。
- 如果必须获得与 Android/iOS App 支付 SDK 相同的原生体验,需要等待支付宝发布正式的 HarmonyOS SDK,或者向支付宝开放平台确认是否支持定向合作。
为什么不能直接复用 Android 支付 SDK
ArkTS 应用无法直接引入支付宝 Android SDK 的 AAR、Java 类或 Android Activity 调用代码。ArkTS 与 Android 在运行环境、应用生命周期、包管理机制和客户端唤起方式上都不相同。
要实现原生适配,通常需要支付宝提供以下配套能力:
- 面向 HarmonyOS 的客户端 SDK 或 HAR 包。
- ArkTS 调用接口和返回结果定义。
- 支付宝客户端的 URI、Link 或其他唤起协议。
- 应用签名、包名和回跳配置说明。
- 支付成功、取消、失败及客户端未安装等场景的处理规范。
- 示例工程、兼容版本和安全接入文档。
在这些内容正式发布前,自行封装 Android SDK 仍然无法解决 HarmonyOS NEXT 的兼容问题。
当前可行的接入思路
方案一:使用网页支付收银台
网页支付较容易与 ArkTS 应用解耦,流程如下:
- ArkTS 应用向业务服务端提交订单号。
- 服务端校验订单金额、商品信息和登录状态。
- 服务端调用支付宝网页支付接口创建交易。
- 服务端返回支付页面,或者返回可安全访问的收银台地址。
- ArkTS 应用通过
Web组件打开页面。 - 支付完成后,以支付宝异步通知和服务端主动查询的结果为准。
- ArkTS 应用重新查询业务订单状态并更新页面。
ArkTS 页面可以直接加载业务服务端提供的支付入口:
import { webview } from '@kit.ArkWeb';
@Entry
@Component
struct AlipayPage {
private controller: webview.WebviewController =
new webview.WebviewController();
build() {
Column() {
Web({
src: 'https://pay.example.com/alipay/cashier?orderNo=ORDER_202609090001',
controller: this.controller
})
.width('100%')
.height('100%')
}
}
}
URL 应指向业务服务端,不应由客户端自行拼接支付宝接口参数。服务端完成签名并生成支付宝要求的请求内容后,再把用户引导至收银台。
方案二:通过系统能力打开外部支付地址
如果支付流程需要跳转到外部浏览器,或者由系统匹配支付宝客户端,可以尝试使用 startAbility 打开服务端生成的地址:
import { common, Want } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
function openPayment(context: common.UIAbilityContext, paymentUrl: string): void {
const want: Want = {
action: 'ohos.want.action.viewData',
uri: paymentUrl
};
context.startAbility(want).catch((error: BusinessError) => {
console.error(`Failed to open payment page: ${error.code}, ${error.message}`);
});
}
这种方式能否直接唤起支付宝,取决于支付宝客户端、HarmonyOS 系统版本以及目标地址支持的协议。不要猜测或硬编码未公开的 URI Scheme,应以支付宝正式文档中的地址和调用规则为准。
服务端处理示例
支付参数签名、私钥和支付宝接口调用都必须放在服务端。下面的代码只用于说明职责如何划分,不对应支付宝 SDK 的某个固定方法或版本:
app.post('/api/orders/:orderNo/alipay', async (req, res) => {
const order = await orderService.findByOrderNo(req.params.orderNo);
if (!order || order.userId !== req.user.id) {
return res.status(404).json({ message: '订单不存在' });
}
if (order.status !== 'UNPAID') {
return res.status(409).json({ message: '订单状态不允许支付' });
}
const cashier = await alipayService.createWebPayment({
outTradeNo: order.orderNo,
subject: order.subject,
totalAmount: order.amount,
notifyUrl: 'https://api.example.com/payment/alipay/notify',
returnUrl: 'https://pay.example.com/payment/result'
});
res.json({
cashierUrl: cashier.url
});
});
实际使用的请求字段、签名算法和接口名称,必须以支付宝开放平台当前文档为准。示例中的 createWebPayment 不是支付宝官方 API。
支付结果的正确判断方式
客户端发生回跳,只能说明用户回到了应用或结果页面,不能据此认定支付成功。支付结果应按以下流程处理:
- 服务端接收支付宝异步通知。
- 验证通知签名。
- 校验商户号、订单号、金额、币种和交易状态。
- 以幂等方式更新业务订单。
- ArkTS 客户端调用业务订单查询接口,获取最终状态。
客户端查询示例:
type OrderStatus = 'UNPAID' | 'PAYING' | 'PAID' | 'CLOSED';
interface PaymentResult {
orderNo: string;
status: OrderStatus;
}
async function queryPaymentResult(orderNo: string): Promise<PaymentResult> {
const response = await fetch(
`https://api.example.com/api/orders/${encodeURIComponent(orderNo)}/status`
);
if (!response.ok) {
throw new Error(`Query failed: HTTP ${response.status}`);
}
return await response.json() as PaymentResult;
}
注意事项
- 不要在 ArkTS 客户端保存支付宝应用私钥、签名密钥或完整商户凭证。
- 不要只根据前端 URL、回跳参数或 Web 页面提示,把订单状态更新为已支付。
Web组件能否正常拉起支付宝客户端,需要使用目标 HarmonyOS 设备和支付宝客户端版本实际验证。- 应为支付宝未安装、用户取消、网络中断、重复支付和回跳失败等情况准备兜底流程。
- 网页支付与 App 支付的产品开通条件、接口约束和用户体验可能不同。接入前,应在支付宝开放平台确认商户是否具备相应权限。
- 如果应用要求纯原生 ArkTS 调用、明确的客户端回调和统一的沙箱测试能力,应直接向支付宝开放平台技术支持确认 HarmonyOS SDK 的发布计划。在获得正式回复前,无法确定可靠的上线时间或具体 SDK 形态。
备注:内容仅供参考。
