鸿蒙基础建设之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简介
相关推荐
GIS之路5 分钟前
GDAL 实现矢量裁剪
前端·python·信息可视化
是一个Bug8 分钟前
后端开发者视角的前端开发面试题清单(50道)
前端
Amumu1213810 分钟前
React面向组件编程
开发语言·前端·javascript
持续升级打怪中32 分钟前
Vue3 中虚拟滚动与分页加载的实现原理与实践
前端·性能优化
GIS之路36 分钟前
GDAL 实现矢量合并
前端
hxjhnct38 分钟前
React useContext的缺陷
前端·react.js·前端框架
冰暮流星1 小时前
javascript逻辑运算符
开发语言·javascript·ecmascript
前端世界1 小时前
设备找不到、Ability 启不动?一次讲清 DevEco Studio 调试鸿蒙分布式应用
华为·harmonyos
前端 贾公子1 小时前
从入门到实践:前端 Monorepo 工程化实战(4)
前端
菩提小狗1 小时前
Sqlmap双击运行脚本,双击直接打开。
前端·笔记·安全·web安全