iOS内购非自动续期订阅 应用内支付 IAP非自动续期订阅 消耗型商品 非消耗型商品 流程

简介

本篇文章是根据一些网友建议,把IAP非自动续期订阅部分从《IAP自动续期订阅》抽离出来,方便更多的有需要的朋友简单的搜到,本文主要讲一下消耗型&非自动续期订阅的开发流程。

适用场景

IAP大量应用于iOS系统中的游戏当中,像一些游戏中的金币,宝石的交易都是采用IAP支付。苹果官方规定,当APP涉及到虚拟货币的交易时,只能使用IAP进行支付,否则会在APP审核过程中被拒绝。而我们许多生活应用使用微信支付、支付宝支付却仍可通过审核,是因为都用于现实物品的交易。此外苹果会收取虚拟货币盈利的百分之30。

类型说明

  • 消耗型商品
  • 非消耗型商品
  • 非续期订阅
  • 自动续期订阅

消耗型商品

顾名思义, 可以消耗使用的商品, 比如游戏中的金币, 钻石等, 可以用来购买应用内虚拟物品的货币

非消耗型商品

无法被消耗的商品,比如一些教育型APP中的课程, 再比如一些赛车游戏中的赛道, 这类商品需要在审核添加恢复购买按钮, 用于用户购买过后再误删除或其他原因卸载APP后的恢复流程, 否则提交审核会被拒绝

非续期订阅

此类商品与消耗型商品类似, 比如一个月的会员, 一个季度的会员等, 与消耗型商品的差异在于, 这类商品在验证凭证时需要传递共享秘钥

共享秘钥.png

自动续期订阅

此类商品网上介绍比较少, 这类商品和其他商品的流程也有些许不同, 应用比如视频APP中的连续包月会员, 此类商品到期会自动扣费, 服务器的验证逻辑也会有所不同,流程可以参考这篇文章《IAP自动续期订阅》

准备工作

iTunes Connect后台创建商品, 建立沙盒测试账号

项目类型.png

整个IAP测试阶段, 只能用沙盒测试账号测试IAP支付, 且凭证验证只能发送至测试验证环境

由于本部分较为简单, 本文不做具体介绍, 直接在iTunes Connetct后台创建按照说明创建即可

需要注意的是如果应用是第一次进行IAP开发, 首先要完善苹果商店内的个人信息 (银行卡信息、 税务相关信息)才能创建相关商品, 而且需要在下一个发布版本中审核商品, 如果曾经审核过IAP开发, 可直接在后台进行新增商品审核

支付验证流程

首先简单说明一下整个流程, 此处以我们APP开发为例, 说明客户端进行支付, 服务器端进行验证的逻辑, 保证整个IAP支付的安全性

整个流程大体为

1. 用户点击发起购买请求
2. 服务器获生成一份订单并返回App Store商品id给客户端
3. 客户端对这个商品id进行IAP商品查询
4. 用户支付调起IAP支付
5. 支付成功获取到一份交易成功凭证
6. 客户端发送订单号和成功支付的凭证到服务器
7. 服务器验证凭证是否合法,对用户业务操作(成功增加一个月会员)
8. 返回查询结果到客户端
9. 客户端业务逻辑处理

下面我会针对非续期订阅做详细说明, 消耗型商品和非续期订阅类似且相对简单

非续期订阅支付流程(以一个月会员为例)

step1:用户点击发起购买请求

用户点击客户端的对应商品item(以一个月会员为例),客户端向自己的服务器发起一个请求。

step2:服务器获取交易订单并返回给客户端

服务器接收到来自客户端的请求,对这笔交易生成一份订单,并返回这个item的App Store商品id。

/**
 下vip订单

@param params 参数  @"item_id" : @(itemID),
@param success 成功回调
@param fail 失败回调
 */
- (void)makeVipOrderWithParams:(NSDictionary *)params
                   success:(RequestOrderSuccess)success
                      fail:(RequestOrderFailBlock)fail;

step3:支付订单

客户端调用苹果自带的API对这个App Store商品id进行支付, 这里支付过程网络上demo较多, 不做说明, 具体参考github上的工具类 IAPHelper

/**
购买对应商品identifier后的回调

 @param identifier 商品identifier
 @param completion 回调
 */
- (void)payProductsWithIdentifier:(NSString *)identifier
                   completion:(IAPbuyProductCompleteResponseBlock)completion;

step4:发送支付成功的凭证到自己服务器

当用户支付成功后, 在回调中获取到凭证, 以凭证、订单号、用户uid等为参数请求服务器, 服务器向苹果服务器验证凭证是否支付

/**
查询vipIAP支付结果

 @param orderID 订单ID
 @param receipt 凭证
 @param uid 用户uid
 @param success 成功回调
@param fail 失败回调
*/
- (void)requestIAPResultWithOrderID:(long long)orderID
                        receipt:(NSString *)receipt
                            uid:(NSString *)uid
                        success:(RequestQuerySuccess)success
                           fail:(RequestQueryFail)fail;

此处, 服务器验证凭证时, 因为为非续期订阅支付, 需携带上文中的共享秘钥凭证进行验证, 苹果验证结果会返回订单的详细信息, 服务器根据返回信息来进行业务处理

屏幕快照 2017-06-09 下午3.59.05.png

客户端在收到验证结果后, 刷新界面即完成整个流程

丢单处理

由于IAP服务器无法保证质量, 或者自己服务器验证凭证出现问题时, 可能会出现丢单(用户付费成功, 但是凭证无法成功向自己服务器验证)的情况, 对于这种情况, 我们可以这样处理

在用户下单成功后, 储存订单&uid&凭证

/**
存储 订单&uid&凭证

@param orderID 订单
@param uid 用户uid
@param receipt 凭证
@param saveKey 储存key
*/
- (void)saveOrderReceiptWithOrderID:(long long)orderID
                            uid:(NSString *)uid
                        receipt:(NSString *)receipt
                        saveKey:(NSString *)saveKey;

在用户向服务器验证成功后或者非网络原因造成的失败后, 删除此条记录,

/**
删除 订单&凭证

@param orderID 订单
@param receipt 凭证
@param saveKey 储存key
*/
- (void)removeOrderReceiptWithOrderID:(long long)orderID
                          receipt:(NSString *)receipt
                          saveKey:(NSString *)saveKey;

这样如果由于网络问题或者服务器出现问题造成丢单, 我们可以在下一次用户启动APP再次去进行验证这笔订单, 重复上面流程

/**
 核对支付成功但是验证失败的订单
*/
- (void)checkLocalLostVipOrder;

伪造订单处理

IAP支付难免会出现一些伪造凭证的验证, 对此, 服务器端对于凭证的验证一定要十分谨慎, 我们APP曾收到过伪造凭证的验证, 可以参考一下验证:

  1. 核对凭证验证后itemID
  2. 核对凭证是否为正式环境的凭证
  3. 核对凭证的有效时间
  4. 对于越狱用户的处理, 之前做消耗品IAP支付的时候, 对于越狱用户由于有一些IAP插件的存在, 我们选择对于越狱用户直接进行微信支付, 随着后来判断逻辑的增加, 对于越狱用户也启用了IAP支付

审核需知

IAP审核时, 需要提供沙盒测试账号和一个APP的测试账号, 在审核过程时, 我们整个流程都已经切换为正式环境, 但审核人员仍然使用测试凭证去进行验证, 我们服务器需要在审核阶段, 对于此uid的凭证仍然去测试验证接口去验证, 否则会被拒绝通过

具体审核问题详见我写的这篇文章应用内支付自动续费 连续包月 审核注意问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349