如何确定IAP的原始购买日期(通过合并购买日期和原始购买日期),仅检查收据?

时间:2015-09-25 13:05:01

标签: macos cocoa in-app-purchase storekit receipt-validation

在我写的OS X应用程序(10.9+)中,我想确定非消费类应用程序内购买的原始购买日期 。这听起来很直接,但有两个相关领域,Apple的文档似乎没有明确说明如何将它们结合起来。

Apple的收据验证编程指南describes两个相关的收据字段:

  

购买日期 ...购买商品的日期和时间......   对于恢复先前交易的交易,购买日期是恢复的日期。使用原始购买日期来获取原始交易的日期。

     

原始购买日期 ...   对于恢复先前交易的交易,即原始交易的日期。

我的麻烦在于“用于恢复先前交易的交易”。这意味着为了组合这两个字段,我需要知道交易是购买还是恢复。

<SKPaymentTransactionObserver> paymentQueue:updatedTransactions:方法中这很容易,因为在那里,我知道交易是SKPaymentTransactionStatePurchased还是SKPaymentTransactionStateRestored

但是...... 当应用启动时,它需要根据之前的交易知道是否启用功能。我认为这应该通过检查仅收据来完成(我似乎记得WWDC演示文稿中谈到收据是“单一事实来源”)。

在交易处理代码中,我可以将有关客户应用内购买的信息填充到(例如)plist以供以后使用,但这似乎增加了(更)复杂性。

所以,如果我只检查收据(所以我不知道最近的交易是购买还是恢复),哪个字段包含原始购买日期

我正在使用Receigen来验证收据。这提供了宏<prefix>INAPP_ATTRIBUTETYPE_PURCHASEDATE<prefix>INAPP_ATTRIBUTETYPE_ORIGINALPURCHASEDATE,我相信它们提供了C字符串。

我可以想到一些方法(伪代码):

// method one
// assume that Original Purchase Date is always present
return ORIGINALPURCHASEDATE

// method two
// when present, Original Purchase Date overrides Purchase Date
if (ORIGINALPURCHASEDATE == "") {
  return PURCHASEDATE
} else {
  return ORIGINALPURCHASEDATE
}

// method three
// consider all possible combinations
// of the two values being present / not present
if (PURCHASEDATE != "" && ORIGINALPURCHASEDATE == "") {
    // have only PURCHASEDATE
    return PURCHASEDATE
} else if (PURCHASEDATE == "" && ORIGINALPURCHASEDATE != "") {
    // have only ORIGINALPURCHASEDATE
    return ORIGINALPURCHASEDATE
} else if (PURCHASEDATE != "" && ORIGINALPURCHASEDATE != "") {
    // have both: use the earlier value
    return min(PURCHASEDATE, ORIGINALPURCHASEDATE)
} else {
    // have neither
    return UNKNOWN
}

...但是与客户付款相关的代码中的这种猜测让我担心:(

我将尝试在沙盒中进行一些实验来验证这一点,但我已经看到沙箱行为并不总是与生产环境相匹配的评论。

任何人都可以确认在这里做正确的事吗?

更新

为了获得更多信息,我使用SCPStoreKitManager中的一些类(它有一些可爱的清晰代码)汇总了一个工具,该工具使用DumpMASReceipt-v1.zip中的一些类转储_MASReceipt/receipt中所有/Applications个文件的内容。 )。在我的机器上,输出包括:

/Applications/Dash-2.2.6.app/Contents/_MASReceipt/receipt
{
    bundleIdentifier = "com.kapeli.dash";
    bundleIdentifierData = <0c0f636f 6d2e6b61 70656c69 2e646173 68>;
    hash = <acec4273 8a9bf57a 1d3ed8ab f7a4c696 497f2ae1>;
    inAppPurchases =     (
                {
            cancellationDate = "";
            originalPurchaseDate = "2012-08-13 00:07:48 +0000";
            originalTransactionIdentifier = 220000033036694;
            productIdentifier = DPinky;
            purchaseDate = "2012-08-13 00:07:48 +0000";
            quantity = 1;
            subscriptionExpiryDate = "";
            transactionIdentifier = 220000033036694;
            webItemId = "";
        }
    );
    opaqueValue = <f50b37c7 ac1e9a02 ddb579ca 5c5dad62>;
    originalVersion = "1.6.6";
    version = "2.2.6";
}

在这种情况下,purchaseDateoriginalPurchaseDate都存在,并且具有相同的值。

这是我有一个应用内购买的OS X收据的唯一例子。

任何人都可以提供更多示例吗?我特别感兴趣的是看到那些价值不同或不存在的收据。

我上传了此工具的二进制文件和来源:{{3}}。

0 个答案:

没有答案