IOS收据验证错误21002

编程入门 行业动态 更新时间:2024-10-09 20:30:29
本文介绍了IOS收据验证错误21002的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我正在尝试在服务器端使用收据验证。一切都很好,但有时我看到很奇怪:10次验证是可以的,但在11我得到21002错误。我不知道该怎么办。有时我在启动应用程序后第一次验证收据时会收到错误21002.

I'm trying to use receipt validation with my server side. Everything is ok, but sometimes I see strange: 10 times validation is OK, but on 11 i get 21002 error. I dont know what to do. Sometimes I get error 21002 when I validate receipt first time after launch app.

应用程序端:

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 { if String(parseJSON["status"]! == "ok" { //do something print("Validate OK") }else{ print("Validate NOK") } } else { let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding) print("Receipt Error: \(jsonStr)") } } }) task.resume() }

服务器端php脚本:

function getReceiptData($receipt) { $endpoint = 'sandbox.itunes.apple/verifyReceipt'; $ch = curl_init($endpoint); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $receipt); $response = curl_exec($ch); $errno = curl_errno($ch); $errmsg = curl_error($ch); curl_close($ch); $msg = $response.' - '.$errno.' - '.$errmsg; echo $response; } foreach ($_POST as $key=>$value){ $newcontent .= $key.' '.$value; } $new = trim($newcontent); $new = trim($newcontent); $new = str_replace('_','+',$new); $new = str_replace(' =','==',$new); if (substr_count($new,'=') == 0){ if (strpos('=',$new) === false){ $new .= '='; } } $new = '{"receipt-data":"'.$new.'"}'; $info = getReceiptData($new);

我所做的一切都基于示例 www.brianjcoleman/tutorial-receipt-validation-in-swift/

Everything I do based on example www.brianjcoleman/tutorial-receipt-validation-in-swift/

所以,有时我觉得应用程序发送到服务器端错误的收据和PHP脚本无法解析它,我收到21002错误状态。有什么建议吗?

So, sometimes I feel that app send to serverside wrong receipt and php script cant parse it and I receive 21002 error status. Any suggestion?

推荐答案

尝试从收据中删除字符'\ n'和'\ r'并将'+'替换为'%2B',然后再将其发送到服务器。这样的事情:

Try removing from receipt the characters '\n' and '\r' and replacing '+' with'%2B' before sending it to the server. Something like this:

NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; NSString *receiptDataString = [receipt base64EncodedStringWithOptions:0]; receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"]; receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"\n" withString:@""]; receiptDataString=[receiptDataString stringByReplacingOccurrencesOfString:@"\r" withString:@""]; NSString *postDataString = [NSString stringWithFormat:@"receipt-data=%@", receiptDataString]; NSString *length = [NSString stringWithFormat:@"%lu", (unsigned long)[postDataString length]]; [request setValue:length forHTTPHeaderField:@"Content-Length"]; [request setHTTPBody:[postDataString dataUsingEncoding:NSASCIIStringEncoding]];

更多推荐

IOS收据验证错误21002

本文发布于:2023-11-26 09:06:35,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1633492.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:收据   错误   IOS

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!