如何验证服务器上的ios In-App Purchase

Mar*_*vec 22 app-store in-app-purchase ios

我打算构建我的第一个应用内购买应用.我想知道是否有办法验证您的服务器上的购买.

我必须建立整个用户管理,我想知道所有注册用户他们已经在他们的iOS设备上购买了什么,以便他们免费获得网络应用程序,或类似的东西.那么,如果这个用户已经购买了一些产品,我有办法检查Apple商店吗?

编辑:

场景是这样的:

用户A在移动设备上购买应用程序B. 在此之后,我想检查我的服务器(在我的网页上,...),如果用户A被购买了应用程序B,或(类似)用户A购买了哪个应用程序.

我不想从移动设备向用户A购买应用程序B的服务器发送消息,因为即使他们没有购买应用程序B,用户也可以在服务器上重现此呼叫.

如果用户A买了应用程序B,我会检查服务器端的惠特应用商店.

s4y*_*s4y 25

获取应用程序的收据(从文件处[[NSBundle mainBundle] appStoreReceiptURL])并将其发送到您的服务器.然后......

  • 解析收据,并按照此处所述(在您的服务器上,而不是在应用程序中)检查Apple签名的签名.要么,

  • 将收据(再次,从您的服务器)发送到应用商店进行验证,如此处所述.


Dan*_*erz 5

我刚刚发布了一个简单的 Python/Django Web 应用程序(应用内购买收据验证器),它会自动处理这个过程中烦人的部分(即,在保持加密完整性的同时验证服务器上的收据)。代码本身相对简单,但我想其他人会很高兴不必在这里做繁重的工作。

要使用它,只需确保您准备好特定于应用程序的共享密钥,然后转到此处并单击“部署到 Heroku”。您的应用程序将在一分钟内启动并运行。

我还提供了一些示例代码,用于说明如何使用此 Web 应用程序在应用程序中验证收据。使用 Swift 4:

guard let receiptURL = Bundle.main.appStoreReceiptURL,
    let data = try? Data(contentsOf: receiptURL) else {
      return
}

let encodedData = data.base64EncodedData(options: [])
let url = URL(string: "https://your-app.herokuapp.com/verify")!

var request = URLRequest(url: url)
request.httpBody = encodedData
request.httpMethod = "POST"

let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
    guard let data = data,
        let object = try? JSONSerialization.jsonObject(with: data, options: []),
        let json = object as? [String: Any] else {
            return
    }

    // Your application logic here.
}
task.resume()
Run Code Online (Sandbox Code Playgroud)

注意:StackOverflow 上还有其他解决方案建议完全在应用程序内部进行验证,但我强烈建议不要这样做。来自 Apple 在Receipt Validation Programming Guide 中的文档:

使用受信任的服务器与 App Store 通信。使用您自己的服务器,您可以将 app 设计为仅识别和信任您的服务器,并确保您的服务器与 App Store 服务器连接。无法直接在用户设备和 App Store 之间建立可信连接,因为您无法控制该连接的任何一端。

可能会进一步改进以在响应标头中添加某种加密签名,以便您的应用程序可以检查响应是否安全,但我可能会在未来的版本中添加它。完毕 :)