前言:最近项目中接触到内购,本文主要介绍如何开发应用内购(In App Purchase),有一些是根据实际需求做的考虑,有不同的见解欢迎留言指教~本文demo:https://github.com/maligh/MLIAPManager 运行时不要忘记更改Bundleid 跟productId。如果对你有帮助请不要吝惜你的star~
前期需准备:* 1.在苹果后台添加商品,记下你的商品id. *2.在苹果后台创建好沙盒测试账号.这两步就不介绍了,可以简书搜一下,bing一下,soso一下,google一下。(我要改掉意识中百度一下这种说法,😄)
图一.png
整个内购流程如下:
- 应用发送请求到服务器,获取所有的可用
Products Id
集合,(当然你也可以把Products Id
硬编码到程序中,这样会导致不能动态配置商品). - 根据服务器返回的
Products Id
以及信息设置购买界面UI.(这里跟图一有些不同) - 用户点击购买商品.
- 客户端根据相应的
Product Id
向App Store请求产品信息,并发起购买payment
.(使用StoreKit
) - App Store处理该
payment
,并返回完成的transaction
- 客户端从
transaction
中获取receipt凭证数据
,并将其发送给服务器,等待返回. - 服务器验证
receipt凭证数据
是否使用过,保存然后发给App Store验证是否合法 - 服务器得到App Store验证结果,返回给客户端相应购买成功或失败信息
- 客户端提示用户购买结果以及处理相应UI.
以上流程需注意:
- 6~7步的时候,请求可能发送失败。客户端需考虑将
receipt凭证数据
本地持久化,并加入请求失败重发机制;除了重发,请求也可能遭到拦截篡改,合理的加密方法可以增加伪造破解的难度。 - 6~7步也可以改成客户端本地验证,不过不推荐除非是一些单机应用。
- 服务器验证的时候注意:测试时应该使用地址:https://sandbox.iTunes.Apple.com/verifyReceipt ,生产环境地址:https://buy.itunes.apple.com/verifyReceipt . 这里要注意APP提交审核的时候测试人员使用的一般是沙盒环境
客户端内购代码就不罗列了,请看demo:https://github.com/maligh/MLIAPManager ,注释写的挺详细的,有更好见解的请留言,觉得有帮助请star~~😄
下面我贴一下大概服务端代码:
demo文件中iap.py:
import httplib
import json
receipt = raw_input("Enter Your transactionReceiptString:")
jsonStr = json.dumps({"receipt-data": receipt})
#connect = httplib.HTTPSConnection("buy.itunes.apple.com")
# sandbox
connect = httplib.HTTPSConnection("sandbox.itunes.apple.com")
headers = {"Content-type": "application/json"}
connect.request("POST", "/verifyReceipt", jsonStr)
result = connect.getresponse()
data = result.read()
connect.close()
decodedJson = json.loads(data)
print decodedJson#测试查看
# status = decodedJson[u'status']
# if status == 0:
# 验证成功逻辑
# elif status == 21007:
# 重新给沙盒环境发送一遍
# else:
# 验证失败逻辑
使用方法:
替换iap.py 中的receipt值
然后进入命令行中执行 /usr/bin/python2.7 iap.py
然后你会得到类似:
结尾:好啦,不啰嗦了,快两点了😂,有不懂得或不同见解的请留言,互相交流互相学习欢迎star,最后感谢你的时间
网友评论
2017-07-03 09:18:13.285097+0800 AppPlant[10765:2549805] 请求商品: AP.GM.1
2017-07-03 09:18:16.105103+0800 AppPlant[10765:2549805] 商品:打赏1元被添加进购买列表
然后就没然后了,手机也没反应,请问是什么原因?
直接运行您的demo也是这样的。
viewDidLoad代码:
[MLIAPManager sharedManager].delegate = self;
点击按钮代码:
[[MLIAPManager sharedManager] requestProductWithId:productId];