IAP_支付本地验证



#pragma mark 本地验证购买凭据

- (void)verifyPruchase:(SKPaymentTransaction *)transaction

{

     // transaction.transactionReceipt

    

    //验证凭据,获取到苹果返回的交易凭据

     //appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址

        NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL];

     //从沙盒中获取到购买凭据

        NSData *receiptData = [NSData dataWithContentsOfURL:receiptURL];

    

    //发送网络POST请求,对购买凭据进行验证

        NSURL *url = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];

//      NSURL *url = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"];

    //国内访问苹果服务器比较慢,timeoutInterval需要长一点

        NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10.0f];

        request.HTTPMethod = @"POST";

    

    //在网络中传输数据,大多情况下是传输的字符串而不是二进制数据

    //传输的是BASE64编码的字符串

    /**

     BASE64 常用的编码方案,通常用于数据传输,以及加密算法的基础算法,传输过程中能够保证数据传输的稳定性

     BASE64是可以编码和解码的

     */

       NSString *encodeStr = [receiptData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

        NSString *payload = [NSString stringWithFormat:@"{\"receipt-data\" : \"%@\"}", encodeStr];

        NSData *payloadData = [payload dataUsingEncoding:NSUTF8StringEncoding];

    

        request.HTTPBody = payloadData;

    

//     提交验证请求,并获得官方的验证JSON结果

        NSData *result = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

    

//     官方验证结果为空

        if (result == nil) {

            VCShowAlert(@"验证失败");

        }

        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];

    

        NSLog(@"%@", dict);

    

        if (dict != nil) {

     //比对字典中以下信息基本上可以保证数据安全

     //bundle_id&application_version&product_id&transaction_id

            VCShowAlert(@"验证成功");

        }

    

}


你可能感兴趣的:(苹果内购,iOS本地验证,IAP本地验证)