鸿蒙基础建设之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简介
相关推荐
爱分享的程序员1 分钟前
前端面试专栏-工程化:29.微前端架构设计与实践
前端·javascript·面试
上单带刀不带妹4 分钟前
Vue3递归组件详解:构建动态树形结构的终极方案
前端·javascript·vue.js·前端框架
-半.6 分钟前
Collection接口的详细介绍以及底层原理——包括数据结构红黑树、二叉树等,从0到彻底掌握Collection只需这篇文章
前端·html
Georgewu14 分钟前
【HarmonyOS】ArkTS语法详细解析
harmonyos
90后的晨仔26 分钟前
📦 Vue CLI 项目结构超详细注释版解析
前端·vue.js
@大迁世界27 分钟前
用CSS轻松调整图片大小,避免拉伸和变形
前端·css
一颗不甘坠落的流星27 分钟前
【JS】获取元素宽高(例如div)
前端·javascript·react.js
白开水都有人用29 分钟前
VUE目录结构详解
前端·javascript·vue.js
if时光重来38 分钟前
axios统一封装规范管理
前端·vue.js
m0dw1 小时前
js迭代器
开发语言·前端·javascript