鸿蒙基础建设之IAP支付接入

1,IAP简介

IAP Kit(华为应用内支付服务)为开发者提供便捷的应用内支付体验和接入流程;接入IAP Kit我们就不需要对接第三方支付如支付宝支付、微信支付。

我们不需要去对接华为IAP,百度收银台已经对接好了,我们只需要接入收银台SDK即可

2,接入前置步骤

2.1,PM侧接入流程

这几个是pm操作,主要是在AGC中进行一些配置

参考文档:developer.huawei.com/consumer/cn...

2.1.1,开通商户服务

pm去AGC后台配置银行卡账户、币种等信息,用于开发者接收华为分成收益。

2.1.2, 打开IAP的开关

2.2 FE接入流程

pm、rd接入完成后fe再开始接入

1,配置应用身份信息

在AppScope/app.json5配置bundleName

json 复制代码
{
  "app": {
    // bundleName需要与开发者在AppGallery Connect中创建应用时的包名保持一致
    "bundleName": "com.baidu.xxx",
  }
}

配置client_id,在"entry/src/main/module.json5"的module 节点增加如下client_id属性配置,用于IAP Kit接口的应用身份鉴权。

json 复制代码
"module":{
    "type": "***",
    "name": "***",
    // ...
    "metadata": [
      {
        "name": "client_id",
        "value": "123456"
      }
      // ...
    ]
}

2,配置手动签名

编辑器使用调试证书(不能使用自动签名证书,自动签名无法调起IAP)

申请调试证书文档:

developer.huawei.com/consumer/cn...

3,配置沙盒账号

文档:developer.huawei.com/consumer/cn...

配置成沙盒账号,支付不花钱

  1. 华为手机中登录的账号是沙盒账号

在AppGallery中添加沙盒账号(如果没有添加账号的按钮说明账号的权限不够)

3,接入SDK

3.1 引入SDK @bdfeat-infra/poly-pay-sdk

jsx 复制代码
ohpm install @bdfeat-infra/poly-pay-sdk --registry <https://ohpm.baidu-int.com/repos/baidu>

3.2 配置以及初始化SDK

核心逻辑在37-60行

jsx 复制代码
import { common } from '@kit.AbilityKit';
import Cashier, { Env } from '@bdfeat-infra/poly-pay-sdk';
export class PaySdkManager {
  private static instance: PaySdkManager;
  private initialized: boolean = false;

  private constructor() {
  }

  public static getInstance(): PaySdkManager {
    if (!PaySdkManager.instance) {
      PaySdkManager.instance = new PaySdkManager();
    }
    return PaySdkManager.instance;
  }

  /**
   * 初始化支付SDK
   * @param context UIAbility上下文
   */
  public initialize(): void {
    if (this.initialized) {
      if (Cashier.appAbility?.bduss === (AppStorage.get("userInfo") as UserInfo)?.bduss) {
        console.log('initPaySdk 已经初始化过了');
        return;
      }
      console.log('initPaySdk bduss不一致 重新初始化');
    }

    const userInfo: UserInfo = AppStorage.get("userInfo") as UserInfo;
    const cuid = getCuid() as string;
    if (!cuid) {
      console.log('initPaySdk 失败 没有cuid');
      return;
    }
    // 设置上下文
    Cashier.context = getContext() as common.UIAbilityContext;

    // 设置环境
    Cashier.env = Env.ONLINE;

    Cashier.appAbility = {
      bduss: userInfo?.bduss || '',
      cuid: cuid,
      // 调试信息回调
      debugInfo: (info) => {
        console.log('PaySdk debug info:', JSON.stringify(info));
      }
    };

    Cashier.appRouter = {
      pop: (animated) => {
        // 全局唯一的NavPathStack
        getPageStack().pop(animated);
      },
      pushPathByName: (path, param, animated) => {
        // 全局唯一的NavPathStack
        getPageStack().pushPathByName(path, param, animated);
      }
    };

    this.initialized = true;
    console.log('initPaySdk 成功', cuid, userInfo?.bduss);
    console.log('initPaySdk Cashier.env', Cashier.env);
  }
}
jsx 复制代码
  async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
      // 此处省略其他业务逻辑...
      PaySdkManager.getInstance().initialize();
  }

