鸿蒙 ArkTS API 9 能否接入支付宝 SDK 实现支付功能?
结论
鸿蒙 ArkTS API 9 应用不能直接接入 Android 版支付宝 SDK,例如 .aar 文件。Android SDK 依赖 Android Runtime、Activity、Intent 等机制,无法在 ArkTS/HAP 工程中运行。
能否接入支付宝支付,要看支付宝是否提供兼容 HarmonyOS API 9、目标设备系统及当前应用模型的原生 SDK:
- 如果有兼容的 HarmonyOS SDK,可按照对应文档接入。
- 如果 SDK 要求更高的 HarmonyOS API 版本,API 9 项目需要先升级。
- 如果没有兼容的 SDK,可以考虑支付宝手机网站支付等 H5 方案。交易由服务端创建,客户端负责打开支付页面。
- 不要自行封装 Android SDK,也不能通过修改文件后缀把
.aar转成 HarmonyOS 可用的依赖。
为什么 Android 支付宝 SDK 不能直接使用
ArkTS 应用通常打包为 HAP。第三方原生能力需要以 HarmonyOS 支持的 HAR、HSP、Native Library 或其他兼容形式提供。Android 支付宝 SDK 调用的是 Android 平台接口,与 HarmonyOS 在运行环境、生命周期和组件模型上并不兼容。
SDK 中带有 .so 文件,也不等于可以直接接入。还要满足以下条件:
.so包含目标设备所需的 ABI。- SDK 提供 HarmonyOS N-API 或 ArkTS 调用接口。
- SDK 不依赖 Android JNI、Activity、Context 等对象。
- SDK 的最低 API Level 不高于项目使用的 API 9。
- SDK 支持当前使用的 Stage 模型或相应应用模型。
因此,判断 SDK 是否可用,不能只看其中有没有原生库,应以支付宝发布的 HarmonyOS 接入说明和 SDK 元数据为准。
推荐实现方式
方案一:接入支付宝提供的 HarmonyOS SDK
如果支付宝开放平台提供兼容 API 9 的 SDK,可按以下流程接入:
- 在支付宝开放平台创建应用,并开通相应的支付产品。
- 配置应用公钥、支付宝公钥、签名方式和回调地址。
- 下载明确标注支持 HarmonyOS 的 SDK。
- 核对 SDK 的最低 API Level、设备类型和应用模型要求。
- 按照官方说明将 SDK 加入工程,并声明所需权限。
- 客户端向业务服务端申请支付订单。
- 服务端使用应用私钥签名,生成支付参数。
- ArkTS 客户端调用 SDK 发起支付。
- 客户端展示支付结果,服务端则根据支付宝异步通知确认订单的最终状态。
具体的类名、方法名和参数应以实际取得的 HarmonyOS SDK 文档为准,不能照搬 Android SDK 中的 PayTask 等接口。
方案二:使用 H5 支付
如果没有兼容 API 9 的原生 SDK,可以由服务端调用支付宝手机网站支付接口,把支付页面 URL 返回给客户端,再由 Web 组件或系统浏览器打开。
整体流程如下:
ArkTS 客户端
↓ 请求创建订单
业务服务端
↓ 调用支付宝支付接口并完成签名
支付宝
↓ 返回支付页面
客户端打开支付页面
↓ 用户完成支付
支付宝异步通知业务服务端
↓ 验签并更新订单
客户端查询订单最终状态
这种方式不依赖 Android SDK。是否适合目标应用及其上架渠道,还要结合支付宝产品规则、应用审核要求和用户体验进行评估。
ArkTS 客户端示例
下面的示例只负责从业务服务端获取支付 URL。支付宝签名和私钥操作必须放在服务端完成。
import http from '@ohos.net.http';
interface CreatePayResponse {
orderNo: string;
payUrl: string;
}
async function createPayOrder(productId: string): Promise<CreatePayResponse> {
const request = http.createHttp();
try {
const response = await request.request(
'https://api.example.com/pay/alipay/create',
{
method: http.RequestMethod.POST,
header: {
'Content-Type': 'application/json'
},
extraData: JSON.stringify({
productId: productId
}),
connectTimeout: 10000,
readTimeout: 10000
}
);
if (response.responseCode < 200 || response.responseCode >= 300) {
throw new Error(`Create order failed: ${response.responseCode}`);
}
const data = JSON.parse(String(response.result)) as CreatePayResponse;
if (!data.orderNo || !data.payUrl) {
throw new Error('Invalid payment response');
}
return data;
} finally {
request.destroy();
}
}
取得支付 URL 后,可以在页面中使用 Web 组件加载:
import webview from '@ohos.web.webview';
@Entry
@Component
struct AlipayWebPage {
private controller: webview.WebviewController =
new webview.WebviewController();
@State payUrl: string = 'https://example.com/payment-not-created';
build() {
Column() {
Web({
src: this.payUrl,
controller: this.controller
})
.javaScriptAccess(true)
.domStorageAccess(true)
.width('100%')
.height('100%')
}
}
}
实际项目还要处理返回页面、用户取消、页面加载失败和订单状态查询。Web 组件具体支持哪些能力和接口,应以项目使用的 API 9 SDK 为准。
服务端示意
服务端负责创建商户订单、调用支付宝接口并保存支付状态。下面只是逻辑示意,不代表支付宝某个具体 SDK 的真实方法名:
async function createAlipayOrder(userId: string, productId: string) {
const order = await createPendingOrder(userId, productId);
const payUrl = await alipayGateway.createWapPayment({
outTradeNo: order.orderNo,
subject: order.subject,
totalAmount: order.amount,
returnUrl: 'https://example.com/pay/return',
notifyUrl: 'https://example.com/pay/alipay/notify'
});
return {
orderNo: order.orderNo,
payUrl
};
}
收到支付宝异步通知后,服务端至少要完成以下处理:
- 验证通知签名。
- 核对商户应用标识和交易号。
- 核对订单金额、币种和商户订单号。
- 确认交易状态符合业务要求。
- 以幂等方式更新订单,避免重复发货。
- 按支付宝协议返回通知处理结果。
支付结果不能只信任客户端
无论客户端收到“支付成功”,Web 页面跳转到 returnUrl,还是从支付宝应用返回,都不能直接作为发货依据。客户端结果可能被伪造,也可能出现支付已经成功、页面却没有正常返回的情况。
可靠的处理方式是:
支付宝异步通知 + 服务端验签 + 服务端订单查询
从支付页面返回后,客户端应向业务服务端查询订单状态:
async function queryOrderStatus(orderNo: string): Promise<string> {
const request = http.createHttp();
try {
const response = await request.request(
`https://api.example.com/pay/orders/${encodeURIComponent(orderNo)}`,
{
method: http.RequestMethod.GET,
connectTimeout: 10000,
readTimeout: 10000
}
);
if (response.responseCode !== 200) {
throw new Error(`Query order failed: ${response.responseCode}`);
}
const data = JSON.parse(String(response.result)) as {
status: string
};
return data.status;
} finally {
request.destroy();
}
}
注意事项
- 不要把支付宝应用私钥、签名密钥或服务端 SDK 放入 HAP 包。
- 不要直接使用 Android SDK 的
.aar、PayTask或Activity示例代码。 - 支付金额、商品名称和商户订单号应由服务端生成或校验,不能完全信任客户端提交的数据。
notifyUrl必须是支付宝服务器可以访问的 HTTPS 地址,不能填写设备本地地址。- 服务端必须验证签名、金额、订单号和交易状态,并做好幂等处理。
- 需要分别测试支付成功、取消支付、重复通知、网络中断、页面关闭和支付后未返回等情况。
- 需要确认 Web 页面能否拉起支付宝客户端,以及目标设备未安装支付宝时如何降级处理。
- 上架前还要检查支付宝支付产品规则、HarmonyOS 应用市场审核要求和隐私合规要求。
- 如果官方 HarmonyOS SDK 的最低版本高于 API 9,稳妥的做法是升级项目 API 版本,不要绕过版本检查。
API 9 应用并非完全无法实现支付宝支付,但不能直接复用 Android 支付宝 SDK。应先确认是否有兼容 API 9 的官方 HarmonyOS SDK;如果没有,再考虑由服务端配合实现 H5 支付。
备注:内容仅供参考。
