Swift自动续订订阅问题

时间:2016-01-21 12:03:20

标签: ios iphone swift in-app-purchase

在过去的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}

1 个答案:

答案 0 :(得分:0)

21002 - receipt-data属性中的数据格式错误或丢失。

当您将收据转换为NSData时收据格式错误。

在iOS 7中,Apple在NSData上引入了新的base64方法,因此无需使用第三方base 64解码库,但我仍建议您尝试使用Base64编码进行收据编码。我希望这能解决你的问题。因为当我验证来自服务器端的收据时,我也面临21002的相同问题,并且此编码库在这种情况下有效。不知道如何,但它解决了我在服务器端的问题,以便接收验证电话。希望它也适合你。

按照以下步骤操作:

  1. 从此处下载Base64
  2. 在项目中添加Base64.hBase64.menter image description here
  3. 添加桥接头以在Swift类中使用Objective C文件。 enter image description here
  4. 创建Bridging Header

    1. 现在使用已添加课程的base64EncodedString()
    2. 按照我的回答了解更多细节。 In-app purchase receipt verification for auto renewal using AFNetworking objective-c