美文网首页iOS开发系列ios出包各项 移动 前端 Python Android Java
应用内支付 IAP支付流程 自动续期订阅 丢单处理 问题 流程详

应用内支付 IAP支付流程 自动续期订阅 丢单处理 问题 流程详

作者: ElegantLiar | 来源:发表于2017-06-09 16:32 被阅读2934次

关于iOS的应用内支付(IAP), 我曾在项目开发过程中接触过两次,本篇文章将详细介绍一下整个的开发流程, 我将会介绍IAP商品支付和验证流程

适用场景

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

类型说明

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

消耗型商品

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

非消耗型商品

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

非续期订阅

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

共享秘钥.png

自动续期订阅

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

以上为商品类型的介绍说明, 我会在下文中就这支付流程做详细介绍

准备工作

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

项目类型.png

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

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

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

支付验证流程

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

整个流程大体为

  1. 客户端请求商品订单
  2. 获取IAP商品id
  3. IAP商品查询
  4. 用户支付
  5. 客户端发送订单号+支付凭证到服务器
  6. 服务器验证凭证是否合法
  7. 返回结果到客户端
  8. 客户端业务逻辑处理

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

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

首先向服务器下单, 携带后台创建的商品id, 向自己服务器下单, 在成功回调中获取单号并存储

/**
 下vip订单

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

下单成功后, 对商品进行支付, 这里支付过程网络上demo较多, 不做说明, 具体参考github上的工具类 IAPHelper

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

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

当用户支付成功后, 在回调中获取到凭证, 以凭证 订单号 用户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的凭证仍然去测试验证接口去验证, 否则会被拒绝通过

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

相关文章

网友评论

  • 首都老司机:请问 哪个字段可以看到订阅服务的过期时间?
  • 8a4deaf6f486:@ElegantLiar 您好,请问苹果返回的字段哪个是到期时间啊。
  • 请叫我喵_喵:博主,您好! 很赞!
    我的问题是这样的:用户首次订阅是优惠价格(例如:原价20元/月,首次订阅优惠价15元/月),后期自动续费价格是原价20元/月,那么这个需求怎样处理?
  • a40b7c6a7c20:您好 请问下[[IAPShare sharedHelper].iap buyProduct:product onCompletion:^(SKPaymentTransaction* trans){
    这个函数我们在开发的时候都是正常进回调的 为什么提审的时候 审核人员百分之百进不去回调呢 打回之后我们也没法复现 一直正常
  • 559f672dae58:非续期订阅支付流程(以一个月会员为例)
    我没看的在哪设置 是一个月还是两个月
    这个是不用设置的吗》??
    如果在一个月之内 再次购买 会怎样的提示呢
    直接购买成功了,还是提示已购买 不用再买
    ElegantLiar:@Ric_ 那应该是设置类型的问题,这种非续期的其实定义为消费类型的更加符合我们产品的逻辑,定义成非续期的就会有这个问题,估计是苹果那边会在此周期过后才会允许用户购买。假如还未发版,建议修改一下商品类型。
    559f672dae58:@ElegantLiar
    谢谢回答

    现在问题是 我购买了一次 然后我再买一次 系统给出的弹窗说我已购买 不需要再次购买 我没法累加会员期限
    ElegantLiar:@Ric_ 设置购买价格是在开发者后台添加商品的时候设置的,其实你可以把它当做一个可消费商品处理,只是他的名称叫做一个月会员, 例如 名称:一个月会员 价格:¥10,你们自己的服务器去处理,用户购买之后为其的VIP身份设置一个时间。
    第二个问题,一个月之内再次购买,不需要提示,如果这个用户是VIP,给他的身份累加一个月的时间,非VIP开通VIP。 这一切的业务逻辑都是你们服务器在处理,IPA支付只是一个交易支付工具。
  • 屮艸芔:请问原有的app新增IAP一定要先提审一个带内购功能的版本吗,测试怎么办,还有如果银行信息没填写完整,能做内部测试吗,谢谢
    ElegantLiar:@屮艸芔 嗯 不客气
    屮艸芔:@ElegantLiar 好的,谢谢啊
    ElegantLiar:@屮艸芔 要提交一个带内购的版本,在iTunes connect里添加了APP内购买项目之后提交商品审核,注册沙箱测试账号就可以用这个账号进行测试了(只限于注册的测试账号),以上所有操作都基于银行信息填写完整
  • Vi嗡嗡:非自动订阅类,苹果返回了一大堆订单信息包含用户历史的,只能通过最近一笔交易时间来判断吗
    雪花啤酒雪花:可以把产品ID 传给服务器,服务器就根据这个ID 做相应的操作,不需要看那一大推订单
  • Ko_Neko:写的很棒。有几个问题想请教。就是最近也在测试订阅。
    1 - 对于可自动订阅的产品,他在自动订阅的时候是否也会走 [paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions] 这个方法?我自己的沙盒测试是没有走,那么在用户自动续订的时候我自己的服务器要如何知道用户已经续订了呢?
    2 - 对于共享密钥,是在自动续订的时候向苹果服务器验证的时候需要,那么这个密钥做为参数应该加在什么地方呢?

    3 - 对于非自动续订的订阅,我试了一下在重复购买的时候提示已购买,再次点击BUY会续订。就是意味着这种类型的产品每次用户点击购买都会再付一次钱对吗?
    在我这呢:@ElegantLiar 您好,请问自动订阅到期后服务器去验证,但是拿什么验证呢,客户端又没给服务器传东西。
    Ko_Neko:@ElegantLiar 谢谢!
    ElegantLiar:1. 用户自动续订下一个周期的时候, 客户端是不用操作的, 用户第一次购买自动续订的产品后, 服务器去验证成功后, 会得到一个本周期的到期时间, 到了这个时间, 再去验证一遍, 如果周期的时间发生了改变, 用户则续订了
    2. 共享秘钥的使用去参考一下苹果的文档, 也是服务器端使用的
    3. 我们公司对于购买自动续订的项目, 项目列表里是不会返回这个项目的, 因为我们也不是很清楚苹果会怎样处理, 所以我们只把自动续订项目返回给那些从未开通过自动续订的用户
  • sea7reen:[IAPShare sharedHelper].iap.production = NO;
    在正式打包的时候 是否要切换成YES.
    ElegantLiar:这个IAPShare中他是自己做的凭证验证, 实际开发中, 我们凭证验证应该交给服务器验证, 你仔细看下我文章里写的流程, 如果你做的是单机游戏, 可以把验证写在客户端, 打包production设置为yes, 但是对于你提供的测试账号, 需要设置为no

本文标题:应用内支付 IAP支付流程 自动续期订阅 丢单处理 问题 流程详

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