IOS内购支付server验证模式
IOS 内购支付两种模式:
内置模式
server模式
内置模式的流程:
app从app store 获取产品信息
用户选择须要购买的产品
app发送支付请求到app store
app store 处理支付请求。并返回transaction信息
app将购买的内容展示给用户
server模式的流程:
app从server获取产品标识列表
app从app store 获取产品信息
用户选择须要购买的产品
app 发送 支付请求到app store
app store 处理支付请求,返回transaction信息
app 将transaction receipt 发送到server
server收到收据后发送到app stroe验证收据的有效性
app store 返回收据的验证结果
依据app store 返回的结果决定用户是否购买成功
上述两种模式的不同之处主要在于:交易的收据验证。内建模式没有专门去验证交易收据,而server模式会使用独立的server去验证交易收据。
内建模式简单快捷,但easy被破解。server模式流程相对复杂,但相对安全。
开发之初,苹果方就非常负责的告知:我们的server不稳定。真正开发之后。发现苹果方果然是非常负责的,不仅是不稳定,并且足够慢。app store server验证一个收据须要3-6s时间。
用户是否能忍受3-6s的等待时间
假设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验证模式的更多相关文章
- IOS内购支付服务器验证模式
IOS 内购支付两种模式: 内置模式 服务器模式 内置模式的流程: app从app store 获取产品信息 用户选择需要购买的产品 app发送支付请求到app store app store 处理支 ...
- 苹果IOS内购二次验证返回state为21002的坑
项目是三四年前的老项目,之前有IOS内购二次验证的接口,貌似很久都没用了,然而最近IOS的妹子说接口用不了,让我看看啥问题.接口流程时很简单的,就是前端IOS在购买成功之后,接收到receipt后进行 ...
- 【JAVA】IOS内购二次验证及掉单问题解决
这个估计是我踩过的最大的坑,当时做微信支付的时候也没这么坑爹,当然他俩也半斤八两... 苹果官方明确表示:验证支付时,可能会有一定的延迟.第一次处理的时间就专注的解决这个问题了,忽略了掉单的问题(稍后 ...
- iOS - 内购总结
如果有人以后要在做内购这一块.希望可以好好的阅读这篇文章,虽然不是字字珠玑.但是也是本人亲人趟过了无数的坑,希望可以对大家有所帮助! 下面是在研究工程中遇到的问题(iOS 内购的流程如下 1 ...
- iOS 内购讲解
一.总说内购的内容 1.协议.税务和银行业务 信息填写 2.内购商品的添加 3.添加沙盒测试账号 4.内购代码的具体实现 5.内购的注意事项 二.协议.税务和银行业务 信息填写 2.1.协议.税务和银 ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- iOS 内购遇到的坑
一.内购沙盒测试账号在支付成功后,再次购买相同 ID 的物品,会提示如下内容的弹窗.您以购买过此APP内购项目,此项目将免费恢复 原因: 当使用内购购买过商品后没有把这个交易事件关,所以当我们再次去购 ...
- iOS-IAP内购的那些事(iOS内购漏单的问题)
前言 说起内购,其实挺令开发者厌烦的,原因呢,先不说漏单的问题,首先苹果要扣除30%的销售额哦,可恨不?(我觉得可恨),有些想办法先隐藏掉第三方支付(支付宝.微信等),等项目上线了,再跳过内购使用第三 ...
- iOS内购总结
内购流程: 1. 用户先拿到购买产品的单子, 2. 拿着单子去苹果那里交钱,交完钱让苹果在单子上盖个章 3.拿着盖了章的单子传给自己的服务器来验证是否真的支付成功,服务器是跟苹果验证(我们客户端也是可 ...
随机推荐
- python 异步编程
Python 3.5 协程究竟是个啥 Yushneng · Mar 10th, 2016 原文链接 : How the heck does async/await work in Python 3.5 ...
- 子墨庖丁Android的ActionBar源代码分析 (一)实例化
假设你从事过Androidclient开发,相信你对ActionBar这套框架并不陌生,或者说你并不了解它,可是你应该时不时的要跟它打交道.抛开ActionBar的实现不说,ActionBar实际上是 ...
- Class.getResourceAsStream和ClassLoader.getResourceAsStream方法
项目中,有时候要读取当前classpath下的一些配置文件,下面介绍下Class.getResourceAsStream和ClassLoader.getResourceAsStream两种方法以及两者 ...
- [py]python的继承体系
python的继承体系 python中一切皆对象 随着类的定义而开辟执行 class Foo(object): print 'Loading...' spam = 'eggs' print 'Done ...
- Socket相关函数(1)- socket(), bind(), listen(), accept(), connect(), TCP模型
tcp_server.c #include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #in ...
- MySql 触发器同步备份数据表记录
添加记录到新记录表 DELIMITER $$ USE `DB_Test`$$ CREATE /*!50017 DEFINER = 'root'@'%' */ TRIGGER `InsertOPM_Al ...
- Jar包版本查看方法
原文: https://blog.csdn.net/u011287511/article/details/66973559 打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目 ...
- Path类与Directory类与File类
阅读目录 开始 Path 对路径 字符串进行操作 获得后缀 能合并路径 获取文件名 Directory和DirectoryInfo 对目录进行操作 判断目录是否存在 创建目录 删除目录 获取目录下所 ...
- 贪心算法or背包问题
贪心方法:总是对当前的问题作最好的选择,也就是局部寻优.最后得到整体最优. 应用:1:该问题可以通过“局部寻优”逐步过渡到“整体最优”.贪心选择性质与“动态规划”的主要差别. 2:最优子结构性质:某个 ...
- 一款基于css3的简单的鼠标悬停按钮
今天给大家分享一款基于css3的简单的鼠标悬停按钮.这款悬停按钮鼠标经过前边框是间断的.当鼠标经过的时候边框间隔消失.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...