Apple In-App Purchase Receipt - 在服务器端进行验证

use*_*820 7 in-app-purchase ios

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

所以,描述:首先,应用程序是针对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", "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":"..."}
]
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

此致,马克西姆

Vik*_*ech 1

@道格·史密斯

\n\n

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

\n\n

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

\n\n
\n

原始事务标识符::\n 对于恢复先前事务的事务,原始事务的事务标识符。否则,与事务标识符相同。\n 此值对应于原始事务\xe2\x80\x99s transactionIdentifier 属性。\n 自动续订订阅的续订链中的所有收据都具有相同的此字段值。

\n
\n\n

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

\n\n
    \n
  1. 您使用 itunes 服务器验证的收据的原始交易标识符,将其与数据库中的用户 ID 相关联。
  2. \n
  3. 您从客户端收到的请求是购买请求还是恢复购买请求。
  4. \n
\n\n

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

\n\n

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

\n\n

::如果请求的类型为“恢复购买”,并且请求来自与数据库中原始事务标识符关联的同一用户 ID,则允许他以其他方式阻止其恢复。

\n\n

此外,你可以根据你的需要,基于这些东西得出你自己的逻辑。

\n\n

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

\n