支付问题总结
手机支付后,通过服务器验证支付的结果,并下发用户权益。
Google支付
透传字段
Google支付有2个重要的字段,可以传递给Google支付平台,回调时会返回。
- ObfuscatedAccountId: 用来透传代表用户的唯一识别码。
- ObfuscatedProfileId:这个透传字段有点难为理解,这里打一个比方,例如这样的一个业务场景,主用户为自己的子用户购买一个商品,这个商品最终要给到子用户,那么ObfuscatedProfileId这个字段就可以用来存储子用户的唯一识别码,这样谷歌支付完成后会有一个回调,从这个回调中就能判断出主用户为哪个子用户购买的,方便下发权益。相当于在ObfuscatedAccountId 用户识别码下,多了一个二级用户识别码,当然也能用在其他业务场景下,但是一定要结合ObfuscatedAccountId一起来使用。
支付回调
支付成功后,Google会给我们的服务器发送回调信息,通过HTTP的POST请求发送到我们的回调接口上。
在沙盒环境下,月度订阅每隔5分钟自动续订一次,年度订阅每隔30分钟自动续订一次,最多续订6次。
Google的回调也有重试机制,Google与Apple类似,通过http的状态码决定回调是否执行成功,成功后不会再次发送,失败后会重试,如果失败次数过多会有退避算法,进行延迟重试。
参考文档
Google支付官方文档:https://developer.android.com/google/play/billing/backend
Apple支付
透传字段
- 旧版API使用applicationUsername,已经废弃但可在旧版API中使用。当用户将一个UUID数据设置到该字段时,Apple支付平台将存储起来并于本次交易关联起来,用来标识支付的用户。在支付回调中,或者Apple的API中,使用appAccountToken获取到设置的UUID值(applicationUsername存储的值,用appAccountToken读取)。
注意:这个字段是用来识别用户的,一定要为业务用户生成一个唯一的UUID,不要试图存储其他值,也不要试图存储非UUID值。
参考文档:https://developer.apple.com/documentation/storekit/skmutablepayment/applicationusername
- 新版API使用appAccountToken,旧版API只能通过applicationUsername字段设置一个UUID值来关联一个业务用户,再通过appAccountToken获取这个UUID值。新版API中,可以直接通过appAccountToken字段设置任意的字符串值,并通过回调接口或Apple API中用返回的appAccountToken字段来获取对应的值。
注意:一定将appAccountToken字段用来关联业务用户,可以是一个UUID字符串,也可以是其他字符串。
参考文档:https://developer.apple.com/documentation/appstoreserverapi/appaccounttoken
自动续订
沙盒环境下,首次购买订阅后,只有5分钟(可在支付平台设置时长)有效期,5分钟到期后会自动续订一次,续订后再过5分钟订阅失效。
建议:将苹果的订阅过期时间与业务侧的权益过期时间设置成一致,这样两边的权益都是同时过期。
支付回调
支付成功后,Apple会给我们的服务器发送回调信息,通过HTTP的POST请求发送到我们回调接口上。
回调处理完成后,业务服务器需要返回一个http的响应状态码给苹果支付平台,返回错误的状态码会导致苹果重复发送回调信息。
- 200and206:表示回调处理成功。
- 50xor40x :表示回调处理异常,此时苹果支付平台会间隔一段时间后再次发送回调。
支付平台重复发送回调的间隔时间如下:
- V2版本的回调, 重试5次, 分别在1, 12, 24, 48, 72小时之后。
- V1版本的回调, 重试3次, 分别在6, 24, 48小时之后。
注意:重试逻辑只发生在正式环境,沙盒环境只发送一次。
支付问题
苹果返回的交易记录中找不到transaction_id
沙盒环境下,手机上支付后,偶尔会出现在苹果的支付校验接口(https://developer.apple.com/documentation/appstorereceipts/verifyreceipt)中找不到对应的交易信息,目前大家反馈是苹果bug导致。
解决办法:当出现该问题的时候,使用Apple提供的另外一个“查询交易信息”接口进行查询,接口官方文档:https://developer.apple.com
/documentation/appstoreserverapi/get-transaction-info。
410






