PAYATHON 2026

支付宝鸿蒙SDK是否支持调起支付宝小程序支付?

支付阿杰

结论

支付宝鸿蒙 SDK 提供的通常是原生 App 支付能力,并非“支付宝小程序支付 SDK”。如果需要从鸿蒙应用进入支付宝小程序完成支付,可以按以下流程实现:

  1. 鸿蒙应用通过支付宝支持的 URL Scheme 或开放能力打开指定的支付宝小程序。
  2. 小程序向业务服务端获取支付宝交易号。
  3. 小程序调用 my.tradePay 发起支付。
  4. 业务服务端根据支付宝异步通知确认最终支付结果。

能否落地不只取决于鸿蒙 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. 服务端确认支付结果

小程序收到成功回调,只能说明客户端支付流程返回了成功结果,不能直接据此发货、充值或开通服务。

服务端还要完成以下处理:

  1. 接收支付宝异步通知。
  2. 验证通知签名。
  3. 校验商户号、应用 ID、订单号、金额和币种。
  4. 幂等更新订单状态。
  5. 必要时主动查询支付宝交易状态。
  6. 将最终状态返回给小程序或鸿蒙应用。

支付完成后,用户可能继续停留在支付宝小程序中,也可能手动返回鸿蒙应用。因此,鸿蒙应用重新进入前台时,也应向服务端查询订单状态,不能只依赖跨应用跳转的返回值。

注意事项

鸿蒙 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 方案。

备注:内容仅供参考。