查看: 5150|回复: 3

鸿蒙ASCF支付与IAP开发:createIap四步与避坑

[复制链接]
发表于 2026-9-14 13:00:00 | 显示全部楼层 |阅读模式
做元服务商业化,支付绕不开。ASCF 提供两套方案:华为支付 has.requestPayment 和应用内购买 IAP has.createIap。两者不是一回事:华为支付是直接付钱给商户,适合实物商品和服务;IAP 走华为应用商店支付通道,适合虚拟商品、会员、道具、解锁内容和订阅。选型先看卖什么。

开发前准备:不管用华为支付还是 IAP,都需要在 AGC 配置 Client ID、签名证书指纹,开通商户服务,开启并激活应用内购买服务(IAP)。不配置这些,支付相关 API 都会 fail。

华为支付的核心是前端不生成订单。服务端生成 orderStr,里面包含 app_id、merc_no、prepay_id、timestamp、noncestr、sign、auth_id 等信息;前端只把 orderStr 传给 requestPayment,负责拉起支付和处理结果。
  1. has.requestPayment({
  2.   orderStr: orderStr,
  3.   success: (res) => {
  4.     console.info('支付成功');
  5.   },
  6.   fail: (err) => {
  7.     console.error('支付失败:', err);
  8.   }
  9. });
复制代码

华为支付有三种模式,通过 payload 区分:默认支付不传 payload;混合支付在收银台选择,payload 传空字符串;三方支付(微信/支付宝)payload 固定传 'AP',同时 orderStr 里需要 nextAction、linkUrl、clientToken。

ASCF 1.0.9 新增 has.cashierPicker,可拉起通用收银台,不需要传复杂 orderStr,适合快速接入。它接收 tradeSummary、amount、currency,amount 单位是分。9900 分等于 99 元。成功回调里 res.selectedPaymentType 可能是 wechat_pay、ali_pay 等。
  1. has.cashierPicker({
  2.   tradeSummary: '购买VIP会员',
  3.   amount: 9900,
  4.   currency: 'CNY',
  5.   success: (res) => {
  6.     console.info('用户选择了:', res.selectedPaymentType);
  7.   }
  8. });
复制代码

IAP 流程复杂一些,但更适合虚拟商品。四步走:检查环境、查询商品、发起购买、确认发货。

第一步检查环境用 has.queryIapEnvStatus。如果用户没登录华为账号或地区不支持,直接调 createIap 会报错。地区不支持对应错误码 1001860054。

第二步查询商品用 has.queryIapProducts,传入 productType 和 productIds。商品类型包括:0 消耗型、1 非消耗型、2 自动续期订阅、3 非续期订阅。

第三步发起购买用 has.createIap。成功回调里的 res.purchaseData 是 JSON 字符串,解析后有 purchaseToken、purchaseOrderId 等。用户取消对应错误码 1001860000;您已拥有此商品对应 1001860051。

第四步确认发货用 has.finishIap。这个必须调,不然华为会认为你没发货,多次不确认可能触发自动退款。正确流程是:createIap 成功 → 服务端验证 → 发货 → finishIap。createIap 和 finishIap 的 productType 必须一致,商品在 AGC 配置成什么类型,代码里就传什么类型,类型不对会报错。

查询已购和补发货要用 has.queryIap。queryType 有三个值:0 所有购买记录,1 已购买未发货,2 当前有效的购买/订阅。启动时补发货用 1,检查订阅状态用 2。典型处理是:App onLaunch 时对 [0,1,2,3] 四个 productType 分别查询 queryType:1,如果 purchaseDataList 有数据,就解析并走服务端验证、发货、finishIap。
  1. has.queryIap({
  2.   productType: 0,
  3.   queryType: 1,
  4.   success: (res) => {
  5.     if (res.purchaseDataList && res.purchaseDataList.length > 0) {
  6.       res.purchaseDataList.forEach((item) => {
  7.         const data = JSON.parse(item);
  8.         this.deliverGoods(data);
  9.       });
  10.     }
  11.   }
  12. });
复制代码

这个补发货逻辑很重要。用户支付成功但 App 崩溃,没来得及发货,下次启动时用 queryIap 查未发货订单并补发。

沙盒测试用 has.isIapSandboxActivated。它只在 debug 包有效,release 包调用会报 1001860057。订阅管理用 has.showIapManagedSubscriptions,可跳转到订阅管理页,用户能在那里取消订阅、查看订阅状态。

