1883人阅读
以下为纯个人经验总结,网上查询过一些关于内购IAP的代码,大多只简单介绍了IAP的流程,关于安全性方面的建议不足,实际测试中,在程序不崩溃的前提下,支付的安全性才是整个内购过程中首要考虑和保证的。
(代码感觉挺乱,也不够严谨,期间修修改改多次,文中的截图只能保证逻辑合理,看到的话就勉强忍一忍,毕竟具体实现看具体需求啦)
一个完整的iOS购买交易流程图:
公司的项目主要为游戏,游戏工程对接iOS支付时主要使用sdk的方式,所以在上图中标注了『sdk服务端』,『sdk客户端』,『游戏服务器』和『游戏客户端』,如果项目为app,则只用app客户端和服务端即可,向服务端获知订单合法性和确认发放道具均由客户端执行。
游戏项目都会用到苹果内购IAP(In App Purchases)的功能,整理了下自己的相关代码,还有在iap接入游戏过程中遇到过的一些问题,在这里分享一下。
& & & 公司内部有商务平台人员负责开发者账号相关功能,如何去创建App ID和product ID,就不叙述了,主要强调下product ID的类型。
&& & & product ID可以选择三种类型,
& & & & & & & non-consumable(购买一次,永久使用,非消耗品)
& & & & & & & comsumable(多次购买,消耗品)
& & & & & & & subscription(自动续款,订阅。目前多适用于杂志或者新闻类型的app,包含自动续费和非消耗性续费,如月卡等)。
& & 目前常用到的是non-consumable和comsumable两种类型,主要区别是是non-consumable只能购买一次,comsumable可以无限制购买。如果游戏中有non-consumable这种类型的商品,需要在游戏中提供一个restore按钮,来实现”恢复购买”功能,否则应用审核会被拒(亲身经验),如果只有comsumable类型则没有这个需求。
在开始调用IAP接口之前需要对xcode工程进行一些配置,首先你要确定的是项目的bundle Identifier是正确的,与你的appid(支持IAP)相对应,然后需要在项目中添加 StoreKit framework。
下面为代码的具体执行:
首先在.***件中导入头文件和遵守协议,声明相关成员变量和block
***用户支付的结果。如果没有这句代码的话,那么 paymentQueue:updatedTransactions 这个回调将不会被执行,无法***获取用户支付结果信息&
用户点击购买按钮,游戏需要传入对应商品的productID(此处可block回调表示最终的购买结果)
在这个方法里,建议使用Reachability文件或者系统检测方法做一下网络判断,有网的情况下,查询用户是否允许应用内付费 “[SKPaymentQueue canMakePayments]”,如果可以则继续
如果用户允许购买,可以继续执行下一步(_productID是声明的全局变量,用来保持游戏传入的productID),声明一个临时集合,包含_productID的数组,去创建SKProductsRequest请求,此请求用来查询_productID是否存在之前已经在itunes connect配置完的productID列表中
开始查询后,如果SKProductsRequest请求成功就会进入对应的成功回调。
在回调里可以获取对应productID的相关信息,如果“获取产品信息失败”则直接return,如果获取成功,需要去触发购买请求,创建一个新的SKPayment对象,并且把这个对象加载到队列中去。此时购买请求的API将被触发,系统会自动弹出提示信息,类似“你确定购买xxx产品吗?需要支付多少金额”
SKProductsRequestDelegate中并没有给出查询请求失败的回调函数,不过在SKProductsRequest的父类SKRequest发现有一个requestFailedWithError的协议方法,亲测后发现是可以当作查询失败的回调来调用的(还有一个requestDidFinish成功的协议方法,不过没有使用过)
在这个requestFailedWithError的方法里做了相关操作
接下来便是用户的支付操作。
当支付完成,取消或者失败的时候,将会执行paymentQueue:updatedTransactions回调
SKPaymentTransactionStatePurchased,交易完成/成功,进入完成交易的自定义处理方法
SKPaymentTransactionStateFailed,交易失败/取消,进入交易失败的自定义处理方法
需要注意的是在用户支付结束后(无论成功和失败)都必须执行
“ [[SKPaymentQueue defaultQueue] finishTransaction: transaction];”,
苹果会从队列中删除已经完成的交易的记录,否则下次点击支付会提示『该商品已经购买,需要恢复』 。
注:由于苹果支付的特殊性,支付的结果信息全部只能从客户端获取,如果客户端被外挂破解(越狱设备容易出现),模拟客户端发向苹果的请求,最终导致游戏方收到成功的通知,便会给游戏方造成极大的损失。所以在支付成功后,客户端可以获取交易的收据transaction.transactionReceipt(如下图),将此收据base64加密后和其他相关信息发送给自己的服务器,然后由服务端向苹果方面验证收据的合法性,如果收据合法,服务端可通知游戏方交易成功,也可以通知客户端进行相关操作(取消Loading动画,删除本地保存的收据信息等)。这样便可保证交易的正确性。
(以下向苹果验证的行为可交予服务端执行)
向苹果验证的地址:
appStore上线:
沙盒测试:&
请求json数据:单键值对{&receipt-data& :
&base64编码后的数据&}
苹果返回json数据App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:
& status” : 0,
& receipt” : { … }
status的值为0,则表示交易合法,收据有效,否则无效
receipt中对应的内容:
为避免用户在支付过程中清除游戏进程,或者网络中断而出现支付结果丢失,最终导致用户已付费但游戏并没有发放道具的情况,所以在获取用户订单orderid和苹果回调的receipt后,将其存储在本地(我选择的是userdefaults存储),如果出现上述支付问题的情况,在用户再次登录游戏或者重新点击支付时判断本地存储信息是否同时存在订单orderid和receipt,如果同时存在,则去执行下图
如果同时存在,会出现两种可能:
1. 客户端向服务端发送包含recipt请求失败
& 2. 服务端向客户端告知合法性时失败
但存在receipt可以肯定的是用户已完成扣费,苹果会记录用户付费状态,下次进入程序后执行[[SKPaymentQueue defaultQueue] addTransactionObserver:self];注册***者,苹果会主动执行- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *) 根据上一次交易的状态执行对应的方法。
update采用的block,在[self completeTransaction:transaction]里获取receipt后进行回调
恢复购买:
还有第三种需要自己去处理的交易结果“SKPaymentTransactionStateRestored,恢复已经购买过商品”,单独说明一下。
在文章开始已经强调过,只有使用productID类型存在non-consumable的类型时需要添加一个“restore”按钮来执行恢复购买功能。
点击“restore”按钮后只需要执行:
执行后,系统会自动检测,在当前用户完成交易的队列中是否存在已经有购买过产品的事件,如果有的话将会重新完成交易,进入-paymentQueue:updatedTransactions回调,如果没有则恢复失败,进入失败回调;
在-paymentQueue:updatedTransactions里“SKPaymentTransactionStateRestored”情况下
进行方法处理
对于需要恢复购买的productID,如果只有一个的话可以直接在此方法中直接block返回,如果存在多个,则声明一个可变数组
在此方法中addObject添加id,在-paymentQueue:updatedTransactions:(NSArray*)中的遍历结束后进行反馈
最后需要注意的是:
1.建议使用非越狱iOS设备进行IAP测试。越狱后的iOS设备,无法进行沙盒测试,可能会受到一些第三方插件的影响。
2.在测试之前先在iOS设备的设置中把当前appStore账号注销掉,非测试账号沙盒测试是无法查询到productID对应的产品信息。
3.不能同时进行多个交易,否则会因为苹果在未执行第一个交易的finishedTrancation时,收到第二个交易请求,最终结果会是第一个交易成功,而第二个交易会弹出『已经购买的』提示。
&& & 4.如果用户在苹果系统弹出的是否购买框中选择确认购买后,此时程序出现崩溃或者杀死程序进程,或者网络中断等极端情况下,会造成客户端无法获取苹果服务端反馈的receipt,最终出现用户已扣费,但道具未能发放的情况。目前没有较好的处理方法,只能采取线下验证用户交易,然后主动补发道具。
5.服务端需要执行严格的支付订单信息验证,来保证不出现被第三方工具刷单的情况。向苹果求证receipt的步骤建议交由服务端去做,客户端的数据安全性不值得信任。
以上,仅为个人见解,不够成熟,如各位发现问题,请随时指出,不尽感谢
&&相关文章推荐
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2295次
排名:千里之外高温天气开始咯,大家要合理安排出行时间哦。
WWDC 2017 上最大的惊喜是什么?不是 HomePod,也不是 iMac Pro,而是 iOS 11 的 ARKi...
苹果的应用设计奖 Apple Design Award 2017 获奖名单出炉了。
现在来看,iOS 11的确是一次非常全面的升级。
不过只要是合理的要求,苹果都是很乐意合作的~
高考能够拿个好成绩就行,手机什么的其实并不重要(反正算命的说我今年能考上好大学)...
Core ML才刚刚起步,它将如何为苹果的生态圈打造智能应用,才是苹果所关心的。
用好了将会是一种荣耀,用不好的话,没什么实用性而且设计会让人觉得尴尬~
现在随着交通越发的发达便利,全球化的步伐加快,出国旅游成为了大家享受生活,认识世...
《Chichens》开发商HyperBeard Games近期推出的一款点击类手游,游戏乍看之下与以往玩...
原本我们的主角和自己的妹妹在一起,但是突然有一天他发现自己的妹妹消失不见了,当找...
《分形的奥秘》是一款由国人打造的数学应用,看标题就知道,这个 App 是专门为你讲解...
玩家对快节奏游戏的钟爱以及厂商不断调整的产品线策略,让如今的RTS(即时战略游戏)...
在游戏市场中就有一部分以专门模拟某个职业或者类型的工作为主的游戏作品,本周,游戏...
去年11月份的韩国 Gstar2016 游戏大展上,TTGames、华纳以及 Nexon 三家宣布合作,共...
这次限量定制版分别挑选了 《王者荣耀》 当中最受欢迎的五位英雄人物,分别是兰陵王、...
它体现了苹果的一些更好的特点,如注重细节和高品质工艺。
除了与新保护套整合之外,Apple Pencil 的延迟也有所改善。
除了提供保护壳之外,这款产品还搭配有一个可拆卸的键盘。
要弄一套深空灰的Mac配件,不是那么容易哦。
即便不是 iPhone、Mac 这样的产品,HomePod 作为“苹果出品”,还是有它的偶像包袱的...
这款键盘,是不是你等待已久的?
你会选择购买一款比iPhone还要贵的iPhone保护壳吗?
限时免费,帝国塔防2修改超级变态,内购破解游戏存档,越狱与否通用账号放送!
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
青苹果, 积分 156, 距离下一级还需 44 积分
本帖最后由 orgvip 于
12:00 编辑
威锋游戏存档专辑第二辑:帝国塔防2,修改超级变态,内购破解游戏存档,越狱与否通用,Game Center账号解封,福利放送!
你值得拥有的塔防游戏存档!!!
存档中的装备武装全解锁,还有砖石21亿!!!
下载1:封釉们敬请谅解,存档威锋不让发,发了好几次都封了,今天放出来了,希望你们喜欢!存档在最下角,喜欢的话记得支持我!
下载2:封釉们敬请谅解,存档威锋不让发,发了好几次都封了,今天放出来了,希望你们喜欢!存档在最下角,喜欢的话记得支持我!
只需自行下载存档 ,无需越狱也能修改存档!
存档使用,如操作错误,存档就可能被清空,修改游戏时,可能需要删除存档或者覆盖
当前存档。没关系,每隔一两天都会对存档进行一次恢复 ,如果
存档不好用 发信息、打招呼、加好友“结婚是技术”(威锋账号):
或私信我,其他即时通讯联系。
封釉们敬请谅解,存档威锋不让发,发了好几次都封了,今天放出来了,希望你们喜欢!存档在最下角,喜欢的话记得支持我! 锋友们的支持,下载量、留言评论、回复加分,就是我更新的动力!!!
(95.93 KB, 下载次数: 24)
15:11 上传
(84.22 KB, 下载次数: 13)
15:12 上传
(90.17 KB, 下载次数: 11)
15:12 上传
10:54 上传
点击文件名下载附件
2.14 MB, 下载次数: 7423
10:55 上传
点击文件名下载附件
2.25 MB, 下载次数: 265
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
提示: 作者被禁止或删除 内容自动屏蔽
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
谢谢楼主分享!
锋友们的支持,下载量、留言评论、回复加分,就是我更新的动力!!!
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
提示: 作者被禁止或删除 内容自动屏蔽
注册时间 最后登录
在线时间0 小时 UID
主题帖子人气
威锋有你更精彩!& & & &
注册时间 最后登录
在线时间3 小时 UID
主题帖子人气
您需要登录后才可以回帖
回帖后跳转到最后一页
威锋旗下产品
Hi~我是威威!
沪公网安备 29号 | 沪ICP备号-1
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!