【问题标题】:How to implement iOS Auto Renew Subscription receipt validation for iOS app如何为 iOS 应用实现 iOS 自动续订订阅收据验证
【发布时间】:2016-02-25 01:30:06
【问题描述】:

我想发布一个具有自动续订订阅的 iOS 应用。虽然有大量关于这方面的信息,但很多都已经过时了,所以我将说明我到目前为止所取得的成就。

  1. 我正在使用 Swift 2.0,所以任何客观的 C 代码都对我没有帮助。

  2. 我不会使用自己的服务器与 Apple 通信来验证收据,所以我认为我需要让应用程序直接与 Apple 服务器通信,或者我可以在设备上本地解析收据。

  3. 我已经能够使用以下代码在设备上找到一张收据(不确定是否有多个)

    func checkForReceipt() {
        let receiptUrl = NSBundle.mainBundle().appStoreReceiptURL
    
        let fileExists = NSFileManager.defaultManager().fileExistsAtPath(receiptUrl!.path!)
    
        if fileExists {
    
            let receiptData = NSData(contentsOfURL: receiptUrl!)
    
            //Now what do I do to decode the data and validate the receipt
    
        } else{
            requestReceipt()
        }
    }
    

但是,我不知道如何解码收据,以便确定到期日期和其他验证步骤,以确保它是有效的收据。

我不得不说,对于开发人员来说非常重要和有用的东西却如此难以理解和定位,这令人非常沮丧。非常感谢任何帮助,并希望对其他人有用。

【问题讨论】:

    标签: ios in-app-purchase swift2 auto-renewing receipt-validation


    【解决方案1】:

    这是一个 link 我觉得很有帮助

    如果我的代码不清楚,请参考它

    下面是我用来检查我的 ar-iap 订阅状态​​的功能代码

    进一步阅读下文,了解关于作为评论找到的每个对应 * 的一些额外信息

    func checkForReceipt() {
        let receiptUrl = NSBundle.mainBundle().appStoreReceiptURL
    
        let fileExists = NSFileManager.defaultManager().fileExistsAtPath(receiptUrl!.path!)
    
        if fileExists {
    
            let receiptData = NSData(contentsOfURL: receiptUrl!)
    
            let receiptToString = receiptData!.base64EncodedStringWithOptions([])
            let dict = ["receipt-data" : receiptToString, "password" : "YOUR SHARED SECRET"] //**
            do {
                let request = try NSJSONSerialization.dataWithJSONObject(dict, options: []) as NSData!
                let storeURL = NSURL(string:"https://sandbox.itunes.apple.com/verifyReceipt")! //***
                let storeRequest = NSMutableURLRequest(URL: storeURL)
                storeRequest.HTTPMethod = "POST"
                storeRequest.HTTPBody = request
    
                let session = NSURLSession(configuration: NSURLSessionConfiguration.defaultSessionConfiguration())
                let dataTask = session.dataTaskWithRequest(storeRequest, completionHandler: { (data: NSData?, response: NSURLResponse?, connection: NSError?) -> Void in
                    do {
                        let jsonResponse: NSDictionary = try (NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? NSDictionary)!
                        //****
                        let expDate: NSDate = self.expirationDateFromResponse(jsonResponse)!
                        print(expDate)
                    } catch {
                         //handle NSJSONSerialization errors
                    }
    
                })
                dataTask.resume()
            } catch {
                //handle NSJSONSerialization errors
            }
        } else {
            requestReceipt()
        }
    }
    

    ** 您可以从您的 iTunes Connect 帐户获取共享密钥: 转到 MyApps > "yourappname" > Features > View Shared Secret > Generate Shared Secret 然后在dict的密码字段中插入您生成的秘密

    *** 确保在生产时将 storeURL 更改为“https://buy.itunes.apple.com/verifyReceipt

    **** expireDateFromResponse(jsonResponse: NSDictionary) -> NSDate?是一个函数,它读取苹果的json响应并返回ar iap的过期日期

    【讨论】:

    • 请注意上面链接的 Apple 文档中的以下注释:“重要提示:不要从您的应用调用 App Store 服务器 /verifyReceipt 端点。” 您将要做什么取而代之的是 a) 将收据发送到您自己的服务器后端进行验证,这反过来会在 Apple 的服务器上调用 /verifyReceipt,或者 b) 使用 OpenSSL / ASN.1 在本地验证收据,如下所述:developer.apple.com/library/archive/releasenotes/General/…
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    相关资源
    最近更新 更多