摘录: 苹果应用内支付(iOS IAP)的流程与常用攻击方式
成都创新互联公司主营宁洱网站建设的网络公司,主营网站建设方案,手机APP定制开发,宁洱h5微信小程序定制开发搭建,宁洱网站营销推广欢迎宁洱等地区企业咨询
按照安全性原则, 客户端的所有信息都是不可信的,而且支付是业务中的核心模块,所以应该选择第二种。
下面简要介绍下,第二种方式的简单流程。
作为支付,安全性是第一位的,下面简要分析一下常用的攻击手段。
客户端拿到apple的receipt 并发送到server
server拿到这个receipt,向苹果验证得到apple_callback_data
如果apple_callback_data的status是21007,说明是沙盒模式(不用花钱就可以购买) 要根据具体需求判断处理逻辑,需要注意的是,ios的审核在支付的时候就采用的沙盒模式。
如果apple_callback_data的status是0,就要从apple_callback_data[‘receipt’][‘in_app’]这个list中拿到所有的记录,每一个进行充值。然后记录transaction_id和original_transaction_id来防止同一个transaction被重复使用。
= Original Transaction Identifier
返回所有充值成功和重复的transaction_id, 有client来complete transaction
summary
支付作为核心模块,除了技术上的保证,商务也应该每周进行一次对账。如果发现apple上的收入和服务端记录的收入有比较大的差距,就应该抓紧查看原因。
最后给出一个apple_callback_data的例子
注意:此处以提供商为银联为基准
【1】创建appid时,开启Apple Pay功能选择对应的Merchant ID
【2】创建Merchant ID
【3】创建Merchant ID的证书
【4】上传CSR文件(银联提供的CSR文件)—Continue—Download证书—安装证书
【5】工程开启Apple Pay功能
【6】开启后,工程会自动增加一个文件
【7】银联SDK接入流程(银联官网获取的)
【7.1】商户业务范围:优先发展生活服务类商户;根据监管要求,限制接入P2P借贷及互联网彩票行业;同时暂缓接入基金、理财、保险、养老、贵金属、众筹、信贷还款、融资租赁、直销银行等互联网金融投资行业。
【7.2】商户入网服务流程及步骤
【7.3】银联支付SDK流程时序图
【7.4】接入需注意环节
接入云闪付Apple Pay的商户,须生成Apple Pay专用的CSR文件并提交至苹果开发者网站进行签名,以签署证书,取得Apple Pay的访问权限。在银联SDK模式中,银联代为商户生成CSR文件,商户可直接登录银联商户服务平台获取。
一,iOS端开发。
如果购买成功,我们需要将凭证发送到服务器上进行验证。考虑到网络异常情况,iOS端的发送凭证操作应该可以持久化,如果程序退出,崩溃或网络异常,可以恢复重试。
二,服务器端开发。
服务器后台的工作比较简单,分为4步:
1,接收iOS端发来的购买凭证。
2,判断凭证是否已经存在,是否验证过,然后,存储该凭证。
3,将该凭证发送到苹果的服务器验证,并将验证结果返回给客户端。
4,如果需要,修改用户相应的会员权限。
考虑到网络异常的情况,服务器的验证应该是一个可恢复的列队,如果失败了,应该进行重试。
点击 “协议、税务和银行业务”
内购用的是付费应用程序,先签署《付费应用程序协议》,同意后状态变更为“用户信息待处理”,等待审核。
状态更改完毕后,点击“开始设置税务、银行业务和联系信息”。
(1)添加银行账户,按照要求填写相关内容即可。
(2)选择报税表,并填写。所有与 Apple 有商业合作者必选都是美国,若有其他需求,可以多选。
继续填写,首先认证公司基本信息,选择所有人类型,确认无误后认证条款处打对勾
Part I 部分,继续核对公司相关信息,选填内容可不填。
Part III 部分,签署税务条约,设置利益限制条款的种类,选填内容可不填。此部分如果需要可勾选上下图勾选框,不需要可不勾选,我们这个项目没有用到part III 部分,所以没有勾选。
Part XXX 部分,确认之前填写的信息,勾选完毕后,提交
(3)填写联系信息,共5个。高级管理、财务、技术、法务、营销。只需要提供5个人的基本信息即可。
只可使用一次的产品,使用之后即失效,必须再次购买。
示例: 钓鱼 App 中的鱼食。
只需购买一次,不会过期或随着使用而减少的产品。
示例: 游戏 App 的赛道。
允许用户在固定时间段内购买动态内容的产品。除非用户选择取消,否则此类订阅会自动续期。
示例: 每月订阅提供流媒体服务的 App。
允许用户购买有时限性服务的产品。此 App 内购买项目的内容可以是静态的。此类订阅不会自动续期。
示例: 为期一年的已归档文章目录订阅。
App 内购买项目的截屏,即所售项目的示意图。例如,如果 App 内购买项目是一本图书,您可以提交图书的截屏。您也可以提交购买页的截屏。该截屏仅用于 Apple 审核,不会在 App Store 中显示。
截屏要求如下:
iOS 至少需要 640 x 920 像素
Apple tvOS 需要 1920 x 1080 像素
macOS 需要 1280 x 800 像素
App 审核图像上传后,可以替换,但无法移除。当您的 App 内购买项目处于审核中时,您无法更新截屏。
沙箱账号是不能直接在App Store进行登录的,只能在点击了购买商品之后,在弹出的登录框进行登录 。
验证是否已登录沙箱测试账号:
设置--iTunes Store与App Store,页面拉到最底部,会看到沙箱账户项会列出你已登录的沙箱测试账号!
操作方法一:打开App Store应用首页滑到最下方--选中AppleID--注销
操作方法二:设置--iTunes Store与App Store--选中AppleID--注销
checks if the client can make payments(检测App是否能支付)
getAvailablePurchases
Get all non-consumed purchases 获取未消费的商品
打印信息查询;
原因:
没有先执行getProducts,直接执行requestPurchase方法,要先拉取商品列表,再执行购买操作.
问题描述;
1.漏单必须要处理,玩家花RMB购买的东西却丢失了,是绝对不能容忍的。所谓的漏单就是玩家已经正常付费,却没有拿到该拿的道具。
解决:只要购买成功,便将购买记录(receipt等账单信息)保存下来,然后将账单信息传送给我们游戏服务器,游戏服务器获得账单后,和苹果服务器验证,账单有效的话,回馈给游戏服务器处理,游戏服务器处理后,返回给游戏客户端处理,处理完毕,将本地保存的购买记录删除。
官方文档:向苹果校验支付凭证
21000 App Store无法读取你提供的JSON数据
21002 收据数据不符合格式
21003 收据无法被验证
21004 你提供的共享密钥和账户的共享密钥不一致
21005 收据服务器当前不可用
21006 收据是有效的,但订阅服务已经过期。当收到这个信息时,解码后的收据信息也包含在返回内容中
21007 收据信息是测试用(sandbox),但却被发送到产品环境中验证 【请求sandbox校验支付凭证】
21008 收据信息是产品环境中使用,但却被发送到测试环境中验证
消耗类型: 例如:金币、道具等。
非续订订阅: non-renewable subscription 例如:VIP
您的首个 App 内购买项目必须以新的 App 版本提交。请创建您的 App 内购买项目,然后前往 App 的“App Store”页,从“App 内购买项目”中进行选择,点按“提交”。 了解更多
在上传二进制文件并提交首个 App 内购买项目以供审核后,您可以使用下表提交其他 App 内购买项目。
唐巧-iOS应用内付费(IAP)开发步骤列表
未完~待续
当使用内购购买过商品之后没有把这个交易关闭,所以再次去购买商品后就会调用以前已经购买成功的交易去购买因为已经购买过,才会有这个提示
原因:添加内购项目时,信息填写不完整,app审核图像未上传
处理方法:上传app审核图片( 合适的尺寸 ),点击提交,状态改为正在准备审核中。
这个是内购选择类型不匹配原因导致。
购买成功之后,Apple会返回以下四个数据给应用
Reference
Review the updated Paid Applications Schedule.
游客身份解决方案:即不登录也要能购买
1)服务器端做一个苹果审核机制,审核期间游客身份可以进行一切行为,一旦审核通过,修改服务端即可达到强制用户登录进行内购买的目的(这个有点。。。)
2)游客可以进行内购买,购买时以设备UUID为准,生成一个游客账号,将购买信息保存在服务器和本地,当用户登录正式账户后判断此设备是否进行过内购,有的话提示用户将游客身份购买的权益与现有账号绑定,如果绑定,游客权益则迁移到正式账户,如果不迁移,则游客身份和正是账户是两个独立账户,正式账户不享有游客身份的权益(我用的这个)
内购游客模式解决方案
iOS内购规则
即可打印出来你的app中包含的ios的function
检查下这里面有没有需要屏蔽的关键词
通过这个方式把该改的名字都换掉
1、苹果对于支付相关的审核规则
详细见[App Store 审核指南 - Apple Developer 。简单的一句话解释:就是非实物的产品的支付必须要走苹果的IAP支付通道,否则你的APP在上架审核的时候就会被appstore拒绝,从而不允许上架到appstore。
我们再来看一下苹果3.1.1条款,因为这个详细介绍了苹果支付的一些规则,以及不同的类型产品在使用苹果支付的时候的一些注意的事项,简单理解使用苹果支付应该在写清楚购买的类型,而且不允许出现引导用户使用其他支付的的字眼,如果是订阅类型的APP,提供免费使用功能的,应该描述清楚,订阅产品类型,周期,费用等等,不能含糊不清楚
如果已经审核通过上架的非实物交易APP,在苹果人员复查的过程中,发现使用第三方支付如(微信、支付宝、银行卡等)也会会再次下架
谈到苹果的支付,就必须要提一下微信的公众号的赞赏业务和小程序游戏的充值。
微信公众号赞赏整个事情经过是这样的
同样的微信里面小程序游戏的充值服务也是属于虚拟的服务,如果要在iOS端使用的话也是需要走苹果的师傅
那么苹果公司为什么对于这一块要求这么严格呢?因为苹果作为一个分发的平台要抽取30% 的收入,据相关的数据表明 2008 年 App Store 推出至今,开发者已获得了逾 1550 亿美元的收入,而仅2019一年的收入就占到了四分之一 。
由此可见这一块对于苹果的整体服务来说也是一块亮眼的收入,所以苹果在这一块来说,可以说是相当的严格
2、常见的一些问题
很多APP之所以在上架时候被拒绝,我觉很多时候都是不了解苹果的审核机制,特别是在支付这一块,如果APP涉及到支付相关问题,一定得先确定自己APP的内容是否涉及到虚拟物品相关,如果涉及首先还是需要按照苹果审核要求操作。
3、有什么比好的较解决方案
如果你的产品属于游戏类,或者知识付费类(例如得到APP,极客时间之类的)或者影音娱乐类(喜马拉雅APP,优酷视频,腾讯视频,爱奇艺)、又或者是直播类(快手、映客,陌陌等)这些是无法避免的必须要走苹果的IAP的支付通道。
如果你的APP类似知识星球APP,或者幕布APP,石墨文档之类的,APP仅仅是用于提供服务,那么付费的的操作可以在微信或者网页端实现从而避免在appstore付费。
还有就是审核的时候针对测试账号使用苹果支付,但是审核通过之后,开放微信和支付宝等第三方的支付