我对在哪里可以找到验证常规应用内购买所需的共享秘密感到困惑。
大约一年前,我创建了一个服务器脚本,该脚本从我的 iOS 应用程序调用,以使用 Apples.../verifyReceipt
端点验证 App Store 收据。
这在去年运行良好,现在我想扩展脚本以对第二个应用程序执行相同的操作。
问题:我不记得在哪里可以找到必须与收据一起发送给 Apple的应用程序共享机密。
第一个应用程序(“MyApp”)的秘密存储在脚本中。但是我无法在 App Store Connect 中重新找到它。
这显示了 MyApp 没有特定于应用程序的共享机密而只有主共享机密的信息。我可以显示主共享密钥,但它与验证脚本中存储的不同。
此外,信息文本说,特定于应用程序的共享机密用于验证自动更新订阅。与消耗性或非消耗性 IAP 无关。
因此,我认为这不是我正在寻找的共享秘密。但是我还能在哪里找到正确的共享密钥(已经存储在我的脚本中的那个?)
我在哪里可以找到我的新应用程序的秘密?
假设一位客户在Mac App Store中购买了我的付费应用,然后向Apple询问并获得了退款.Apple是否会以某种方式使收据无效以使应用程序无法再使用?如果是这样,收据中是否有某种标志表明它已退款,我应该在收据验证期间进行测试?
我发现了cancellation_date
字段(Apple技术说明),但它似乎只适用于订阅或应用内购买.如何退还整个付费应用程序,是否可以检查?
似乎答案过去是"不,Apple不会使退款的Mac应用程序收据失效,用户可以继续使用该应用程序",我想知道最近是否有所改变.
谢谢!
macos objective-c app-store mac-app-store receipt-validation
我有一个应用程序,我最近更新,以便在应用程序购买中使用.之前的版本(付费但没有在应用内购买)是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) 在生产环境中,如果用户进行应用内购买,然后更新到应用的较新版本,那么反映应用内购买仍然存在于捆绑中的收据?或者它是否被应用更新消灭了?
我有一个付费的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视频 …
我已将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上成功实施了收据验证?
我最近根据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
简单的问题:是否有人设法使用CommonCrypto
框架而不是执行本地收据验证OpenSSL
如果是 - 是否有任何示例代码如何做到这一点?
那么,用框架替换OpenSSL
Apple 文档(https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html)中的所有相关内容CommonCrypto
?
一些看起来像解决方案的东西OSX
存在于https://gist.github.com/sazameki/3026845但我想知道是否有类似的东西可用于iOS
.
在此先感谢您提供任何类型的答案或建议。
根据苹果文档,要识别交易、productId 和相关日期,我们应该“在unified_receipt.latest_receipt_info 中找到product_id的最近交易”。
我的问题是如何找出product_id?我的应用程序有多个消耗品应用程序内购买。
我正在探索的一种选择是 [本地收据验证] 2 responseBody.unified_receipt.latest_receipt 字段中的收据 blob 。但是我需要identifierForVendorId,并且 identifierForVendorId 没有在请求中发送。
我没有提到远程收据验证,因为 Apple 在文档中明确指出“当您使用包含退款交易的收据调用 verifyReceipt 端点时,JSON 响应中不存在退款交易,自动续订订阅除外。”。
谢谢!期待听到其他人如何为他们的非订阅产品实施退款。
我正在我的 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:
?如果磁盘上的收据数据始终相同,那么我每次都会向服务器发送相同的二进制数据,有时可能会很多。
答案中的文档链接值得赞赏。
ios ×7
storekit ×4
iphone ×2
macos ×2
objective-c ×2
app-store ×1
commoncrypto ×1
ios11 ×1
ios7 ×1
openssl ×1
swift ×1
transactions ×1