实际场景里,VIP 会员购买可以用 IAP:先用 queryIapProducts 查询 vip_month、vip_year 等 productType 2 商品,用户点击后 createIap,成功拿到 purchaseData,发给服务端验证并发货,服务端确认成功后再 finishIap。华为支付下单则是先调服务端 createOrder 拿到 orderStr,再调 requestPayment;用户取消同样可处理 1001860000。

最后整理几个容易踩的坑。IAP 调用前先做 queryIapEnvStatus;finishIap 必须调;createIap 和 finishIap 的 productType 要对且一致;queryIap 的 queryType 要按场景选;华为支付的 orderStr 必须由服务端生成,前端不要自己拼签名;沙盒测试需要 debug 包;cashierPicker 的 amount 单位是分,别按元传导致多收 100 倍。

API 层面可记成两组。华为支付:has.requestPayment、has.cashierPicker。应用内购买 IAP:has.queryIapEnvStatus、has.queryIapProducts、has.createIap、has.finishIap、has.queryIap、has.isIapSandboxActivated、has.showIapManagedSubscriptions。开发前别忘了 AGC 的 Client ID、签名证书指纹、商户服务和 IAP 服务配置。

选型结论:实物商品、服务用华为支付;虚拟商品、订阅用 IAP。IAP 流程长一些,但查环境、查商品、购买、确认发货四步走通后就很顺畅,关键是 finishIap 一定不能漏。
回复

使用道具 举报

发表于 2026-9-14 19:00:00 | 显示全部楼层

Re: 鸿蒙ASCF支付与IAP开发:createIap四步与避坑

楼主这篇总结得很到位,尤其把华为支付和IAP的选型边界讲清楚了:实物和服务走requestPayment,虚拟商品、会员、道具、解锁和订阅走IAP。IAP四步里,queryIapEnvStatus先检查环境、queryIapProducts查商品、createIap购买、finishIap确认发货,这个顺序很关键;finishIap不调可能导致自动退款,确实是大坑。启动时对四个productType分别用queryIap的queryType 1查未发货并补发,这个补发货思路很实用,能覆盖支付成功后App崩溃没发货的情况。还有createIap和finishIap的productType必须一致、沙盒只在debug包有效、cashierPicker的amount按分传,这些细节都容易踩坑。华为支付这边,orderStr必须服务端生成、前端不拼签名,三种模式靠payload区分,三方支付传AP,也记下了。感谢分享,后面接入时少走不少弯路。
回复 支持 反对

使用道具 举报

发表于 2026-9-14 19:10:00 | 显示全部楼层

Re: 鸿蒙ASCF支付与IAP开发:createIap四步与避坑

感谢分享,这篇把华为支付和 IAP 的边界讲得很清楚。之前确实容易混在一起,看完选型思路就明确了:实物和服务走华为支付,虚拟商品、会员、道具和订阅走 IAP。开发前 AGC 配置、签名证书指纹、商户服务和 IAP 激活这些前置条件也很关键,不配好支付 API 直接失败,这点很实在。 IAP 四步里,检查环境、查商品、createIap、finishIap 的顺序很清晰,尤其是 finishIap 必须调,以及 createIap 和 finishIap 的 productType 必须一致,这种坑确实容易忽略。启动时用 queryIap 查未发货订单并补发也很有用,能避免用户支付成功但 App 崩溃后没发货的情况。 另外 cashierPicker 的 amount 单位是分、沙盒测试只对 debug 包有效、华为支付 orderStr 必须服务端生成这些提醒都很实用。整体流程和避坑点总结得挺全,后面接会员订阅时可以按这个思路来。
回复 支持 反对

使用道具 举报

发表于 2026-9-14 19:20:00 | 显示全部楼层

Re: 鸿蒙ASCF支付与IAP开发:createIap四步与避坑

感谢分享,整理得很实用。我最大的收获是选型先看卖什么:实物和服务走华为支付,虚拟商品、会员、订阅走 IAP。华为支付前端不生成订单、orderStr 必须服务端生成这点很关键;IAP 那边 queryIapEnvStatus 前置检查、createIap 和 finishIap 的 productType 必须一致、finishIap 必须调,不然可能触发自动退款,这些坑确实容易踩。启动时按 productType 分别用 queryIap 的 queryType 1 补发货,这个思路很值得抄。沙盒只在 debug 包有效、cashierPicker 的 amount 单位是分,也都记下了。 想请教一下,如果服务端验证和发货都成功了,但 finishIap 调用失败,是应该立即重试,还是靠下次启动用 queryIap 的 queryType 1 补确认?另外用户取消时返回 1001860000,一般只做提示就行,还是也要记日志或做额外清理?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-10-7 02:21 , Processed in 0.046004 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部