IOS 内购支付两种模式:

  • 内置模式

  • server模式

内置模式的流程:

  1. app从app store 获取产品信息

  2. 用户选择须要购买的产品

  3. app发送支付请求到app store

  4. app store 处理支付请求。并返回transaction信息

  5. app将购买的内容展示给用户

server模式的流程:

  1. app从server获取产品标识列表

  2. app从app store 获取产品信息

  3. 用户选择须要购买的产品

  4. app 发送 支付请求到app store

  5. app store 处理支付请求,返回transaction信息

  6. app 将transaction receipt 发送到server

  7. server收到收据后发送到app stroe验证收据的有效性

  8. app store 返回收据的验证结果

  9. 依据app store 返回的结果决定用户是否购买成功

上述两种模式的不同之处主要在于:交易的收据验证。内建模式没有专门去验证交易收据,而server模式会使用独立的server去验证交易收据。

内建模式简单快捷,但easy被破解。server模式流程相对复杂,但相对安全。


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

  1. 用户是否能忍受3-6s的等待时间

  2. 假设app store server 宕机,怎样确保成功付费的用户可以得到正常服务。

对于第一个问题,我们有理由相信用户全然无法忍受,所以採用异步验证的方式,server收到client的请求后,就将请求放到MCQ中去处理。

对于第二个问题,因为苹果人员非常负责人的告知:我们的server不稳定。所以不排除收据验证超时的情况。对于验证超时的收据,保存到数据库中并标记为验证超时。定时任务每隔一定的时间去app store验证,确保可以获取收据的验证结果。

在开发过程中,须要測试应用是否可以正常的进行支付。可是又不能进行实际的支付,因此须要使用苹果提供的sandbox Store測试。

Store Kit不能在iOS模拟器中使用。測试Store必须在真机上进行。

在sandbox中验证receipt:

https://sandbox.itunes.apple.com/verifyReceipt

在生产环境中验证receipt:

https://buy.itunes.apple.com/verifyReceipt

在实际开发过程中,server端通过issandbox字段标识client传递的收据是沙盒环境中的收据还是生产环境中的收据。

在提交苹果审核前。沙盒測试均无问题。提交苹果审核后。被告知购买失败,审核未通过。通过查询日志发现,client发送的交易收据为沙盒收据,可是issandbox字段却标识为生产环境。

结论:

苹果审核app时,仍然在沙盒环境下測试。可是client同事在app提交苹果审核时。将issandbox字段写死。设置为生产环境。这样就导致沙盒收据发送到https://buy.itunes.apple.com/verifyReceipt去验证。

那么怎样自己主动的识别收据是否是sandbox receipt呢?

识别沙盒环境下收据的方法有两种:

1.依据收据字段 environment = sandbox。

2.依据收据验证接口返回的状态码,假设status=21007。则表示当前的收据为沙盒环境下收据, t进行验证。

苹果反馈的状态码。

  • 21000App Store无法读取你提供的JSON数据
  • 21002 收据数据不符合格式
  • 21003 收据无法被验证
  • 21004 你提供的共享密钥和账户的共享密钥不一致
  • 21005 收据server当前不可用
  • 21006 收据是有效的,但订阅服务已经过期。

    当收到这个信息时,解码后的收据信息也包括在返回内容中

  • 21007 收据信息是測试用(sandbox),但却被发送到产品环境中验证
  • 21008 收据信息是产品环境中使用,但却被发送到測试环境中验证

先生产验证后測试验证,可以避免来回切换接口的麻烦。

測试验证仅仅要用你自己申请的測试appid的时候才会用到,用户不会拥有測试appid,所以不会走到測试验证这一步。

即使生产验证出错,应该也不回返回21007状态吗。測试验证通过的username,和充值金额最好用数据库记录下来,方便公司资金核对。

