zoukankan      html  css  js  c++  java
  • IOS内购项目支付审核被拒(错误状态码21007)原因及如何区分订单是沙盒环境还是真实环境

      IOS提交审核又被拒了,原因是IOS内购项目,购买时报错21007。那么我们就来研究下原因。

    一、被拒原因

      在测试环境中,我们会连接苹果的测试服务器(https://sandbox.itunes.apple.com/verifyReceipt)验证,

      但是当我们部署在线上的正式服务器中,我们会连接苹果的正式服务器(https://buy.itunes.apple.com/verifyReceipt )验证。

      我们提交给苹果审核的是正式版,我们以为苹果审核时,我们应该连接苹果的线上验证服务器来验证购买凭证。而实际上苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,但是审核的app又是连接的我们的线上服务器,所以我们这边的服务器无法验证通过IAP购买,造成我们app的又一次审核被拒。

      苹果反馈的状态码:

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

      我们可以看到21007状态码的意思。所以我们需要改一下,根据是沙箱环境,还是正式环境来连接不同的苹果服务器来验证。

    二、如何区分沙箱环境和正式环境

    1、In-App Purchase 内购项目类型

      在如何区分之前,我们先要区分一下app内购项目中的类型:

    (1)消耗型项目:对于消耗型App内购买项目,用户每次下载时都必须进行购买。一次性服务通常属于消耗型项目,例如钓鱼App 中的鱼饵。

    (2)非消耗型项目:对于非消耗型App内购买项目,用户仅需要购买一次。不会过期或随使用而减少的服务通常为非消耗型项目,例如游戏App 的新跑道。

    (3)自动续订订阅:通过自动续订订阅,用户可以购买指定时间期限内的更新和动态内容。除非用户取消选择,否则订阅(例如杂志订阅等)会自动续订。

    (4)免费订阅:通过免费订阅,开发者可以将免费订阅内容放入“报刊杂志”。用户注册免费订阅后,该订阅内容将会出现在与该用户Apple ID 关联的所有设备上。请注意,免费订阅不会过期,并且仅在支持报刊杂志功能的 App 中提供。

    (5)非续订订阅:非续订订阅允许有时限性的营销服务。对于 App 内购买项目中的限时访问内容,就需使用非续订订阅。例如,导航App 中语音导航功能的一周订阅,或者年度订阅已存档的视频或音频的在线目录。

    2、验证环境

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

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

    (1)根据收据字段 environment = sandbox。

    (2)根据收据验证接口返回的状态码。 如果status=21007,则表示当前的收据为沙盒环境下收据, 再连接正式环境进行验证。

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

      建议:

      为保证审核的通过,需要在客户端或server进行双重验证,即:先以线上交易验证地址进行验证,如果苹果正式验证服务器的返回验证码code为21007,则再一次连接沙盒测试服务器进行验证即可。

      在应用提审时,苹果IAP提审验证时是在沙盒环境的进行的,即:苹果在审核App时,只会在sandbox环境购买,其产生的购买凭证,也只能连接苹果的测试验证服务器,如果没有做双验证,需要特别注意此问题,否则会被拒。

  • 相关阅读:
    Spring.NET学习笔记
    开源项目地址
    委托的实现匿名函数和朗姆达表达式
    c#事件与委托
    c# 时间戳转换
    List 排序
    DDD的好文章
    【转】理解JMeter聚合报告(Aggregate Report)
    【转】JMeter 通过 JDBC 访问 Oracle 和 MySQL
    【转】使用JMeter测试你的EJB
  • 原文地址:https://www.cnblogs.com/goloving/p/14352125.html
Copyright © 2011-2022 走看看