先附上几篇文章:
这篇文章里说的都很详尽了,代码什么的基本可以照搬.
2.Store Kit Guide(In App Purchase)翻译
对苹果文档的翻译,如果还不了解什么是IAP需要先看一看
3.苹果官方文档
当需要注意细节问题时,要一个字一个字抠这个文档
4.iPhone,In,App,Purchase购买完成时验证transactionReceipt
这篇文章教你如何验证交易收据
上面这几篇文章基本上把IAP的整个流程都涵盖了。这里我根据我的经验(不见得是准确的)进行细节补充:
1、上传商品信息(步骤可以参考itunes connect developer guide)。这里并不一定要先上传好应用(app),你可以等程序都测试完了在上传。但是由于每个商品都是跟唯一一个应用挂钩的,所以要先创建一个应用获取其app id。也就是说只要有一个app id,就可以添加其商品,并且进行测试。
2、如果你的商品尚未审核通过,经过几个小时,你的商品就会进入沙盒。这个时候我们就可以用测试账号对其进行购买测试。沙盒模式进行测试,苹果是不会真正走信用卡扣款这一步的。
3、测试账号可以通过itnunes connect来添加,账号信息随便添就行。这里要注意,这个账号只能用于我们应用的沙盒测试,不要用于正常商品的购买(比如买个已上架的应用里面的商品),否则苹果会禁用这个账号。
4、当我们确认购买一个商品,我们会获取一个SKPaymentTransaction对象,里面的transactionReceipt是验证信息(就是一组json字符串),我们对其进行base64加密,然后按照苹果规定的格式(具体可以参考文档)发送到验证地址就可以了。验证成功后,app store返回的信息里面包含购买商品的具体信息,可以用于对账。
5、购买商品后,我们本地的交易队列中会有一个新的对象,这个交易队列是保存在本地硬盘上的,除非我们调用finishTransaction,否则交易对象不会删除。而程序开启时(这里要注意一下,下面会针对这个做详细说明)如果交易队列不为空,则ios会通知我们交易队列状态更新,我们就要根据交易对象的状态进行处理。
SKPaymentTransactionStatePurchased 交易成功,这时已经扣完钱,我们要保证将商品发送给用户
SKPaymentTransactionStateFailed 交易失败,原因很多(可以通过SKPaymentTransaction.error.code来查看具体失败原因),最常见的是SKErrorPaymentCancelled(用户取消交易),或是未输入合法的itunes id
SKPaymentTransactionStateRestored 非消耗性商品已经购买过,这时我们要按交易成功来处理。
6、如果交易失败,我们可以直接将交易从交易队列中移除。如果成功,则要发起验证,等待验证结果来进行处理。其结果无非三种,验证成功、验证非法、验证错误。
成功和非法我们都要讲交易对象从交易队列中移除,验证错误则可能是验证服务器出现故障,我们不应该删除该交易对象,待程序重新开启后,再一次进行验证,直到成功或者失败。
7、有的文章有提到这个观点,“我们应该在程序开启的时候调用addTransactionObserver,来添加观察者,否则可能会遗漏交易对象”
个人认为,这种说法不正确。IOS调用paymentQueue来通知我们交易状态更新是在添加观察者之后,如果没有添加观察者,IOS不会对交易队列做任何处理。我们要确保我们的程序有能力处理所有交易了(比如说登陆服务器成功)才添加观察者,否则反而会出现IOS调用回调函数更新交易队列状态,但是我们的程序却没有办法处理这个交易。