标签: receipt-validation

在哪里可以找到 iOS App Store 收据验证的共享密钥?

我对在哪里可以找到验证常规应用内购买所需的共享秘密感到困惑。

大约一年前,我创建了一个服务器脚本,该脚本从我的 iOS 应用程序调用,以使用 Apples.../verifyReceipt端点验证 App Store 收据。

这在去年运行良好,现在我想扩展脚本以对第二个应用程序执行相同的操作。

问题:我不记得在哪里可以找到必须与收据一起发送给 Apple的应用程序共享机密


第一个应用程序(“MyApp”)的秘密存储在脚本中。但是我无法在 App Store Connect 中重新找到它。

  • 登录 App Store Connect
  • 转到“我的应用程序/我的应用程序/功能”
  • 单击“应用程序内购买”列表上方的“应用程序特定共享秘密”链接。

这显示了 MyApp 没有特定于应用程序的共享机密而只有主共享机密的信息。我可以显示主共享密钥,但它与验证脚本中存储的不同

此外,信息文本说,特定于应用程序的共享机密用于验证自动更新订阅。与消耗性或非消耗性 IAP 无关。

因此,我认为这不是我正在寻找的共享秘密。但是我还能在哪里找到正确的共享密钥(已经存储在我的脚本中的那个?)

我在哪里可以找到我的新应用程序的秘密?

shared-secret ios receipt-validation

11
推荐指数
3
解决办法
4172
查看次数

App Store收据验证:如何检查整个付费应用是否已退款(不是应用内购买)?

假设一位客户在Mac App Store中购买了我的付费应用,然后向Apple询问并获得了退款.Apple是否会以某种方式使收据无效以使应用程序无法再使用?如果是这样,收据中是否有某种标志表明它已退款,我应该在收据验证期间进行测试?

我发现了cancellation_date字段(Apple技术说明),但它似乎只适用于订阅或应用内购买.如何退还整个付费应用程序,是否可以检查?

似乎答案过去是"不,Apple不会使退款的Mac应用程序收据失效,用户可以继续使用该应用程序",我想知道最近是否有所改变.

谢谢!

macos objective-c app-store mac-app-store receipt-validation

8
推荐指数
0
解决办法
511
查看次数

无法获取用户安装的原始应用版本(收据验证)?

我有一个应用程序,我最近更新,以便在应用程序购买中使用.之前的版本(付费但没有在应用内购买)是1.0,当前版本是1.1.

由于应用程序内购买实际上解锁了所有功能(包含在付费版本1.0中),我想要一种方式,如果用户按下我的恢复购买按钮,则最初下载的版本1.0将被升级.

为此,我首先尝试恢复购买,如果回复:

- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue
Run Code Online (Sandbox Code Playgroud)

如果这为我提供了一个事务计数为0的队列,我检查收据以查看安装的原始版本是否为1.0.

获得收据的代码是根据Apple的文档

- (void)tryRestoreFromOriginalPurchase
{
    // Load the receipt from the app bundle
    NSError *error;
    NSData  *receipt = [NSData dataWithContentsOfURL:[[NSBundle mainBundle] appStoreReceiptURL]];

    if (receipt == nil) {
        [self restoreFromOriginalVersionWithReceipt:nil];
        return;
    }

    // Create the JSON object that describes the request
    NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0]};
    NSData       *requestData     = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error];

    if (!requestData) {
        [self restoreFromOriginalVersionWithReceipt:nil];
        return;
    }

    // Create a POST request with the receipt data
    NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; …
Run Code Online (Sandbox Code Playgroud)

storekit in-app-purchase ios7 receipt-validation

7
推荐指数
2
解决办法
1154
查看次数

应用程序更新后,[NSBundle appStoreReceiptURL]的收据是否仍然存在

在生产环境中,如果用户进行应用内购买,然后更新到应用的较新版本,那么反映应用内购买仍然存在于捆绑中的收据?或者它是否被应用更新消灭了?

iphone in-app-purchase ios receipt-validation

7
推荐指数
1
解决办法
868
查看次数

如何从iOS 11中的iOS Receipt中获取original_application_version(第一个购买的版本号)?

我有一个付费的iOS应用程序.

我需要original_application_version从Apple AppStore Receipt 获取该号码(用户购买的第一个版本).

要获得收据,当我的应用加载时,我使用checkReceiptFromAppStore()功能:

func checkReceiptFromAppStore() {
    let receipt = self.getReceipt()
    print("receipt Data is: \(receipt)") // prints this: receipt Data is: Optional(5141 bytes)       
}
Run Code Online (Sandbox Code Playgroud)

getReceipt() 功能如下:

func getReceipt() -> Data? {
    if Bundle.main.appStoreReceiptURL != nil {
        print("app receipt: \(Bundle.main.appStoreReceiptURL)")
        do {
            let receiptData = try Data(contentsOf: Bundle.main.appStoreReceiptURL!)

            return receiptData
        } catch {
            print("error converting receipt to Data: \(error.localizedDescription)")
        }
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)

我已经观看了WWDC 2017 Advanced StoreKit关于In App购买和收据验证的视频以及关于使用收据的WWDC 2013视频 …

storekit ios receipt-validation swift ios11

7
推荐指数
1
解决办法
669
查看次数

验证Mac App Store收据服务器端

我已将IAP添加到我的Mac Appstore应用程序中.我无法正确验证收据服务器端.我正在使用此代码阅读收据:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];

