2017-02-02 124 views
0

我在App Store上有一个应用程序,它有一个应用程序内购买功能。 应用内购买工作了几个月没有问题,但突然它停止收据验证工作。 我不知道为什么,因为代码没有改变。应用程序内购买错误

有没有人可以为此遮光? 苹果最近是否改变了一些关于应用程序内购买的内容?

非常感谢! Eduardo Rangel

+0

但是你也需要改变PurchaseReceipts在主函数中,否则沙箱环境中这仅适用,而不是在App Store这样的人仍然将无法进行购买所有的时间和大部分时间都失败了。 –

回答

0

如果您正在使用CargoBay的第三方库验证收据,该框架已经有一段时间一直在遭受证书过期,并且不再全面工作,但是有一项工作可以使其部分工作,但是我不确定这是你的情况。

如果您正在使用CargoBay,请在CBPurchaseInfoFromTransactionReceipt中进行以下更改并注释掉将禁用本地安全检查一部分的代码部分。

NSDictionary * CBPurchaseInfoFromTransactionReceipt(NSData *transactionReceiptData, NSError * __autoreleasing *error) { 
NSDictionary *transactionReceiptDictionary = [NSPropertyListSerialization propertyListWithData:transactionReceiptData options:NSPropertyListImmutable format:nil error:error]; 
if (!transactionReceiptDictionary || ![transactionReceiptDictionary respondsToSelector:@selector(objectForKey:)]) { 
    return nil; 
} 

NSString *purchaseInfo = [transactionReceiptDictionary objectForKey:@"purchase-info"]; 
NSDictionary *purchaseInfoDictionary = [NSPropertyListSerialization propertyListWithData:CBDataFromBase64EncodedString(purchaseInfo) options:NSPropertyListImmutable format:nil error:error]; 
if (!purchaseInfoDictionary) { 
    return nil; 
} 

// Comment this section skipping local purchase validation. It's failing in Sandbox due to the old hardcoded certificate from April 2016, and it will move to Production in mid May 2016. 
// Cargobay will still verify the purchase with the Apple Sandbox/Production server after skipping the local verification. Hopefully update hardcoded certificate 
// in order to move back to Cargobay repository. 

/* 
NSString *signature = [transactionReceiptDictionary objectForKey:@"signature"]; 
NSDate *purchaseDate = CBDateFromDateString([purchaseInfoDictionary objectForKey:@"purchase-date"]); 

if (!CBCheckReceiptSecurity(purchaseInfo, signature, purchaseDate)) { 
    if (error) { 
     NSMutableDictionary *userInfo = [NSMutableDictionary dictionary]; 
     [userInfo setValue:NSLocalizedStringFromTable(@"Cannot extract purchase info from transaction receipt because purchase info failed to validate against its signature.", @"CargoBay", nil) forKey:NSLocalizedDescriptionKey]; 
     [userInfo setValue:NSLocalizedStringFromTable(@"Purchase info failed to validate against its signature.", @"CargoBay", nil) forKey:NSLocalizedFailureReasonErrorKey]; 
     *error = [NSError errorWithDomain:CargoBayErrorDomain code:CargoBayErrorCannotExtractPurchaseInfoFromTransactionReceipt userInfo:userInfo]; 
    } 

    return nil; 
} 
*/ 

return purchaseInfoDictionary; 

}

+0

是的,我正在使用CargoBay。不知道lib有这个问题。你知道任何工作吗?最好的解决方案是删除lib并自己实现这部分,对吧? – edmoks

+0

我更新了我的答案,您可以在CargoBay.m中进行更改,并尽快构建和更新您的应用程序。并且不要忘记接受答案,谢谢 –