我最近根据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
我正在学习如何在我的iOS/OSX项目中添加应用内购买收据验证.
有一个很好的概述这里和WWDC14对这个话题好影片.
大量的示例代码,但每个人都跳了一步.如何导入openSSL标头.swift编译器抱怨没有这样的模块.
import Foundation
import StoreKit
import openssl //no such module ???
Run Code Online (Sandbox Code Playgroud)
在编写一行代码之前,我已经陷入困境.openssl框架隐藏在哪里?
我的应用程序包含可消耗的IAP产品,当我使用以下代码调用验证收据时返回多个事务:
[[NSBundle mainBundle] appStoreReceiptURL];
Run Code Online (Sandbox Code Playgroud)
有没有办法只返回最后一笔交易?
它与恢复交易有关吗?
我检查了restoreCompletedTransaction inapp purchase的多次收据计数,这个iOS应用内购买恢复返回了许多交易.
我试图恢复所有购买但它没有用.
我正在使用这些线路来拨打收据:
- (void) checkReceipt {
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];
NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
if(!receipt) {
}
NSError *error;
NSDictionary *requestContents = @{@"receipt-data": [receipt base64EncodedStringWithOptions:0]};
NSLog(@"requestContents:%@", requestContents);
NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents
options:0
error:&error];
if (!requestData) { }
NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL];
[storeRequest setHTTPMethod:@"POST"];
[storeRequest setHTTPBody:requestData];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest …
Run Code Online (Sandbox Code Playgroud) 在 Mac App Store 提交时,我的应用程序被拒绝,原因如下:-
“安装有效收据后,应用程序在启动时退出。控制台报告应用程序“
Exited with exit code: 173
”,操作系统声明应用程序“is damaged and can't be opened
”。这通常表明应用程序未正确验证其收据。
我根本没有在我的代码中进行任何收据验证,所以我该怎么做才能解决这个问题?它只发生在审查中,而不是在我这边。这是一个简单的 swift ui + Objective-C+ 一些用于逻辑 OS X 应用程序的 C++。使用其他应用程序(Objective-C + CPP)一切正常。
在 iOS 中进行应用内购买时,需要验证订阅的收据。消耗品也需要核对收据吗?
我尝试使用此处的 Node.js进行 IAP 收据验证,但它总是在服务器日志上返回错误:“收据数据属性中的数据格式错误。”
\n\n有人可以帮助我正确地将 Base64 字符串发送到 Node.js 并将其解码为相同的 Base64 字符串以进行收据验证吗?我对 javascript 的经验为零,并且已经尝试让这个简单的代码工作两天了,但没有成功。
\n\n这是我的 Swift 代码:
\n\nlet receiptData = try Data(contentsOf: appStoreReceiptURL, options: .alwaysMapped) \nlet receiptString = receiptData.base64EncodedString(options: [])\n\n\nvar request = URLRequest(url: URL(string: "https://us-central1-calendizer-6a849.cloudfunctions.net/receiptValidation")!)\nrequest.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")\n request.httpMethod = "POST"\n\n// attach receipt data to a request\nrequest.httpBody = receiptString.data(using: .utf8)\n\nprint("httpBody: \\(request.httpBody?.base64EncodedString())")\n\nLogs.log("\xe2\x9c\x89\xef\xb8\x8f Receipt Validation -> sending request ...")\nlet task = URLSession.shared.dataTask(with: request) { data, response, error in\n...\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n这是我的 Node.js 代码(Firebase Cloud Functions):
\n\nconst functions = require(\'firebase-functions\');\nvar …
Run Code Online (Sandbox Code Playgroud) macOS应用扩展如何如何验证应用商店收据?即验证应用内购买是否有效(并且持续有效)
\n\n显然,主捆绑包指向应用程序扩展的捆绑包,因此appStoreReceiptURL
属性Bundle
也会返回不存在的收据文件 \xe2\x80\x94 。
例如,以下代码分别打印出主包和应用程序商店收据路径。
\n\nlet mainBundle = Bundle.main\nprint("main bundle path: \\(mainBundle.bundleURL)")\nprint("receipt path: \\(String(describing: mainBundle.appStoreReceiptURL))")\n
Run Code Online (Sandbox Code Playgroud)\n\n当放置在应用程序扩展视图控制器内时viewDidLoad
,它返回如下结果:
main bundle path: file:///Users/${userName}/Library/Developer/Xcode/DerivedData/${projectBuild}/Build/Products/Debug/${mainAppName}.app/Contents/PlugIns/${appExtensionName}.appex/\nreceipt path: Optional(Contents/_MASReceipt/receipt -- file:///Users/${userName}/Library/Developer/Xcode/DerivedData/${projectBuild}/Build/Products/Debug/${mainAppName}.app/Contents/PlugIns/${appExtensionName}.appex/)\n
Run Code Online (Sandbox Code Playgroud)\n\n然而,看看.appex
捆绑包的内部,文件夹Contents/_MASReceipt/
不存在。
我正在使用 Receigen ( http://receigen.etiemble.com/ ) 为我的一款 MacOS 应用程序进行收据验证。多年来,这种方法一直运作良好,但有些事情发生了变化。我已经有一年左右没有对此应用程序进行更新并提交了更改,但由于收据验证不起作用而被拒绝。
\n\n当我尝试在本地测试收据时,它会弹出应用程序商店登录,我输入我的电子邮件+密码,然后收到“应用程序已损坏”消息。
\n\n我使用 Receigen 代码助手生成验证代码(它生成收据验证代码并尽可能随机化,这样您就不能轻松破解每个使用 receigen 的应用程序)。
\n\n我正在使用 macOS 10.14.3 和 Xcode 10.2。
\n\n这是我的 receiveigen 生成代码的标头:
\n\n// \n// This code was generated by RECEIGEN 4.0.4 on 2019-04-08 15:54:01 and will use: \n// \n// Bundle Identifier : com.inadaydevelopment.mac10biiFinancialCalculator \n// Bundle Version : 2.1.0 \n// Receipt Identifier : com.inadaydevelopment.mac10biiFinancialCalculator \n// Receipt Version : 2.1.0 \n// \n// Language : ObjC \n// Platform : OSX \n// Code Prefix : ReceiptValidation \n// Success …
Run Code Online (Sandbox Code Playgroud) 我目前正在开发的应用程序混合了非消耗性产品和自动更新订阅。看起来一两天后,购买的非消耗性产品将从沙盒收据中删除。恢复后,产品由 StoreKit 观察者回调提供,但收据中仍然缺少它们。
我已经尝试过通过 OpenSSL 进行本地验证和解析,以及通过 Apple 服务器进行远程验证,结果匹配:这些产品总是丢失。请注意,订阅永远不会发生这种情况,收据中始终存在过期和有效的订阅。另一个有趣的细节:产品不会一下子全部丢失,它们会随着采购订单逐渐消失,因为沙盒测试用户正在被“清理”。
由于 Apple 文档 在这里 声明“非消耗品、自动续订订阅项目和非续订订阅项目无限期地保留在收据中”,我希望它们在那里。
有人知道这是否是预期的沙箱行为吗?是否有任何官方的 Apple 资源说明一旦应用程序投入生产就可以了?
编辑:在此处的开发论坛中找到了某人发布的完全相同的问题。
App Store 验证收据何时被弃用?
\n这什么时候会停止工作?我\xe2\x80\x99找不到任何关于此的信息吗?
\nhttps://developer.apple.com/documentation/appstorereceipts/verifyreceipt
\nbuy.itunes.apple.com/verifyReceipt
\napp-store in-app-purchase ios receipt-validation in-app-purchase-receipt
ios ×6
swift ×5
macos ×3
storekit ×3
app-store ×1
javascript ×1
node.js ×1
objective-c ×1
openssl ×1
receigen ×1
sandbox ×1
transactions ×1