iOS In-App Purchase 内购之 验证订单是沙盒环境还是真实环境

本文介绍了如何在iOS中识别内购收据是在沙盒环境还是生产环境。主要方法包括检查收据字段`environment`或根据验证接口返回的状态码,如状态码21007表示沙盒环境。建议在验证时首先尝试线上环境,若得到21007则切换到沙盒环境验证,以确保通过苹果的IAP审核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试环境

在sandbox中验证receipt:https://sandbox.itunes.apple.com/verifyReceipt

在生产环境中验证receipt:https://buy.itunes.apple.com/verifyReceipt

那么如何自动的识别收据是否是sandbox receipt呢?
识别沙盒环境下收据的方法有两种:

  1. 根据收据字段 environment = sandbox。
  2. 根据收据验证接口返回的状态码。
    如果status=21007,则表示当前的收据为沙盒环境下收据, t进行验证。

苹果反馈的状态码:

  • 21000 App Store无法读取你提供的JSON数据
  • 21002 收据数据不符合格式
  • 21003 收据无法被验证
  • 21004 你提供的共享密钥和账户的共享密钥不一致
  • 21005 收据服务器当前不可用
  • 21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
  • 21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证
  • 21008 收据信息是产品环境中使用,但却被发送到测试环境中验证

注意:

在verifyWithRetry方法中,首先向向真实环境验证票据,如果是21007则向沙盒环境验证;==但是在消耗品类型的测试中,使用沙盒票据在真实环境中验证票据得到返回码:21002.所以下面代码在真实环境运行时,沙盒测试消耗型商品得不到正确的验证结果==。

/*
    verifyWithRetry the receipt
*/
    IAPVerifier.verifyWithRetry = function(receipt, isBase64, cb) {
     
        var encoded = null, receiptData = {};
        if (isBase64) {
     
            encoded = receipt;
        } else {
     
            encoded = new Buffer(receipt).toString('base64');
        }
        receiptData['receipt-data'] = encoded;
        var options = this.requestOptions();
        return this.verify(receiptData, options, (function(_this) {
     
            return function(error, data) {
     
            if (error) return cb(error);
            if ((21007 === (data != null ? data.status : void 0)) && (_this.productionHost == _this.host)) {
     
                var options_this.requestOptions();
                // 指向沙盒测试环境再次验证
                options.host = 'sandbox.itunes.apple.com/verifyReceipt';
                return _this.verify(receiptData, options, function(err, data) {
     
                    return cb(err, data);
                });
            } else {
     
                return cb(err, data);
          }
        };
      })(this));
    };


    /*
      verify the receipt data
     */

    IAPVerifier.verify = function(data, options, cb) {
     
        var post_data, request;
        post_data = JSON.stringify(data);
        options.headers = {
     
            'Content-Type': 'application/x-www-form-urlencoded', 
            'Content-Length': post_data.length
            };
        var request = https.request(options, (function(_this) {
     
            return function(response) {
     
                var response_chunk = [];
                response.on('data', function(data) {
     
                if (response.statusCode !== 200) {
     
                    return cb(new Error("response.statusCode != 200"));
                }
                response_chunk.push
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值