ios – Apple应用程序内购买收据 – 在服务器端验证

我在服务器端验证苹果收据时遇到问题.
我试图在互联网上找到解决方案,但没有成功.

所以,描述:
首先,应用程序是针对iOS7的.其次,我有一些项目(type = Non-Renewing Subscription).因此,用户可以购买一件或多件物品,然后他应该手动更新它们(再次购买).

应用程序向服务器端发送收据,我向Apple发出请求并获得带有大量in_app收据的结果.就像是:

"in_app":[
{
"quantity":"1","product_id":"...","transaction_id":"...","original_transaction_id":"...","purchase_date":"...","purchase_date_ms":"...","purchase_date_pst":"...","original_purchase_date":"...","original_purchase_date_ms":"...","original_purchase_date_pst":"...","is_trial_period":"..."},{
"quantity":"1","is_trial_period":"..."}
]

因此,“in_app”中的每个“收据”都有transaction_id.但我如何识别当前购买的transactionId?我想验证它,并确保这是独一无二的.

我担心的是:如果有人会收到一张有效收据,他就可以破解我们的服务器端API,并使用相同的有效收据进行无限数量的应用内购买.

我应该以某种方式解密并检查transaction_id的“原始”收据,即我发送给Apple进行验证的收据?

任何帮助/建议将受到高度赞赏.
先感谢您.

问候,
马克西姆

解决方法

@Doug Smith

https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ReceiptFields.html

如果您浏览此页面上的不同字段,您会发现

Original Transaction Identifier::
For a transaction that restores a prevIoUs transaction,the transaction identifier of the original transaction. Otherwise,identical to the transaction identifier.
This value corresponds to the original transaction’s transactionIdentifier property.
All receipts in a chain of renewals for an auto-renewable subscription have the same value for this field.

因此,对于非自动续订订阅,您必须跟踪服务器端的两件事:

>您正在使用itunes服务器验证的收据的原始事务标识符,将其与数据库中的用户ID相关联.
>您从客户端收到的请求是购买还是恢复购买.

一旦你掌握了这两件事,就可以在这两个参数上写下你的逻辑,如下所示:

::如果请求的类型为“Purchase”,并且您已将该收据的原始交易标识符与其他用户ID相关联,则可以阻止该购买.

::如果请求的类型为“Restore Purchase”,并且请求来自与您的数据库中原始事务标识符关联的相同用户ID,则允许他阻止其恢复.

此外,您可以根据自己的需要,根据这些内容推导出自己的逻辑.

如果您有任何疑问,请告诉我.

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...