// This is my own method to convert to base64
NSString *receiptString = [NSData base64forData:receipt];
Run Code Online (Sandbox Code Playgroud)

然后我将数据发送到我的服务器,然后查询https://buy.itunes.apple.com/verifyReceipt以查看收据是否有效.无论我在尝试什么,我总是收到无效的收据.当我将收据文件作为纯文本提供或使用命令行工具编码时,我也尝试使用具有相同问题的gem Venicebase64.但同时它失败了我从我的所有应用程序中尝试的任何收据文件/Applications.

有没有人在Mac Appstore上成功实施了收据验证?

macos mac-app-store receipt-validation

6
推荐指数
1
解决办法
644
查看次数

如何使用Apples Receipt Validation Endpoint查看非消费类应用内购买是否有效

我最近根据Apples文档设置了一项服务来验证和记录我的iOS购买 .经过一些购买后,我查看了我的桌子,发现我有45次购买,状态代码为0,根据Apple的文档,这意味着它们是有效的.问题是,当我登录我的iTunes帐户时,它只记录了22次有效购买.仔细检查Apple的JSON响应状态为0后,我发现了两个变体:

{
    "status": 0,
    "environment": "Production",
    "receipt": {
        "receipt_type": "Production",
        "adam_id": 888310447,
        "app_item_id": 888310447,
        "bundle_id": "com.studioName.gameName",
        "application_version": "1.4",
        "download_id": 62010318102259,
        "version_external_identifier": 810789159,
        "request_date": "2014-12-16 15:34:17 Etc/GMT",
        "request_date_ms": "1418744057267",
        "request_date_pst": "2014-12-16 07:34:17 America/Los_Angeles",
        "original_purchase_date": "2014-07-08 18:04:28 Etc/GMT",
        "original_purchase_date_ms": "1404842668000",
        "original_purchase_date_pst": "2014-07-08 11:04:28 America/Los_Angeles",
        "original_application_version": "1.1",
        "in_app": []
    }
}
Run Code Online (Sandbox Code Playgroud)
{
    "status": 0,
    "environment": "Production",
    "receipt": {
        "receipt_type": "Production",
        "adam_id": 888310447,
        "app_item_id": 888310447,
        "bundle_id": "com.studioName.gameName",
        "application_version": "1.4",
        "download_id": 39011903209949,
        "version_external_identifier": 810789159,
        "request_date": "2014-12-16 15:11:10 Etc/GMT",
        "request_date_ms": "1418742670718",
        "request_date_pst": "2014-12-16 …
Run Code Online (Sandbox Code Playgroud)

transactions objective-c in-app-purchase ios receipt-validation

6
推荐指数
0
解决办法
1064
查看次数

使用 CommonCrypto 框架的 iOS 本地收据验证

简单的问题:是否有人设法使用CommonCrypto框架而不是执行本地收据验证OpenSSL如果是 - 是否有任何示例代码如何做到这一点?

那么,用框架替换OpenSSLApple 文档(https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html)中的所有相关内容CommonCrypto

一些看起来像解决方案的东西OSX存在于https://gist.github.com/sazameki/3026845但我想知道是否有类似的东西可用于iOS.

在此先感谢您提供任何类型的答案或建议。

iphone openssl ios commoncrypto receipt-validation

6
推荐指数
0
解决办法
481
查看次数

处理消耗品应用内购买的退款通知

根据苹果文档,要识别交易、productId 和相关日期,我们应该“在unified_receipt.latest_receipt_info 中找到product_id的最近交易”。

我的问题是如何找出product_id?我的应用程序有多个消耗品应用程序内购买。

我正在探索的一种选择是 [本地收据验证] 2 responseBody.unified_receipt.latest_receipt 字段中的收据 blob 。但是我需要identifierForVendorId,并且 identifierForVendorId 没有在请求中发送

没有提到远程收据验证,因为 Apple 在文档中明确指出“当您使用包含退款交易的收据调用 verifyReceipt 端点时,JSON 响应中不存在退款交易,自动续订订阅除外。”。

谢谢!期待听到其他人如何为他们的非订阅产品实施退款。

storekit in-app-purchase ios receipt-validation

6
推荐指数
0
解决办法
151
查看次数

我是否必须验证每个 SKPaymentTransaction 订阅的收据?

我正在我的 iOS 应用程序中实现自动续订订阅。我的事务处理看起来像这样的伪代码:

func paymentQueue(_queue: SKPaymentQueue, updatedTransactions transactions:[SKPaymentTransaction]) {
  for (t in transactions) {
    let data = Data(contentsOf: getReceiptUrl())

    //this is actually async, but for simplicity here it's just a straight return
    if verifyReceiptWithServer(data) == .success {
      print("Verified receipt successfully!")
    }
    queue.finishTransaction(t)
  }
}
Run Code Online (Sandbox Code Playgroud)

如果订阅在我的应用程序未处于活动状态时续订多次,则我可以在此处为每个产品获得不止一笔交易。有时,应用程序还会在重新安装时立即获取大量旧交易。我需要验证每笔交易吗?还是每人只做一个更好productIdentifier?或者甚至可能每次调用一次paymentQueue:updatedTransactions:?如果磁盘上的收据数据始终相同,那么我每次都会向服务器发送相同的二进制数据,有时可能会很多。

答案中的文档链接值得赞赏。

storekit ios receipt-validation skpaymenttransaction

6
推荐指数
1
解决办法
319
查看次数