苹果内购服务器验证凭证回执Data

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了苹果内购服务器验证凭证回执Data相关的知识,希望对你有一定的参考价值。

参考技术A 基本上所有的 操作都可以再前端完成操作,包括对支付凭证的验证,但是如果在客户端验证凭证可能存在被篡改的危险,

服务器去重验证和加款,是建立在 用户已经在前端支付成功,然后由ios会得到一个字节流,然后 base64后转给 后台。

后台通过这个字符串 去请求苹果的服务器,然后得到一个json字符串去给用户加款,其中注意事项为

//沙箱static final String testUrl = "https://sandbox.itunes.apple.com/verifyReceipt";

//正式 static final String product =  "https://buy.itunes.apple.com/verifyReceipt";

请求苹果地址 返回的 内容为

conten-type = application/json

请求的苹果的内容为String param = "\"receipt-data\":\""+客户端返回的base64+"\"";



"receipt":

"receipt_type": "ProductionSandbox",

"adam_id": 0,

"app_item_id": 0,

"bundle_id": "com.rtjk.xshl",//当前的产品的包名,一定要验证返回的包名和此包名要一致

"application_version": "2018101001",

"download_id": 0,

"version_external_identifier": 0,

"receipt_creation_date": "2018-10-19 10:50:48 Etc/GMT",

"receipt_creation_date_ms": "1539946248000",

"receipt_creation_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",

"request_date": "2018-10-31 01:58:21 Etc/GMT",

"request_date_ms": "1540951101844",

"request_date_pst": "2018-10-30 18:58:21 America/Los_Angeles",

"original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",

"original_purchase_date_ms": "1375340400000",

"original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",

"original_application_version": "1.0",

"in_app": [



"quantity": "1",

"product_id": "6hongliao",//对应产品id,自己做一个金额的映射就行,对应到具体的金额,建议命名要规则

"transaction_id": "1000000460004095",//一定要进行去重验证,一个订单号只能加一次款

"original_transaction_id": "1000000460004095",

"purchase_date": "2018-10-19 10:50:48 Etc/GMT",

"purchase_date_ms": "1539946248000",

"purchase_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",

"original_purchase_date": "2018-10-19 10:50:48 Etc/GMT",

"original_purchase_date_ms": "1539946248000",

"original_purchase_date_pst": "2018-10-19 03:50:48 America/Los_Angeles",

"is_trial_period": "false"



]

,

"status": 0, //表示当前请求返回正常

"environment": "Sandbox"

苹果内购服务器验证之receipt返回多组in_app思考

最近有部分用户反映,苹果内购充值失败,经过测试总结有几个关键点出现问题

1.app购买成功苹果没有返回票据,属于票据遗漏(取决于苹果服务器的响应状况),只能客户端进行监听刷新等处理

2.app连续购买的过程中,前几次苹果没有返回票据,几次之后,苹果返回了一个有效的票据,app提交给服务器进行验证的过程中in_app出现多组数据的情况,这种情况还是能充值成功了,只是不能全部到账

3.app连续购买,有一次正常返回票据,在提交给服务器的过程中出现意外,但实际服务端已经接受到票据,为用户成功充值,但app进行下次充值带回票据,再次提交服务器验证的时候,in_app中出现了上次已经提交的票据信息,这种情况服务器将判断为已经充值,导致最后一次充值失败

本着刨根问底的精神,查阅各方资料总结如下,苹果的官方描述(IAP票据验证)如下:

百度翻译如下:

它说,票据在一个在JSON文件,是一个数组包含所有应用程序购买收据基于应用程序购买交易收据数据输入Base-64,而且有可能返回一个空的数组(空数组居然还是有效的)

在应用程序购买收据消耗型产品添加到发票购买时,它是保存在你的应用程序接收到完成交易。在这一点上,它是下一次收到的更新-例如从收据后,当用户再购买或如果您的应用程序显式刷新收据。

 

原谅我的英文水平低下,看完之后一脸懵逼,下面总结一下我个人的理解,大概意思如下:

对于消耗型产品的购买,在购买完成(苹果那边购买完成,不是服务器购买完成)之后会被添加到票据信息中,直到你的APP完成交易(APP的主动行为),之后它会在用户下一次购买的时候对票据进行刷新,或者APP进行显示刷新。

 

看完这个就很好理解上面出现的问题了,也就是说:

验证票据返回的receipt里面的in_app字段,这个字段包含了所有你未完成交易的票据信息。也就是在上面说到的APP完成交易之后,这个票据信息,就会从in_app中消失。

如果APP不完成交易,这个票据信息就会在in_app中一直保留。(这个情况可能仅限于你的商品类型为消耗型)

 

知道了事件的原委,就很好优化解决了,方案有2个

1.对票据返回的in_app数据全部进行处理,没有充值的全部进行充值

2.仅对最新的充值信息进行处理(我们采取的方案)

因为采用一方案:

如果用户仅进行了一次充值,该充值未到账,他不再进行充值了,那么会无法导致。

如果他通过客服的途径已经进行了补充充值,那么他在下一次充值的时候依旧会把之前的产品票据带回,这时候有可能出现重复充值的情况

 

特别说明:如果你需要当前票据的唯一号,取in_app中最后一个票据的transaction_id就行

作者:旧旧的 <393210556@qq.com> 解决问题的方式,就是解决它一次

以上是关于苹果内购服务器验证凭证回执Data的主要内容,如果未能解决你的问题,请参考以下文章

ios IAP 内购验证

iOS开发支付篇-内购(IAP)

iOS内购 服务端票据验证及漏单引发的思考.

PHP苹果支付以及事件通知-周期订阅实现

PHP苹果支付以及事件通知-周期订阅实现

iOS内购丢单的解决方案