我已经搜索过但找不到任何方法来延迟显示消息:“您的购买成功”以等到验证收据完成。
我试图引用该行,SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)但该消息仍然会触发。
func paymentQueue(queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
print("Received Payment Transaction Response from Apple");
for transaction:AnyObject in transactions {
if let trans:SKPaymentTransaction = transaction as? SKPaymentTransaction{
switch trans.transactionState {
case .Purchased:
print("Product Purchased");
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
// validate receipt and update money
validateReceipt(trans.payment.productIdentifier)
break;
case .Failed:
print("Purchased Failed");
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
self.indicator.Hide()
break;
case .Restored:
print("restored")
SKPaymentQueue.defaultQueue().finishTransaction(transaction as! SKPaymentTransaction)
//[self restoreTransaction:transaction];
self.indicator.Hide()
break;
default:
break;
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 我想发布一个具有自动续订订阅的iOS应用。尽管有大量有关此方面的信息,但很多信息已经过时了,因此我将陈述到目前为止所取得的成就。
我正在使用Swift 2.0,因此任何客观的C代码都无济于事。
我不会使用自己的服务器与Apple进行通讯以验证收据,因此我相信我需要使应用程序直接与Apple服务器进行通讯,或者我可以在设备上本地解析收据。
我可以使用以下代码在设备上找到收据(不确定是否有多张收据)
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()
}
}
Run Code Online (Sandbox Code Playgroud)但是,我无法弄清楚如何对收据进行解码,因此可以确定到期日期和其他验证步骤以确保它是有效的收据。
我不得不说,令人沮丧的是,对于开发人员来说非常重要和有用的事情必须如此难以遵循和定位。我们非常感谢您的帮助,希望对其他许多人有所帮助。
我想从应用程序的收据中阅读原始应用程序版本.
在开发过程中,应用程序不包含收据,因为它没有从商店安装.我需要开始一个SKReceiptRefreshRequest以获得沙盒收据.但这会提示用户登录.
所以这就是问题:如果应用程序是从生产中的商店下载的,它是否保证包含收据?因为如果不是,我需要启动刷新请求,这会提示用户输入凭据.如果没有上下文,我不想这样做.
如果它不可用,这个案例的最佳做法是什么?纳入SKReceiptRefreshRequest"恢复购买"程序?
PS:该应用仅适用于iOS 9+.
我很担心 Apple 的退款流程。据我了解,如果客户要求苹果退款并且苹果接受退款,则不会通知应用程序的所有者,而是所有者应与苹果一起监视收据数据以查找收据中的取消日期字段。
Apples 说...... “如果该字段中有日期,无论订阅的到期日期如何,购买都已被取消 - 将取消的收据视为从未进行过购买一样”(这是推荐的过程)
现在,我想知道是否可以从 iTunes Connect 手动检测退款并获取取消产品的收据数据?我不得不说我无权访问“付款和财务报告”部分来检查这是否可能,这就是我要问的原因。
我正在尝试使用我的服务器端的收据验证.一切都很好,但有时我看到很奇怪:10次验证是可以的,但在11我得到21002错误.我不知道该怎么办.当我在启动应用程序后第一次验证收据时,有时会收到错误21002.
应用方面:
func validateReceipt(productID: String) {
let receipt = NSData(contentsOfURL: NSBundle.mainBundle().appStoreReceiptURL!)!
let receiptdata = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
let request = NSMutableURLRequest(URL: NSURL(string: "my_server_url")!)
let session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
request.HTTPBody = receiptdata.dataUsingEncoding(NSUTF8StringEncoding)
let task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
let json = try! NSJSONSerialization.JSONObjectWithData(data!, options: .MutableLeaves) as? NSDictionary
if (error != nil) {
print(error!.localizedDescription)
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Error could not parse JSON: '\(jsonStr)'")
}
else {
if let parseJSON = json { …Run Code Online (Sandbox Code Playgroud) 我在调试 Apple 的应用内购买收据时遇到问题。尽管购买已经过期,但“is_Trial_period”字段似乎仍然有效。据我了解,苹果定义了较短的调试订阅周期,如下所示:
这些时间也适用于试用期吗?
testing subscriptions in-app-purchase ios receipt-validation
为了在SwiftiOS 应用程序中设置收据验证(使用In-App-Purchase),我正在学习本教程:https : //www.raywenderlich.com/9257-in-app-purchases-receipt-validation-tutorial并在此处阅读:验证苹果公司签署了收据。
这是我目前遇到的一个问题。
在代码中我有这个:
Bundle.main.url(forResource: "AppleIncRootCertificate", withExtension: "cer")
Run Code Online (Sandbox Code Playgroud)
当我检查它的值时,它是零。由于它应该用于提取更多信息,因此它显然不应为零。问题是:代码或某些设置中可能有什么问题使此为零?
这是我第一次实现收据验证,所以很可能我遗漏了一些基本的东西。