PAYATHON 2026

鸿蒙 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,可按以下流程接入:

  1. 在支付宝开放平台创建应用,并开通相应的支付产品。
  2. 配置应用公钥、支付宝公钥、签名方式和回调地址。
  3. 下载明确标注支持 HarmonyOS 的 SDK。
  4. 核对 SDK 的最低 API Level、设备类型和应用模型要求。
  5. 按照官方说明将 SDK 加入工程,并声明所需权限。
  6. 客户端向业务服务端申请支付订单。
  7. 服务端使用应用私钥签名,生成支付参数。
  8. ArkTS 客户端调用 SDK 发起支付。
  9. 客户端展示支付结果,服务端则根据支付宝异步通知确认订单的最终状态。

具体的类名、方法名和参数应以实际取得的 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
  };
}

收到支付宝异步通知后,服务端至少要完成以下处理:

  1. 验证通知签名。
  2. 核对商户应用标识和交易号。
  3. 核对订单金额、币种和商户订单号。
  4. 确认交易状态符合业务要求。
  5. 以幂等方式更新订单,避免重复发货。
  6. 按支付宝协议返回通知处理结果。

支付结果不能只信任客户端

无论客户端收到“支付成功”,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 支付。

备注:内容仅供参考。