前端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)内购服务端二次验证注意事项的更多相关文章

  1. iOS内购 服务端票据验证及漏单引发的思考.

    因业务需要实现了APP内购处理,但在过程中出现了部分不可控的因素,导致部分用户反映有充值不成并漏单的情况. 仔细考虑了几个付费安全上的问题,凡是涉及到付费的问题都很敏感,任何一方出现损失都是不能接受的 ...

  2. iOS开发——高级技术&内购服务

    内购服务 大家都知道做iOS开发本身的收入有三种来源:出售应用.内购和广告.国内用户通常很少直接 购买应用,因此对于开发者而言(特别是个人开发者),内购和广告收入就成了主要的收入来源.内购营销模式,通 ...

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

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

  4. 体育类1.2.0版本 带有社交性质的 app 并且有内购功能

    上架经历 体育类1.2.0版本 应用是体育类的,带有社交性质的 app 并且有内购功能 - 关于内购 最初级的应该是内购的 产品类型 在开发者一开始设置的时候没有注意到区别: 消耗型产品 非消耗型 非 ...

  5. IAP内购

    IAPHelper.h // // IAPHelper.h // airplay // // Created by apple on 13-10-23. // Copyright (c) 2013年 ...

  6. [IPA]IOS In App Purchase(内购)验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  7. C# [IPA]IOS In App Purchase(内购)验证(asp.net 版本)

    之前没有做过IOS 内购服务器验证这块,所以找了不少参考资料,网上大多php和java版本,然后自己搞了一个C#版本,希望能给大家一些参考,下面步入正题 在客户端向苹果购买成功之后,我们需要进行二次验 ...

  8. ios IAP 内购验证

    参考我之前的笔记 苹果内购笔记,在客户端向苹果购买成功之后,我们需要进行二次验证. 二次验证 IOS在沙箱环境下购买成功之后,向苹果进行二次验证,确认用户是否购买成功. 当应用向Apple服务器请求购 ...

  9. iOS开发 使用RMStore简化内购代码 + 内购买订单验证

    现在很多的app里面都添加了应用内购买,网上关于苹果证书的生成和设置的教程比较多,这里就不多赘述了,推荐几个个人觉得说的比较详细的网址: http://www.jianshu.com/p/86ac7d ...

随机推荐

  1. 基于saltstack自动化部署高可用kubernetes集群

    SaltStack自动化部署HA-Kubernetes 本项目在GitHub上,会不定期更新,大家也可以提交ISSUE,地址为:https://github.com/skymyyang/salt-k8 ...

  2. mysql服务器架构

    mysql是最广泛使用的开源数据库之一,作为后端开发人员,或多或少都会和mysql打交道,本篇文章会从sql查询语句的执行过程,来介绍mysql的服务器架构, 查询的过程大致分为从客户端到服务器,在服 ...

  3. man rpcbind(rpcbind中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html RPCBIND() BSD System Manager's Manual RPCBI ...

  4. 伪指令 ADR 与 LDR 的区别

    指令简介: adr r0, _start 得到的是 _start 的当前执行位置,由 pc+offset 决定 ldr r0, =_start 得到的是绝对的地址,链接时决定 程序示例: ldr r0 ...

  5. java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.SpecialProvider.<init>()

    Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis ...

  6. 反爬虫——使用chrome headless时一些需要注意的细节

    以前我们介绍过chrome headless的用法(https://www.cnblogs.com/apocelipes/p/9264673.html). 今天我们要稍微提一下其中一个细节. 反爬和w ...

  7. C#异步线程

    对需要同时进行的操作进行异步线程处理:例如在一个button按钮点击事件中同时进行两种事件操作private void button_Click(object sender, EventArgs e) ...

  8. 【Zookeeper】windows环境下zookeeper安装

    下载  Apache官方最新版本为:3.4.12 下载地址:https://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.12/ 安装 解压到指定目录 ...

  9. oracle中row_number() over()

    ROW_NUMBER() OVER函数的基本用法语法:ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)简单的说row_number()从1开 ...

  10. 浅谈JS中String()与 .toString()的区别

    我们知道String()与 .toString()都是可以转换为字符串类型,但是String()与 .toString()的还是有区别的 1..toString()可以将所有的的数据都转换为字符串,但 ...