iOS IAP应用内购详细步骤和问题总结指南

最近公司在做APP内购会员功能 遇到了很多问题 总结记录一下 首先一定要区分Apple pay 和IAP内购的区别

可以先去看一下官方文档地址 有每个步骤的详细解释

本篇文章分为:

1、 内购支付流程;

2、开发集成步骤;

3、问题(遇坑)记录解决方式

之前没看官方文档走了很多弯路 网上博客并不系统 强烈建议先过一遍官方文档

先看一下IAP内购支付流程(官方)

官方流程图

程序向服务器发送请求,获得一份产品列表。

服务器返回包含产品标识符的列表。

程序向App Store发送请求,得到产品的信息。

App Store返回产品信息。

程序把返回的产品信息显示给用户(App的store界面)

用户选择某个产品

程序向App Store发送支付请求

App Store处理支付请求并返回交易完成信息。

程序从信息中获得数据,并发送至服务器。

服务器纪录数据,并进行审(我们的)查。

服务器将数据发给App Store来验证该交易的有效性。

App Store对收到的数据进行解析,返回该数据和说明其是否有效的标识。

服务器读取返回的数据,确定用户购买的内容。

服务器将购买的内容传递给程序。

第一步:内购账户税务协议、银行卡绑定相关

一般都是运营或者产品经理处理这步 这篇文章图文步骤比较详细 处理税务银行相关设置 IAP,In App Purchases-在APP内部支付

第二步:Xcode设置相关

打开In-App Purchase开关 对应在开发者证书中心的项目证书中显示应该也是可用状态

屏幕快照 2018-08-22 下午6.00.11.png

屏幕快照 2018-08-22 下午6.01.35.png

第三步:在App Store Content -> 我的APP 添加内购项目商品

在首页上,点按“我的 App”,然后选择与该 App 内购买项目相关联的 App。

在工具栏中,点按“功能”,然后在左列中点按“App 内购买项目”。

若要添加 App 内购买项目,请前往“App 内购买项目”,并点按“添加”按钮(+)。

屏幕快照 2018-08-23 上午10.06.23.png

选择功能 添加内购项目商品

选择功能Tab

内购商品对应四种类型 消耗型、非消耗型、自动续订订阅型、非续订订阅型

官方文档

选择“消耗型项目”、“非消耗型项目”或“非续订订阅”,并点按“创建”。有关自动续订订阅的信息,请参见创建自动续期订阅。

添加参考名称、产品 ID 和本地化显示名称。

点按“存储”或“提交以供审核”。

屏幕快照 2018-08-23 上午10.09.34.png

添加一个测试商品 其他属性都可以随意填写 产品ID一定要认真填写 项目中需要根据ID获取商品信息 价格有不同的等级可以选 最低备用等级1 == 1元

填写完成之后储存 就完成了一个内购商品的添加

屏幕快照 2018-08-23 上午10.16.31.png

第四步:沙盒环境测试账号

因为涉及到钱相关 总不能直接用money去支付吧 所以需要你去添加一个沙盒技术测试人员的账号 (这个账号是虚拟的) 付款不会扣你

看第三步那张图 在App Store Content 选择用户和职能 进入下面页面 选择沙箱技术测试员 添加测试账号

屏幕快照 2018-08-23 上午11.02.26.png

屏幕快照 2018-08-23 上午11.05.28.png

Tips:Q:为什么添加沙箱技术测试员 注册不成功 Unknown Email xxxxxx

首先这里有个坑 邮箱只要符合格式就可以 虚假邮箱也可以 但密码必须符合正式的要求要有大小写和字符 复杂就好 例如:Lh123456*

第五步:代码实现(初步,未进行优化 有什么问题可以在评论中跟我沟通)

.h文件

.m文件

第六步:IAP支付流程 & 服务器验证流程

整个支付流程如下:

1.客户端向Appstore请求购买产品(假设产品信息已经取得),Appstore验证产品成功后,从用户的Apple账户余额中扣费。

2.Appstore向客户端返回一段receipt-data,里面记录了本次交易的证书和签名信息。

3.客户端向我们可以信任的服务器提供receipt-data

4.服务器对receipt-data进行一次base64编码

5.服务器把编码后的receipt-data发往itunes.appstore进行验证

6.itunes.appstore返回验证结果给服务器

7.服务器对商品购买状态以及商品类型,向客户端发放相应的道具与推送数据更新通知

漏单处理 确保receipt-data的成功提交与异常处理

建立在IAP Server Model的基础上,并且我们知道手机网络是不稳定的,在付款成功后不能确保把receipt-data一定提交到服务器。如果出现了这样的情况,那就意味着玩家被appstore扣费了,却没收到服务器发放的道具。

漏单处理:

解决这个问题的方法是在客户端提交receipt-data给我们的服务器,让我们的服务器向苹果服务器发送验证请求,验证这个receipt-data账单的有效性. 在没有收到回复之前,客户端必须要把receipt-data保存好,并且定期或在合理的UI界面触发向服务端发起请求,直至收到服务端的回复后删除客户端的receipt账单记录。

如果是客户端没成功提交receipt-data,那怎么办?就是玩家被扣费了,也收到appstore的消费收据了,却依然没收到游戏道具,于是投诉到游戏客服处。

这种情况在以往的经验中也会出现,常见的玩家和游戏运营商发生的纠纷。游戏客服向玩家索要游戏账号和appstore的收据单号,通过查询itunes-connect看是否确有这笔订单。如果订单存在,则要联系研发方去查询游戏服务器,看订单号与玩家名是否对应,并且是否已经被使用了,做这一点检查的目的是 为了防止恶意玩家利用已经使用过了的订单号进行欺骗(已验证的账单是可以再次请求验证的,曾经为了测试,将账单手动发给服务器处理并成功),谎称自己没收到商品。这就是上面一节IAP Server Model中红字所提到的安全逻辑的目的。当然了,如果查不到这个订单号,就意味着这个订单确实还没使用过,手动给玩家补发商品即可。

更多可以查看这篇博文苹果IAP安全支付与防范 receipt收据验证

遇到的坑

Q:沙箱技术测试人员添加不成功 总是提示邮箱错误

A:沙箱技术测试账号用于付款测试 任意未创建过Apple ID 的邮箱都可以 假的邮箱也可以 重要的是密码格式一定要包含大小写 跟正式账号注册规则一样 (例如:Lh123456*)

Q:自己服务器向苹果服务器验证收据/凭证参数是什么?向status code 验证apple iap sever的状态码代表什么意思?

A:21002、21003、21004、21005、21006、21007... 具体可以查看这篇文档用App Store验证收据

Q:Apple 和IAP的区别

A:IAP是链接App store的内购服务 一般是虚拟商品需要走的通道(比如会员功能)

Apple Pay是苹果跟各大银行合作的卡包形式的类似于刷卡支付服务 一般用于现实场景

这两个一定别搞混了

Q:怎么通过itunes-connect查看具体订单,itunes-connect中无法直接看到订单信息,可以用以下方法来查询

1.可以通过账单向苹果发送账单验证,有效可以手动补发

2 .用自己的服务器的记录账单列表对比

3.利用第三方的TalkingData等交易函数,会自动记录账单数据

还有一些问题可以借鉴一下这篇博文iOS之你一定要看的内购破解-越狱篇 他遇到的实际问题比较多 按需借鉴

觉得有帮助可以关注我 后续继续补充....

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181114A0BJQ000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券