美文网首页iOS收藏iOS开发文章iOS开发
iOS快速上手应用内购(IAP)附Demo

iOS快速上手应用内购(IAP)附Demo

作者: SuperMario_Nil | 来源:发表于2016-05-16 01:55 被阅读7053次

    前言:最近项目中接触到内购,本文主要介绍如何开发应用内购(In App Purchase),有一些是根据实际需求做的考虑,有不同的见解欢迎留言指教~本文demo:https://github.com/maligh/MLIAPManager 运行时不要忘记更改Bundleid 跟productId。如果对你有帮助请不要吝惜你的star~

    前期需准备:* 1.在苹果后台添加商品,记下你的商品id. *2.在苹果后台创建好沙盒测试账号.这两步就不介绍了,可以简书搜一下,bing一下,soso一下,google一下。(我要改掉意识中百度一下这种说法,😄)


    图一.png

    整个内购流程如下:

    1. 应用发送请求到服务器,获取所有的可用Products Id集合,(当然你也可以把Products Id硬编码到程序中,这样会导致不能动态配置商品).
    2. 根据服务器返回的Products Id 以及信息设置购买界面UI.(这里跟图一有些不同)
    3. 用户点击购买商品.
    4. 客户端根据相应的Product Id向App Store请求产品信息,并发起购买payment.(使用StoreKit)
    5. App Store处理该payment,并返回完成的transaction
    6. 客户端从transaction中获取receipt凭证数据,并将其发送给服务器,等待返回.
    7. 服务器验证receipt凭证数据是否使用过,保存然后发给App Store验证是否合法
    8. 服务器得到App Store验证结果,返回给客户端相应购买成功或失败信息
    9. 客户端提示用户购买结果以及处理相应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
    然后你会得到类似:

    receipt.png

    结尾:好啦,不啰嗦了,快两点了😂,有不懂得或不同见解的请留言,互相交流互相学习欢迎star,最后感谢你的时间

    相关文章

      网友评论

      • 幸福的鱼:使用微信和支付宝内购付款,拿不到回调,这种的该怎么处理啊
      • zcwfeng:写的有点简单, 建议看看Swift 版本,SwiftStoreKit
        SuperMario_Nil:@zcwfeng 嗯嗯,只是简单的Demo,有很多情况没深究。
      • 孜孜_:你好,我使用了你的封装类苹果内购时,在确定购买商品后,内存暴涨,是什么原因呢?不知你的有没有
        SuperMario_Nil:@孜孜_ 恩,真机 instruments 应该就可以。 另外FBMemoryProfiler,MLeaksFinder也可以试试
        孜孜_:@SuperMario_Nil 你一般用什么工具调试啊?instruments吗
        SuperMario_Nil:@孜孜_ 内存暴涨?不会释放吗?你调试一下看看,是否有泄露。我现在App没用内购了,不便调试😂
      • 程序_影子:app里所有的销售产品都必须手动添加到iTunes里吗?我的app是销售视频的,有很多个,都需要一一添加吗?在线等~急
        程序_影子:@SuperMario_Nil 能不能加我QQ号1044083487 第一次整这个,有好多问题~求指导
        程序_影子:@SuperMario_Nil 我们现在这个流程都已经走通了,安卓都投入使用了,没办法改了,要是按照现在的流程走,我是不是每个视频都需要添加一遍
        SuperMario_Nil:充值金币,视频扣金币就好了
      • Hengry:沙盒测试弹框提示:你已成功地完成购买。 [Environment:Sandbox] 。但是银行卡的前没变动啊,这是为什么呢? 急,求救
        SuperMario_Nil:@DevHank 沙盒测试啊,又不是线上:disappointed_relieved:
        Hengry:@SuperMario_Nil 对,公司AppleID账号绑定的银行卡并没收到钱转入哦
        SuperMario_Nil:@DevHank 你也说了,只是沙盒测试
      • t_fancy:你好大牛,请问下项目内的"会员"是要用订阅功能做是吗?方便加下我的QQ么,请教下QQ:181708546
        SuperMario_Nil:是的,会员是订阅的。我不是大牛,iOS菜鸟工程师
      • 5e0134d6c890:您好,我用了您的demo,控制台打印信息:
        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];
        SuperMario_Nil:@破晓之前2222 账号是沙盒测试账号吗?
        5e0134d6c890:日志 failedTransaction: Error Domain=SKErrorDomain Code=0 "无法连接到 iTunes Store"
      • 携一两本单色书来:楼主,用了你的demo,客户端验证,苹果服务器老是返回{"status":21002},,是客户端不能验证吗?
        SuperMario_Nil:@携一两本单色书来 receipt-data域的数据有问题,你肯定传输格式有问题吧
      • Aacmr:请问楼主,漏单丢单该怎么具体解决?
      • 星尘_a998:这个我怎么运行不了呢
      • 心在前方:请问,内购要测试必须先上线么?我这边没上线怎么一直链接不到App Store,productId 都是对的,bundleID也没有问题
        心在前方:@SuperMario_Nil 409961891 能加我QQ吗,我尝试了很久,很多方法都试了 都没办法
        SuperMario_Nil:不必啊,连接不到App store 是网络不好吧
      • 孜孜_:哈喽撸主,为什么后台用了苹果正式环境,我在APP中请求商品的时候,还是沙盒环境?哪里出了问题吗
      • 怪气:你好 楼主,做IAP时,开发者账号后台创建的商品,必须通过审核后,才能进行购买测试吗?
        SuperMario_Nil:这个忘记了,我记得最坏的情况是要等24小时,不过一般都很快就能request到product吧,你再了解下
      • 孜孜_:哈喽楼主,内购支付完成后,客户端向后台服务器传输base64编码后的凭据,在传输过程中,是会遇到特殊字符需要转义吧?想问问你们后台也是这样做的吗
        孜孜_:@SuperMario_Nil 是不是在正式环境测试的时候,最低都是6块RMB购买:joy:
        孜孜_:@SuperMario_Nil 我们后台转义后才调通了:unamused:
        SuperMario_Nil:在我印象中不需要转义
      • 叫我马小帅:这个集成之后还用最别的吗,是不是上架了,他就自动不在是沙盒模式下了
        SuperMario_Nil:是的。这个内购我只写了一个大概的Demo。你要再看看是否满足实际业务或者有疏漏的地方,欢迎指出,欢迎疯狂Pull Request我:smile:
      • 叫我马小帅:app可以同时存在内购和第三方支付吗?我是购买虚拟金币的
        叫我马小帅: 无法获取产品信息,购买失败。
        叫我马小帅:提示无法连接App store是为什么呢
        SuperMario_Nil:可以,要偷偷的~:sunglasses:
      • nenhall:生产环境请求商品一直是零,开发环境下一切正常?我的app是从另一个号转移过来的,但是内购是转移后添加的
        SuperMario_Nil:我没遇到过这种情况,你调试一下,开发环境ok的话,可能不是转移的问题。
      • 孜孜_:你好楼主,我想问下,我使用测试账号购买的时候老师交易失败,是需要修改为上面的测试地址吗?还是什么其他原因?
        SuperMario_Nil:测试时应该使用地址:https://sandbox.iTunes.Apple.com/verifyReceipt
      • c1482b09ec8a:还有,那个- (void)dealloc{}并不会执行消耗操作哎
      • c1482b09ec8a:问下哈,ios内购非续订订阅的怎么弄?用了你的demo,先用非续订订阅(月卡),再用非销耗型(6元之类)的,会充值凭证解析有问题,都是非续订订阅(月卡)的,充值不到账,急求解决。
        SuperMario_Nil:@jaccty 你好,非续订订阅我项目中没接触到,应该是要有恢复购买的。凭证是什么问题?可以调试看一下。 拿到错误代码去官网看一下是什么错~
      • xxzqBryant:productID是什么
      • 流年划过颜夕:你好,我用你的框架,对消耗品进行售卖,有时会出现"This in-App Purchase has already been bought. it will be restored for free."的情况,导致无法再次购买,请问如何解决呢
      • lvcloud:对不起,很丢脸的问一句,transactionReceiptString 到底是什么……
        SuperMario_Nil:@lvcloud 凭证啊
      • 悟2023:获取到商品信息,需要对商品进行本地存储吗?
      • 悟2023:商品被添加进购买列表,然后怎么获取这个列表?
      • jueyingxx:将receipt凭证数据本地持久化,并加入请求失败重发机制。这个怎么搞啊?
      • 超_iOS:将receipt凭证数据本地持久化,并加入请求失败重发机制。这个怎么搞啊?另外如果在这一步后用户换手机了,那本地持久化不就没用了么
        超_iOS:@SuperMario_Nil 客户端需考虑将receipt凭证数据本地持久化,并加入请求失败重发机制;他这个receipt不是存在苹果么?添加监听是不是可以检测到他的支付状态来多次验证解决验证失败的问题?
        SuperMario_Nil:你说的是极端情况,感觉考虑一般情况就行了,其余走掉单流程
      • 冬日无恙:我允许demo,总是提示我无法连接到App Store。
        没戏还在演戏:@冬日无恙 怎么成功的 我一直无法连接到app store
        冬日无恙:@SuperMario_Nil 已经成功了
        SuperMario_Nil:@冬日无恙 断点跟一下
      • fea29e19c350:如果是自动订阅累的商品需要怎么购买呢,余姚修改一些什么?
      • 卡卡罗忒:我擦,一语惊醒梦中人那!!
      • 卡卡罗忒:我只接用你的bundle id可以吗?
        SuperMario_Nil:我这里只写了一个啊,实际中都是动态的,不是写死的。商品id在你们服务器存一份,然后用接口去拿,设置购买界面的UI。点击购买的时候你才开始调用苹果
        SuperMario_Nil:你把我代码里商品id改了,bundle id改了,就可以了
        SuperMario_Nil:@王璟鑫 我默认写的com,要改你自己的
      • 卡卡罗忒:在itunes中不设置协议银行卡什么的会成功吗?我请求一直是商品为0
        卡卡罗忒:@九零狗 恩恩,已经弄好了,谢了
        _铁马冰河_:@王璟鑫 设置一个测试帐号,没有银行卡也是可以的
        SuperMario_Nil:@王璟鑫 这个我没试过,按道理说是可以的。
      • 西风万里:使用支付宝支付,这个怎么做?
        超_iOS:@西风万里 我竟无言以对
        SuperMario_Nil:@西风万里 :sweat_smile:我先点支烟

      本文标题:iOS快速上手应用内购(IAP)附Demo

      本文链接:https://www.haomeiwen.com/subject/otzvrttx.html