3.3 调起支付

先调用业务接口下单,然后用拿到的参数调用收银台

jsx 复制代码
export async function appPayInfoAjax(payParams: AppPayInfoAjaxParams, callback?: PayCallBack) {
  // 调用业务接口
  newHttp.post<Record<string, Record<string, string> | string>>('/trade/getAppPayInfoAjax',
    params, {
      headers: {
        'Content-Type': 'multipart/form-data'
      }
    }).then((res) => {
        const iapParam: Record<string, string> = res.data as Record<string, string>;
        const context = getContext() as common.UIAbilityContext;
        // 调用收银台
        Cashier.startIapPay(context, iapParam as Record<string, string>, (info: PolyIapPayResult) => {
          console.log('Cashier.startIapPay', JSON.stringify(info));
          if (info.statusCode === PolyIapStatusCode.PAY_SUCCESS) {
            // 支付成功
          } else if (info.statusCode === PolyIapStatusCode.PAY_CANCEL) {
            // 支付取消
          } else {
            // 支付失败
          }
        });
  });
}

3.4 排查错误

调用IAP可能会遇到的错误状态码,可以参考华为文档里面的错误原因进行排查developer.huawei.com/consumer/cn...

4,支付流程图

5,踩过的坑

1,axios版本和收银台sdk版本不兼容问题

问题现象:在支付时sdk内部偶尔会出现axios报错500,但是sdk给的结论是后端没问题

问题排查:爱企查axios版本是2.2.5,尝试删除axios依赖重新安装试试,还是有问题;了解到收银台sdk 里面也用到了axios 版本是2.2.4,怀疑可能是axios有什么冲突,因为手百也接入了支付,手百没有反馈过这个问题,所以将axios版本升级为2.2.6试试,升级之后测试支付没有出现过该问题,建议吧axios的版本锁死成2.2.6,版本号不要带^,否则安装依赖时会自动升级

问题预防:因为收银台sdk没有这块报错的日志,所以我们在支付失败的时候将错误日志进行上报,截止到7.11号,没有出现axios 500的错误

2,切换APP账号时要注意重新初始化sdk

切换账号用户的信息会变化,所以需要重新初始化sdk

参考文档:

  1. IAP Kit简介
相关推荐
Wect1 分钟前
React 性能优化精讲
前端·react.js·性能优化
三声三视31 分钟前
ArkTS 性能优化实战:从卡顿分析到高帧率应用全攻略
华为·性能优化·harmonyos·鸿蒙
追风筝的人er35 分钟前
SpringBoot+Vue3 企业考勤如何处理法定假期?节假日方案、调休补班与工作日判断链路拆解
前端·vue.js·后端
无敌的黑星星44 分钟前
Java8 CompletableFuture 实战指南
linux·前端·python
雁鸣零落1 小时前
如何在 Chrome 中查看其他浏览器的书签?书签空间订阅与侧边栏只读切换指南
前端·chrome·edge浏览器
hpoenixf1 小时前
一天上线 + 零返工:我如何给复杂前端需求建立“安全感”
前端
小雨青年2 小时前
鸿蒙 HarmonyOS 6 | PDFKit预览能力升级实战
华为·harmonyos
广州华水科技2 小时前
单北斗GNSS变形监测系统在水利工程安全保障中的应用与优势分析
前端
yqcoder2 小时前
CSS 外边距重叠(Margin Collapsing):现象、原理与完美解决方案
前端·css
花先锋队长3 小时前
鸿蒙6.1加持菜鸟App:地理围栏+实况窗,靠近驿站自动提醒,取件不再遗漏
华为·智能手机·harmonyos