在过去的7天里,我一直在尝试创建自动续订订阅。我已经完成了没有共享密钥,我正在关注{{3并且工作代码是在云上存储信息。我想使用Reciept Validation但是教程中的代码充满了bug,而且PHP代码也充满了错误。我找到了另一个免费教程,但是同样的事情,只有错误,没有办法让它运行。到现在我已经搜索了整个GitHub,我已经支付了Lynda教程,并发现了很多其他教程,但没有它们正在工作。是否有任何教程,你可能会建议我,或者你可以帮我解决这个问题。
这是包含2个错误的快速代码: tutorial func validateReceipt(){
var receiptUrl = NSBundle.mainBundle().appStoreReceiptURL
var receipt: NSData = NSData.dataWithContentsOfURL(receiptUrl!, options: nil, error: nil)
var response: NSURLResponse?
var error: NSError?
var receiptdata:NSString = receipt.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
var request = NSMutableURLRequest(URL: NSURL(string: "http://mm214.com/write.php")!)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var err: NSError?
request.HTTPBody = receiptdata.dataUsingEncoding(NSASCIIStringEncoding)
var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in
var err: NSError?
var json = NSJSONSerialization.JSONObjectWithData(data, options: .MutableLeaves, error: &err) as? NSDictionary
if err != nil {
print(err!.localizedDescription)
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Error could not parse JSON: '\(jsonStr)'")
}
else {
if let parseJSON = json {
println("Receipt \(parseJSON)")
}
else {
let jsonStr = NSString(data: data!, encoding: NSUTF8StringEncoding)
print("Receipt Error: \(jsonStr)")
}
}
})
task.resume()
这是php代码:
<?php
function getReceiptData($receipt)
{
$fh = fopen('showme.txt',w);
fwrite($fh,$receipt);
fclose($fh);
$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.'","password":"shared secreet"}';
$info = getReceiptData($new);
?>
我在31行收到错误:
警告:strpos():空针 第31行/home2/arslan/public_html/verifyReciep.php {“status”:21002}
答案 0 :(得分:0)
21002 - receipt-data属性中的数据格式错误或丢失。
当您将收据转换为NSData
时收据格式错误。
在iOS 7中,Apple在NSData上引入了新的base64方法,因此无需使用第三方base 64解码库,但我仍建议您尝试使用Base64编码进行收据编码。我希望这能解决你的问题。因为当我验证来自服务器端的收据时,我也面临21002的相同问题,并且此编码库在这种情况下有效。不知道如何,但它解决了我在服务器端的问题,以便接收验证电话。希望它也适合你。
按照以下步骤操作:
Base64.h
和Base64.m
。
base64EncodedString()
。按照我的回答了解更多细节。 In-app purchase receipt verification for auto renewal using AFNetworking objective-c