IOS内购支付server验证模式的更多相关文章

  1. IOS内购支付服务器验证模式

    IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...

  2. 苹果IOS内购二次验证返回state为21002的坑

    项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...

  3. 【JAVA】IOS内购二次验证及掉单问题解决

    这个估计是我踩过的最大的坑,当时做微信支付的时候也没这么坑爹,当然他俩也半斤八两... 苹果官方明确表示:验证支付时,可能会有一定的延迟.第一次处理的时间就专注的解决这个问题了,忽略了掉单的问题(稍后 ...

  4. iOS - 内购总结

        如果有人以后要在做内购这一块.希望可以好好的阅读这篇文章,虽然不是字字珠玑.但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助!  下面是在研究工程中遇到的问题(iOS 内购的流程如下 1 ...

  5. iOS 内购讲解

    一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...

  6. JAVA项目之苹果IAP内购JAVA服务器验证流程详解

    1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员,  认真看,  定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...

  7. iOS 内购遇到的坑

    一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...

  8. iOS-IAP内购的那些事(iOS内购漏单的问题)

    前言 说起内购,其实挺令开发者厌烦的,原因呢,先不说漏单的问题,首先苹果要扣除30%的销售额哦,可恨不?(我觉得可恨),有些想办法先隐藏掉第三方支付(支付宝.微信等),等项目上线了,再跳过内购使用第三 ...

  9. iOS内购总结

    内购流程: 1. 用户先拿到购买产品的单子, 2. 拿着单子去苹果那里交钱,交完钱让苹果在单子上盖个章 3.拿着盖了章的单子传给自己的服务器来验证是否真的支付成功,服务器是跟苹果验证(我们客户端也是可 ...

随机推荐

  1. 查看mysql日志

    1.首先确认你日志是否启用了 MySQL>show variables like 'log_bin'; 2.如果启用了,即ON那日志文件就在MySQL的安装目录的data目录下 3.怎样知道当前 ...

  2. linux yum源安装

    #1.安装remi源mkdir /disk1/toolscd /disk1/toolsrpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-relea ...

  3. Windows环境下文件的彻底删除与恢复,推荐几个工具(整理)

    1. 背景 在Windows(从XP到Win7)中删除文件时,无论是Delete或者是Shift+Delete,都不能真正的删除文件,它做的事情只是从文件分配表中删除了该文件的信息,而并未将文件从存储 ...

  4. [svc]centos7安装优化最佳姿势

    源/软件/时区/selinux/ulimit/vim/sshd 下载安装: https://mirrors.aliyun.com/centos/7.4.1708/isos/x86_64/CentOS- ...

  5. UnityTestTools測试工具

    由于工作关系,要了解Unity上的測试工具,该工具基于Nunit框架.通过查阅资料了解到在Unity5.3中做出了一些改变,自带的仅仅剩下单元測试工具,假设想用其它的工具比方断言.集成測试,就须要前往 ...

  6. 每日英语:Our Unique Obsession With Rover And Fluffy

    Recently, an almost literal case of lifeboat ethics occurred. On Aug. 4, Graham and Sheryl Anley, wh ...

  7. electron_window 创建窗口

    /** * 窗口基类,封装通用的窗口操作 */ const { BrowserWindow } = require('electron'); /** * 基本窗口样式 * @type {{width: ...

  8. js实现点击按钮实现上一张下一张相册滚动效果

    /****判断图片是否构成滚动效果*/$(function(){    if($("#bar").find('img').size()*71<=$("#bar&qu ...

  9. Zabbix添加自定义监控项(一)

    前言:由于Zabbix提供的项目和模板有限,有时我们需要自定义监控项,下面以监控磁盘I/O使用率为例,创建自动发现规则,并配置图形. (1)Zabbix_agentd端自动发现脚本,zabbix要求返 ...

  10. pdo_mysql安装

    如果编译时没有编译pdo模块,可以cd 到php编译时的目录,重新编译 1.切换到pdo_mysql目录,如php-5.5.10/ext/pdo_mysql/ 2.生成configure文件,在pdo ...