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

来源:互联网 发布:阿里巴巴软件开发人员 编辑:程序博客网 时间:2024/05/22 11:41

- (void)completeTransaction:(SKPaymentTransaction *)transaction {

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

     // appStoreReceiptURL iOS7.0增加的,购买交易完成后,会将凭据存放在该地址 
    NSURL *receiptURL = [[NSBundlemainBundle] appStoreReceiptURL];

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

    NSData *receipt = [NSDatadataWithContentsOfURL:receiptURL];

    if(!receipt) {

        /* No local receipt -- handle the error. */

    }


     // 发送网络POST请求,对购买凭据进行验证
     NSURL *url = [NSURL URLWithString:ITMS_SANDBOX_VERIFY_RECEIPT_URL];
     // 国内访问苹果服务器比较慢,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) {
         NSLog(@"验证失败");
     }
     
     NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:result options:NSJSONReadingAllowFragments error:nil];
     
     NSLog(@"%@", dict);
     
     if (dict != nil) {
         // 比对字典中以下信息基本上可以保证数据安全
         // bundle_id&application_version&product_id&transaction_id
         NSLog(@"验证成功");
     }
}

0 0
原创粉丝点击