前端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. win8 notepad++ 设置无法保存

    前些天买了新笔记本.装的是win8 ,后来装了notepad++ ,最新版的,改了字体,下次从新打开之后,发现字体改动无效.后来试了一下“管理员身份运行”,再次打开,保存就有效.但总不能每次都那样去右 ...

  2. Webpack编译结果浅析

    如今Webpack已经是一个不可或缺的前端构建工具,借助这个构建工具,我们可以使用比较新的技术(浏览器不能直接支持)来开发. 你是否好奇你写的代码经过Webpack构建之后会生成什么东西?是否有时调试 ...

  3. 第5章 Linux上管理文件系统

    5.1 机械硬盘 机械硬盘由多块盘片组成,它们都绕着主轴旋转.每块盘片上下方都有读写磁头悬浮在盘片上下方,它们与盘片的距离极小.在每次读写数据时盘片旋转,读写磁头被磁臂控制着不断的移动来读取其中的数据 ...

  4. Linux tee的花式用法和pee

    1.tee多重定向 tee [options] FILE1 FILE2 FILE3... tee的作用是将一份标准输入多重定向,一份重定向到标准输出/dev/stdout,然后还将标准输入重定向到每个 ...

  5. MySQL优化(2)--------常用优化

    前言 之前已经简单介绍了MySQL的优化步骤,那么接下来自然而是就是常用的SQL优化,比如inseer.group by等常用SQL的优化,会涉及SQL语句内部细节(这正是我缺乏的).最后希望自己能记 ...

  6. 设置防火强开机自启,以及没有成功的tomcat开机自启

    防火墙 如果你的系统上没有安装使用命令安装 #yum install firewalld //安装firewalld 防火墙 开启服务 # systemctl start firewalld.serv ...

  7. element-ui el-input只显示下划线

    只需要增加样式 .el-input__inner { width: 220px; border-top-width: 0px; border-left-width: 0px; border-right ...

  8. 从零开始学安全(二十三)●用PHP编写留言板

    <?php include("test.php"); ?> <!DOCTYPE html> <html> <head> <me ...

  9. 近20个绚丽实用的jQuery/CSS3侧边栏菜单(转载)

    http://developer.51cto.com/art/201510/493530.htm 近20个绚丽实用的jQuery/CSS3侧边栏菜单 jQuery作为一款主流的JavaScript前端 ...

  10. SpringMVC 与 REST.

    一.REST 的基础知识 我敢打赌这并不是你第一次听到或读到REST这个词.当讨论REST时,有一种常见的错误就是将其视为“基于URL的Web服务”—— 将REST作为另一种类型的RPC机制,只不过是 ...