iOS 内购支付两种模式

作者: 山杨 | 来源:发表于2016-04-05 22:31 被阅读4709次

    ·内置模式
    ·服务器模式

    内置模式的流程:

    1. app从app store 获取产品信息
    2. 用户选择需要购买的产品
    3. app发送支付请求到AppStore
    4. AppStore处理支付请求,返回transaction信息
    5. app将购买的内容展示给用户

    服务器模式的流程:

    1. app从服务器获取产品标识列表
    2. app从app store 获取产品信息
    3. 用户选择需要购买的产品
    4. app 发送支付请求到AppStore
    5. AppStore处理支付请求,返回transaction信息
    6. app将 transaction receipt 发送到服务器
    7. 服务器收到收据后发送到app stroe验证收据的有效性
    8. app store 返回收据的验证结果
    9. 根据app store 返回的结果决定用户是否购买成功

    上述两种模式的不同之处主要在于:交易的收据验证,内建模式没有专门去验证交易收据,而服务器模式会使用独立的服务器去验证交易收据。内建模式简单快捷,但容易被破解。服务器模式流程相对复杂,但相对安全

    开发之初,苹果官方就很负责的告知:我们的服务器不稳定。真正开发之后,发现苹果方果然是很负责的,不仅是不稳定,而且足够慢。app store server验证一个收据需要3-6s时间

    1. 用户能否忍受3-6s的等待时间
    2. 如果app store server 宕机,如何确保成功付费的用户能够得到正常服务。

    对于第一个问题,我们有理由相信用户完全无法忍受,所以采用异步验证的方式,服务器收到客户端的请求后,就将请求放到MCQ中去处理。
    对于第二个问题,由于苹果人员很负责人的告知:我们的服务器不稳定,所以不排除收据验证超时的情况。对于验证超时的收据,保存到数据库中并标记为验证超时,定时任务每隔一定的时间去app store验证,确保能够获取收据的验证结果。

    在开发过程中,需要测试应用是否能够正常的进行支付,但是又不能进行实际的支付,因此需要使用苹果提供的sandbox Store测试。Store Kit不能在iOS模拟器中使用,测试Store必须在真机上进行

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

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

    在实际开发过程中,服务器端通过issandbox字段标识客户端传递的收据是沙盒环境中的收据还是生产环境中的收据。在提交苹果审核前,沙盒测试均无问题。提交苹果审核后,被告知购买失败,审核未通过。通过查询日志发现,客户端发送的交易收据为沙盒收据,但是issandbox字段却标识为生产环境。

    结论:
    苹果审核app时,仍然在沙盒环境下测试。但是客户端同事在app提交苹果审核时,将issandbox字段写死,设置为生产环境。这样就导致沙盒收据发送到https://buy.itunes.apple.com/verifyReceipt去验证。
    那么如何自动的识别收据是否是sandbox receipt呢?

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

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

    先生产验证后测试验证,可以避免来回切换接口的麻烦。测试验证只要用你自己申请的测试appid的时候才会用到,用户不会拥有测试appid,所以不会走到测试验证这一步。即使生产验证出错,应该也不回返回21007状态吗。测试验证通过的用户名,和充值金额最好用数据库记录下来,方便公司资金核对。

    相关文章

      网友评论

      • 大斜的张:楼主 - (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions 我的内购 release模式下 沙盒充值成功 正式APPID 充值失败 显示无法连接到iTunes store 这个正常吗
        山杨:@大斜的张 推测可能是你的purchaseID变化造成的
        大斜的张::smile:我们内购版本上架前 沙盒测试支付成功 测试人员切换正式账号支付 报上面的错误
        山杨:@大斜的张 抱歉啊, 太久没关注内购这部分的东西了, 这个问题我记不清怎么出现的了, 你能具体描述一下吗?
      • aaa000:我们项目内购 大部分用户购买道具都是正常的 极少数用户购买之后 就没有然后了 一直不到帐! 下次在购买的时候 就显示你一购买过这个内购项目! 此项目将免费恢复! 又遇到过吗? 我还以就是苹果服务器不稳定 在捣鬼!
      • lc_cat:第8步 根据app store 返回收据的验证结果 返回的数据应该是给后台了吧. 客户端怎么做
      • ShineLing:请问, "app将 transaction receipt 发送到服务器, 服务器收到收据后发送到app stroe验证收据的有效性", 自己的服务器如何向App Store验证有效性呢?
        lc_cat:同问
      • _luckysk:内购的价格可以自定义吗
        卓敦:@山杨 楼主,内购价格不能自定义,那只能写死的价格吗,每一个产品id对应一个价格吗
        _luckysk:@山杨 谢了
        山杨:@luckySK 不行, 有固定的表, 添加内购数据的时候
      • 骑马纵天下:楼主在吗
        山杨:@斗士_ 你说吧~ 我知道了解的也比较有限, 尽量解答
        骑马纵天下:@山杨 可以咨询一些关于内购的问题吗?
        山杨:@斗士_ 不好意思, 刚看到消息, 有什么问题要讨论吗?
      • 傲视众生的冰块:21004 你提供的共享密钥和账户的共享密钥不一致
        这个问题楼主有什么办法可以解决么?
        山杨:@tianwen_sprite 我虽然没吃过亏, 不过 验证的方式 有很多, 这种也是我总结大家的做法
        xiang天问:膜拜,我们的就是被刷了,走的验证~
        山杨:这种情况 一般都是以 开发者中心 的共享密匙 为准
      • 超_iOS:能上代码么?
        山杨:上一家公司项目内购中用到的, 走的时候没有带走相关内购验证的资料, 其实验证方式肯定不止这两种

      本文标题:iOS 内购支付两种模式

      本文链接:https://www.haomeiwen.com/subject/qrgplttx.html