【发布时间】:2015-12-26 11:11:44
【问题描述】:
我正在尝试在我的服务器端使用收据验证。一切正常,但有时我看到奇怪: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 {
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 = 'https://sandbox.itunes.apple.com/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);
我所做的一切都基于示例http://www.brianjcoleman.com/tutorial-receipt-validation-in-swift/
所以,有时我觉得应用程序向服务器端发送错误的收据并且 php 脚本无法解析它,我收到 21002 错误状态。有什么建议吗?
【问题讨论】:
-
对我有用的是在您的 PHP 代码中替换: $new = '{"receipt-data":"'.$new.'"}';通过这个: $new = json_encode('{"receipt-data":"'.$new.'"}');我假设你的 Swift 代码是正确的。
-
@Heitor 错误答案。你找到解决办法了吗?
-
是的,我的应用程序现在正在正确验证收据。你为什么说我的评论/答案是错误的?
-
@Heitor:如果我错了,请纠正我,但我认为你的意思是
json_encode(["receipt-data" => $new])而不是......在你的评论中你的 JSON 编码已经是一个 JSON 字符串 -
老实说,我不记得发表评论时的上下文了,但是您尝试过该代码吗?我现在只记得在我的 APNS 完全开始工作之前我面临的最后一个挑战是一个 UTF-8 问题,可能是由于 PHP 5.6+ 升级,当时我使用 json_last_error() 来跟踪问题所在。希望对你有用。
标签: php ios in-app-purchase applepay receipt-validation