iOS In-App Purchase(IAP)内购服务端二次验证注意事项
前端iOS完成对应的商品购买之后,会得到一个Transaction(交易)的数据结构指针,后端实际上只需要这个结构内的一个东西,那就是 transaction.transactionReceipt。
前端将它进行Base64编码之后,再请求后端的HTTP接口就行了,我这里着重讲一下后端需要做的一些事情。
首先,拿到这个Base64的字符串之后,不用任何修改,只需要将它原封不动的请求给苹果的验证接口就行了,下面是一个HTTP请求构造信息:
- 请求地址:
测试:https://sandbox.itunes.apple.com/verifyReceipt
正式:https://buy.itunes.apple.com/verifyReceipt
请求方式:
HTTP POST
Header:
Content-Type: application/json
请求的Body:
{
"receipt-data":"...接收到的Base64字符串..."
}- 返回的响应信息(删减版):
{
"status": 0
"receipt": {
"bundle_id": "iOS应用标识,需要做校验。",
"in_app": [
{
"transaction_id": "1000000XXXXXXXXX(未结束的交易ID)",
"product_id": "xxxxxxx(购买的产品ID,用于映射到底买了哪些东西)"
},- ...more...
]
}
}- Q/A问答
Q1:我该请求哪一个地址呢?
A1:如果不想设置什么状态标识,简单点不管三七二十一,直接请求正式版本的地址,如果在测试环境,返回给你的数据的status字段会为21007,只要检查这个值再次请求测试版本的链接即可。- Q2:我如何得到购买的产品信息呢?
A2:注意返回数据的receipt.in_app是一个数组,里面保存了所有未结束的交易,每一笔交易内,都会有一个product_id用于自行映射相关的产品信息,这个信息的获取不用我说了吧,你想放到哪里都可以。- Q3:如何防止重复的交易造成多次购买呢?比如客户端使用一个Base64的参数请求了多次?
A3:注意返回数据的receipt.in_app是一个数组,里面保存了所有未结束的交易,每一笔交易内,都会有一个transaction_id用以唯一标识这个交易。我们可以在我们自己的数据库内将这个字段设置为唯一索引,这样的话,当你重复插入相同的transaction_id的时候,会触发异常,只要根据这个异常进行数据回滚或者简单的忽略掉这个交易就行了。- Q4:后端因当返回什么样的数据给前端,让前端结束交易呢?否则的话,recetpt.in_app这个数组内的值将会无限制累加?
A4:因为receipt.in_app里面保存了不止一笔交易,因此当后端循环这个数据处理完毕之后,应当将处理之后的transaction_id进行收集,然后以列表的形式返回给前端,前端收到这个数据之后,传递给SDK,然后结束交易即可。需要注意的是,哪怕有一笔交易在我们的数据库中是重复的,也要将这个重复的transaction_id一起返回给前端,好让前端能够结束掉这笔交易,否则的话将会一直存在,不停的处理这个case。- Q5:如何处理漏单的情况?比如前端支付完毕之后,因为网络或者其他原因没有请求后端进行处理。
A5:虽然我不是前端,看了一下苹果的文档之后发现,只要在应用启动时监听支付Queue,苹果会调用你的处理函数,再次进行处理,因为存在可能漏单的情况,因此后端的接口一定要具备幂等(防重,可多次调用)。重复的校验上面A3已经回答了。需要注意的是,不止是后端可能会没有接收到来自前端的请求,也有可能后端处理完毕之后前端已经关闭,因此无法结束处理完毕的交易。只要前端能够在启动APP的时候得到SDK的回调,再次请求一下后端进行处理就行了。
iOS In-App Purchase(IAP)内购服务端二次验证注意事项的更多相关文章
- iOS内购 服务端票据验证及漏单引发的思考.
因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的 ...
- iOS开发——高级技术&内购服务
内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...
- JAVA项目之苹果IAP内购JAVA服务器验证流程详解
1.前言 本博客是经历过多个项目检验的, 绝对真实, 适应于对苹果iap内购稍微有些了解的JAVA开发人员, 认真看, 定能完美解决苹果内购问题. 苹果IAP内购支付实际上是"将客户端支 ...
- 体育类1.2.0版本 带有社交性质的 app 并且有内购功能
上架经历 体育类1.2.0版本 应用是体育类的,带有社交性质的 app 并且有内购功能 - 关于内购 最初级的应该是内购的 产品类型 在开发者一开始设置的时候没有注意到区别: 消耗型产品 非消耗型 非 ...
- IAP内购
IAPHelper.h // // IAPHelper.h // airplay // // Created by apple on 13-10-23. // Copyright (c) 2013年 ...
- [IPA]IOS In App Purchase(内购)验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- C# [IPA]IOS In App Purchase(内购)验证(asp.net 版本)
之前没有做过IOS 内购服务器验证这块,所以找了不少参考资料,网上大多php和java版本,然后自己搞了一个C#版本,希望能给大家一些参考,下面步入正题 在客户端向苹果购买成功之后,我们需要进行二次验 ...
- ios IAP 内购验证
参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...
- iOS开发 使用RMStore简化内购代码 + 内购买订单验证
现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...
随机推荐
- Perl面向对象(3):解构——对象销毁
本系列: Perl面向对象(1):从代码复用开始 Perl面向对象(2):对象 Perl面向对象(3):解构--对象销毁 第3篇依赖于第2篇,第2篇依赖于1篇. perl中使用引用计数的方式管理内存, ...
- 前端(二)之 CSS
前端之 CSS 前言 昨天学习了标记式语言,也就是无逻辑语言.了解了网页的骨架是什么构成的,了解了常用标签,两个指令以及转义字符:其中标签可以分为两大类: 一类是根据标签内容可以分类单双标签,单标签指 ...
- 《C#并发编程经典实例》学习笔记-关于并发编程的几个误解
误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用.更方便的并发编程技术,包括异步编程.并行编程.TPL 数据流.响应式编程等. 误解二:只有大型服务器程序才需要考虑并 ...
- c#使用js上传图片
前几天朋友说用js上传图片过去遇到点问题,于是自己也想写一个demo这里就把自己挖的坑填了. 话不多说上代码 前台就一个file控件加按钮 <!DOCTYPE html> <html ...
- 模块热替换 HMR
devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...
- python特色_字典,元组,列表
一.前言: 1.许多编程语言的基本数据类型都大同小异,而字典,元组,列表是python编程语言的一大特色,能够非常简单的完成很多功能,学习好字典,元组,列表能够为以后大数据,批处理......提供很多 ...
- 支持MySelf
编程思路分享,BUG上报,主推Java Web方向与软件架构设计,不定期推出系列针对性基础教程,项目均放置于GitHub,个人运营精力有限,感谢支持. 交流群:628793702 个人技术公众,欢迎关 ...
- js 依据“;”折行
function roomIds(roomid) { // var str = roomid.replace(/;/g,'\r\n'); if (roomid) { var str = roomid. ...
- 有状态(Stateful)与无状态(Stateless)
1.有状态(Stateful): 有数据存储功能.有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,类里面有成员变量,而且成员变量是可变的,是非线程安全的.在不同方法调用间 ...
- 30.Odoo产品分析 (四) – 工具板块(2) – 搜索和仪表盘(2)
查看Odoo产品分析系列--目录 在前面的模块中,简单介绍过了odoo如何搜索系统中的各种数据集,并保存这些过滤器,以便在之后需要时能够轻松访问这些过滤器.这里将做更详细的介绍.最后分析仪表盘的功能, ...