华为应用内支付服务(In-App Purchases)通过简便的接入流程为用户提供良好的应用内支付体验,然而在实际接入过程中,有一些开发者反馈测试时会无法正常拉起支付页面,下文将详细分析问题出现的5种情形,并给出解决方案,希望给遇到类似问题的开发者提供参考。
情形1:AGC控制台上API管理中的支付API已打开,创建的商品也生效了,但查看日志发现报错60002
原因分析:对IAP的请求结果验签时需要使用支付公钥,进行SHA256WithRSA签名校验,此公钥开发者未配置。
解决方法:请仔细检查以下三点是否设置:
(1)API管理中支付API已打开(注意:用户在开通IAP服务,半个小时左右才起效)
详情可参考官方文档
(2)确保公钥开关激活打开,且公钥使用正确
(3)在AGC后台PMS(商品管理系统)上配置了相应类型的商品,并激活成功
情形2:开发者进入会员中心编辑订阅页面,显示异常,报错60051
查看官网文档,错误码60051表示已购买型商品或者订阅型商品,不能再次购买;
原因分析:
复现问题时我们发现,订阅完成返回会员中心有个刷新动作,在刷新前点击订阅会异常,刷新后点击就是正常的。这是因为如果没有刷新或者刷新不及时,会存在上一次的缓存数据。在点击一个订阅商品之后,立即再点击订阅另一个商品的时候,会把首次订阅的商品id带入,但该id并不是最新购买的订阅商品id,从而造成数据的不匹配,最终导致报错,无法显示编辑页面。
解决方法:
建议开发者对页面效果刷新时机进行优化处理,避免未刷新就去续费。
情形3:使用华为手机进行支付调试的时候报错60003,但PMS系统中商品ID配置未发现问题。
原因分析:首先报错60003一般是在PMS系统中的商品信息配置有问题,可以到AGC网站后台,在我的应用->运营-> 商品管理->商品列表 ,查看对应商品是否存在或者必填的信息是否正确完整(例如商品名称,商品ID,价格,商品类型,是否激活)。
另外可以检查商品ID是否在客户端代码中填写正确,是否与AGC后台的商品ID保持一致,请重点检查客户端代码中传入的字段是否有问题。
还有一点需要注意的是在设备上登录的华为账号的服务地点是否在IAP覆盖的范围内。可以通过调用Task isEnvReady()接口判断当前设备登录的帐号所在的服务国家/地区是否在华为IAP支付服务支持结算的国家/地区中。
解决方案:
经过CP排查发现是客户端端代码传入的商品ID和AGC后台配置的商品ID不一致,修改后问题已解决。
情形4:调用支付拉起收银台接口,第一次成功拉起成功支付页面,然后点击取消返回,第二次再继续调用该接口为什么无法拉起支付页面 ?
原因分析:购买消耗性商品后,必须要先完成商品消耗,之后才能再次购买,否则会报错60051等错误码。
解决方法:对于消耗性商品进行补单操作
开发者需要在以下这四种场景下触发补单机制:
· 应用启动时
· 购买请求返回-1(OrderStatusCode.ORDER_STATE_FAILED)时
· 购买请求返回60051(OrderStatusCode.ORDER_PRODUCT_OWNED)时
· 购买请求返回1(OrderStatusCode.ORDER_STATE_DEFAULT_CODE)时
如果IAP 后台配置的退款回调地址错误,需要重新配置。具体可参考文档
除了无法拉起支付页面的问题以外,如何确认是否进入沙盒环境也是一个常见的问题。
情形5:使用沙盒帐号测试,没有弹出沙盒环境端侧提示弹框,如何确认是否进入沙盒环境?
原因分析:首先进入沙盒测试环境,正常情况下会提示以下弹框
但是在满足了沙盒环境的2个必要条件后,仍然无法提示该对话框,是否表示没有进入沙盒测试?
以下是开发者通过isSandboxActivated接口打印出的相关数据
从打印的日志来看:满足了沙盒环境2个必要条件。
- 当前登录的华为帐号属于沙盒帐号
- VersionCode大于应用市场线上版本(该APK暂未发布应用市场,所以应用市场返回的版本号为0)
很明显从结果来看理论上应该进入了沙盒测试环境。那么有没有其他方法来确认?
解决方法:是否成功进入沙盒环境,可以通过以下几种方法排查
a) 查看返回的购买数据,参考下图:
如果华为订单号payOrderId以SandBox开头,那么表面该笔订单属于沙盒测试产生的订单。
b)查看支付报表
可以查看支付报表,如果支付报表没有该笔订单,说明该订单来自于沙盒测试产生的。(注:支付报表数据不是实时更新的,如果当天购买的订单,为了判断准确性,可以次日再刷新该报表验证)
c)清除HMS Core 缓存
可以尝试清除HMSCore缓存,端侧弹框是根据相应字段标识进行判断的,可能是缓存原因导致该值未及时刷新。可通过设置 –>应用和服务->应用管理->HMS Core 进行缓存清理。