1 开发准备
应用内支付回调地址是应用级还是开发者级?为什么在回调地址由正确修改为错误后,依然会收到正确地址的回调?
-
IAP应用内支付的回调地址是应用级别的。
-
回调地址生效有缓存时间,大概10分钟,可以通过多次拉起购买弹窗来推动地址生效。
若游戏在调试应用下面没有配置回调地址,在正式游戏的应用下面配置了,但是调试应用也可以收到关键事件通知,需要如何处理?
-
主要检查商品定义在哪个应用下面,即下单时属于哪个APP ID。
-
若已在AGC控制台开通应用内支付服务,那么之前的配置还会保留,需要尽快激活应用内购买服务,激活后可以调整配置。
参考资料:
后台配置了服务端事件通知的地址,客户端也做了订阅下单和续签的操作,但服务端一直没收到回调是什么原因?
-
按照应用内支付服务的开发准备文档检查。
-
检查APP ID和Client ID是否与AppGallery Connect应用下的匹配。
-
检查通知地址是否为v3版本。
-
检查通知地址是否正常可用,是否会拦截不固定IP的回调。
在实际项目中,IAP应用内支付的工程是直接在客户端使用JWTUtil中解码?还是需要将PurchaseData传到服务端后,下载HUAWEI CBG Root CA G2根证书去解码验签呢?
从安全系数方面看,将PurchaseData传到服务器这个方案更好。根据安全性需求进行配置,这里推荐高安全系数的支付验证,IAP应用内支付的官网文档上有详细的商品购买验签流程。更多内容请参考接入购买。
开启订单订阅关键事件通知,通知服务版本选择v2版本之后,提示刷新失败,需要如何处理?
通知服务版本应当选择v3版本,不支持v2版本。
没有拉起IAP应用内支付页面,可能的原因有哪些?
-
检查应用签名是否为手动签名。
-
检查工程配置的APP ID和Client ID是否正确。
-
是否添加了证书指纹和公钥指纹。
-
检查工程中的包名是否一致。
-
应用的支付服务开关是否打开。
-
激活服务和配置事件通知审批是否通过。
处理步骤:
-
请参考配置签名信息检查是否使用了自动签名方式,请使用手动签名方式。
-
需要使用华为应用内支付功能的应用必须开启和激活应用内购买服务。
2 关键字段
订单状态查询接口中的purchaseOrderId的字段长度是多少?
purchaseOrderId推荐256存储,purchaseOrderId字段长度是32,但是字段长度是有可能变长的,不建议以当前的32为上限。
订单状态查询接口中的purchaseOrderToken的字段长度是多少?
purchaseOrderToken是用于唯一标识商品和用户对应关系的购买令牌,在支付完成时由IAP应用内支付服务器生成。当前92位,后续存在扩展可能。
如要进行存储,建议预留128位的长度。为保证安全,建议加密存储。
在退款场景中,revocationTime字段的单位是什么?
属于PurchaseOrderPayload订单信息模型中的字段,是退款场景下返回的revocationTime购买订单撤销时间,UTC时间戳,以毫秒为单位。更多内容请参考数据类型说明。
developerPayload字段表示什么?游戏开发者需要在何时传入?何时返回给华为侧?
属于InAppPurchaseData购买数据模型中的字段,developerPayload字段表示商户侧保留信息,为透传字段,由开发者在调用支付接口时传入,在用户支付的时候需要游戏侧返回给华为侧,支付成功后向华为侧请示订单详情时,华为侧会原样返回传递的字段值。更多内容请参考数据类型说明。
SubscriptionStatus订阅状态信息里的subscriptionId字段和lastPurchaseOrder里的subscriptionId是不是一致的?
lastPurchaseOrder里面的subscriptionId跟SubscriptionStatus里面的subscriptionId是一致的,但这个ID在用户切换订阅商品时会发生改变,此时,lastPurchaseOrder也会更新,所以两个subscriptionId一直是匹配的。
IAP应用内支付中JWT Payload的Issuer ID和密钥是开发者级别的吗?Issuer ID和密钥等商户级参数是HarmonyOS NEXT、华为、车机共用的还是分开的?支付服务的私钥参数除第一次下载外,是否有其他办法获取?
-
IAP应用内支付中JWT Payload的Issuer ID和密钥是开发者级别的,在初次生成密钥时,服务器将为商户自动生成唯一一个Issuer ID,一个Issuer ID最多拥有10个密钥,每个私钥生成的jwt,都需要在华为服务器进行校验,可以跨应用使用。
-
密钥在同一个商户下是共享的,一个密钥可以对应多个应用,对于大量应用的开发者,可以多个应用间复用同个密钥。
-
IAP应用内支付服务器将为商户生成唯一的Issuer ID,涵盖所有应用。
-
私钥仅供下载一次,下载后的私钥需要开发者安全保存,可以重生成一个。
参考资料:
3 关键接口
调用订单状态查询接口报错responseCode: 1001880006,responseMessage: rights invalid.需要如何处理?
需要查看订单ID,这个问题大概率是APP ID的问题,检查一下订单ID,APP ID更换后那么订单ID也必须是更换之后的应用下,对应订单产生的ID。
调用获取订单接口报错responseCode: 1001880006,responseMessage: failed to get merchant key Error : Failed to get the key info.需要如何处理?
这个报错不是私钥获取的问题,私钥错误或者格式有误,IAP应用内支付服务器会报验签失败的错误。 可能是issId、kId和私钥三者不匹配,需要检查issId/kId/私钥三个参数是否配置正确。
调用订单状态查询REST接口报错responseCode: 1001880006,responserMessage: Failed to verify the digest.需要如何处理?
-
可能原因:
签名内body请求的hash值与签名内digest的不一致。
-
排查方式:
获取JWT,解码其中payload的digest,检查是否一致。更多内容请参考生成服务端请求的token。
调用订单状态查询接口报错responseCode: 1001880006,responseMessage: parameter is not valid,是什么原因?
purchaseOrderId/purchaseToken有误,属于非法输入参数导致报错。
调用查询订单状态接口返回responseCode:1001880006,responseMessage: JWT verification failed.需要怎么处理?
验签时失败了,使用了非法签名,需要检查生成签名时的算法,jwt.io官网上校验时需要使用ES256算法。
调用获取订单接口报错responseMessage: failed to get merchant key Error : Failed to get the key info.需要怎么处理?
JWT的参数配置错误,重点查看是不是和kId和IssId参数配置错误,如果是参数类型不对,或者为空,会提前校验到。
已发货的订单无法再查询订单信息,订单查询接口返回record does not exist,无法区分订单不存在还是已发货,需要怎么处理?
由于隐私要求,无法查询已发货的订单信息。根据响应消息来区分订单,已发货的订单在响应消息里返回“Record does not exist”,不存在的订单返回“invalid paymentToken,not found correspond order”。
订阅型商品购买后消耗订单,再次购买,报错1001860051,需要怎么处理?
订阅型和非消耗型不可重复购买,订阅型商品需要iap.showManagedSubscriptions取消订阅后再次尝试。
消耗型商品发起购买,报错1001860001,支付界面反馈“查询失败,请稍后重试”,是什么原因?
-
可能是因为付款账户可用余额不足,后续会对该场景作出提示优化,请确保付款账户余额充足。
-
检查Client ID 或 APP ID 是否正确配置。
-
需要手动签名,不能使用自动签名。
iap.queryProducts接口报错1001860005: Network connection error,但其他支付接口不会报错,必现问题,需要如何处理?
获取在AppGallery Connect上配置的商品的详情信息, 每次只能查询一种商品类型的商品,每次最多查询200个商品,否则请求将报错。
在获取商品信息的时候,报错responseCode: 1001860001, responseMessage: Get distributionAppId failed, 是什么原因?
未在AppGallery Connect后台打开应用内支付服务的开关,在“AppGallery Connect> API管理 > 应用内支付服务”打开应用内支付的开关,。
IAP应用内支付云端接口错误码:1001880010,1001880011。在什么情况下会触发?
1001880010是用户账号高风险,操作被拒绝的时候触发,1001880011是用户账号异常,比如已经销户时触发。需要更换账号或重新注册。
在确定订单发货之后,调用queryPurchase接口时订单状态信息仍可查询到,与预期报错误结果不符合,是什么原因?
如果开发者调用的是端侧的权益发放queryPurchases接口,校验是否已发货是可以查到所有历史订单的。
订单确认发货(消耗性/非消耗型商品)和订单状态查询这两个接口调用失败的错误码有哪些?
详情请参考REST API错误码。
所有商品购买都需要调用finishPurchase接口吗?若游戏支付时没有调用finishPurchase接口,会有什么影响?调用失败是否影响商品购买?
-
所有类型的商品必须调用finishPurchase接口才可以完成购买。
-
需要调用确认发货接口将订单消耗掉,成功执行finishPurchase之后,IAP应用内支付服务器会将相应商品标记为已发货状态, 如果没有调用finishPurchase接口将无法完成购买。
-
消耗型商品若没有调用finishPurchase接口则下一笔订单无法购买;非消耗型商品只能购买一次,购买后终生有效的,不能再次购买;自动续期商品则根据是否在商品有效期内购买的,建议最后都调用finishPurchase接口完成购买流程。
queryEnvironmentStatus接口可以在每一次支付前都调用一次吗?
可以,玩家初次使用大陆的华为账号登录HarmonyOS NEXT游戏,且中途不退出。当切换成非大陆的华为账号登录时,需要重新检测支付环境是否满足要求,当前IAP应用内支付仅支持中国境内(不包含中国香港、中国澳门、中国台湾)的用户。
消耗类/非消耗类商品有没有营销活动的能力?
可以在设置商品价格的时候配置促销活动,但是没有使用优惠券的能力。支持所有人群,没有次数限制。更多内容请参考配置促销活动。
4 沙盒测试
使用IAP应用内支付的沙盒测试的前提条件是什么?
必须要先开通商户服务,完成开发准备工作,完成商品接入购买和权益发放,才能使用沙盒测试。
沙盒测试发现,先订阅68元的月卡商品,再订阅一个18元的商品,之前68元的商品会被自动撤销(NotificationType = revoke)是什么原因?
可能是开发者设置了同一个订阅组,订阅组用于承载同类型商品的管理,一个订阅组可以包含多个自动续期订阅商品,且同一个订阅组只有一个商品是处于生效状态。
5 支付充值
取消订阅后恢复订阅重复扣款,需要怎么处理?
若仍在订阅有效期内,恢复订阅拉起支付只是重新签约,并示意下个周期扣费,本次并不会扣款。
设备登录17岁未成年华为账号,单笔支付超过100元,仍然拉起应用内支付页面,为什么仍然拉起?
-
IAP应用内支付未成年限额会在扣费的时候触发拦截,未满8周岁的用户无法进行游戏付费服务。
-
8周岁以上未满16周岁的未成年人用户,单次充值金额不得超过50元人民币,每月充值金额累计不得超过200元人民币。
-
16周岁以上的未成年人用户,单次充值金额不得超过100元人民币,每月充值金额累计不得超过400元人民币。
检查当前用户登录的华为账号所在的服务地是否在IAP Kit支持结算的国家/地区中需要怎么处理?
购买商品之前iap.queryEnvironmentStatus接口可以查询用户登录的华为账号服务地是否在中国境内(不包含中国香港、中国澳门、中国台湾)的用户,当前IAP应用内支付只支持中国境内(不包含中国香港、中国澳门、中国台湾)的用户。
官方账号和华为账号的未成年消费限额冲突,是否以官方账号实名信息为准?
1.在华为HarmonyOS NEXT登录的所有游戏都需要接入IAP应用内支付,IAP应用内支付是按照相关法律法规规定设置的充值金额。
2.如果游戏开发者自己内置的充值金额低于华为侧限制的未成年人金额,那么不会有未成年人消费限额冲突。
3.如果游戏开发者自己内置的充值金额超过华为侧限制,那么玩家充值会以华为侧的充值金额为标准。
6 退款
IAP应用内支付目前有没有退款功能?
游戏类订单自主退款要等到2025年12月份才能上线,非游戏类的订单目前已经支持自主退款了。
HarmonyOS NEXT目前是否支持未成年人退款呢?
目前已支持未成年人退款,从“手机设置 > 华为账号 > 付款与账单”进入。
原文链接:华为开发者文章
更多问题可关注:
鸿蒙游戏官方网站:已有游戏移植-鸿蒙游戏-华为开发者联盟
公开课:华为开发者学堂