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 ...
随机推荐
- nginx proxy_pass 代理域名
一.描述 1.nginx配置转发的时候使用的是域名,即使用dns服务方便配置和负载.但是nginx默认会进行缓存,当域名对应的服务出问题的时候就会报错,只有默认的缓存时间到了才会再次进行解析,ngin ...
- jquery调用javascript方法
本来想找个“优雅”一点的方法,类似C#在调用C++方法时候的Invoke之类的.没找到,后来想想,其实也没必要,直接写就好了,算最优雅了吧.只是少了VS的Intelligence,有点不习惯罢了. 事 ...
- Nacos系列:欢迎来到Nacos的世界!
什么是Nacos? Nacos 是构建以"服务"为中心的现代应用架构 (例如微服务范式.云原生范式) 的服务基础设施. Nacos可以做什么? 1.动态配置服务:支持以中心化.外部 ...
- Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken
项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...
- Webapi创建和使用 以及填坑(三)
WebApi使用填坑 前面工作跟别人做数据对接,因为我们是对接方所以东西都得按照他们的要求进行修改,于是给自己挖了很多坑,其实更多的都是自己能力还不够,在这里也做一个笔记了. 请求类型:applica ...
- JQuery官方学习资料(译):类型
类型 JavaScript提供了多个内置数据类型.除了这些,这份文档还将介绍一些虚拟类型,例如选择器.伪类.事件等. String 在JavaScript中字符串是一个不可变的对象,它包含无. ...
- 使用wubi安装ubuntu14.04出现的常见错误的解决办法
花了一天的时间终于安装上了Ubuntu14.04,过程坎坷,是血泪史,开始报“cannot download the metalink and therefore the ISO”错误,解决后,又报“ ...
- c# chart控件柱状图,改变柱子宽度
让柱状图紧挨 改变柱状图宽度 chart1.Series[0]["PointWidth"] = "2";
- [Linux] Linux的环境变量
环境变量可以被系统,用户,shell以及其他程序来设定 登录系统后,系统读取/etc/profile 文件,设置环境变量,如果没有就跳过 检查主目录(/root)的.profile文件,推荐去这个文件 ...
- junit单元测试注意的问题
1.有返回值的方法不能直接测试 2.带参数的方法不能直接测试 3.访问权限在public一下的方法不能直接测试 4.static静态方法不能直接测试 5.不能给出现前四个条件中任意一个的方法添加@Te ...