应用内支付IAP支付流程丢单处理问题流程详解

应用内支付IAP支付流程丢单处理问题流程详解关于 iOS 的应用内支付 IAP 我曾在项目开发过程中接触过两次 本篇文章将详细介绍一下整个的开发流程 我将会介绍 IAP 商品支付和验证流程适用场景 IAP 大量应用于 iOS 系统中的手游 页游当中 像一些游戏中的金币 宝石的交易都是采用 IAP 支付 苹果官方规定 当 APP 涉及到虚拟货币的交易时 只能使用 IAP 进行支付 否则会在 APP 审核过程中被拒绝 而我们许多生活应用使用微信支付 支付宝支付却仍可通过审核 是因为都用于现实物品的交易 此外苹果会收取虚拟货币盈利的百分之 30 类型说明消耗型商品非消耗型

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

适用场景

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

类型说明

  1. 消耗型商品
  2. 非消耗型商品
  3. 非续期订阅
  4. 自动续期订阅

消耗型商品

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

非消耗型商品

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

非续期订阅

自动续期订阅

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

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

准备工作

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

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

支付验证流程

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

整个流程大体为

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

非续期订阅支付流程(以一个月会员为例)
首先向服务器下单, 携带后台创建的商品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; 

自动续期订阅支付流程(连续包月)

支付流程和上方一致, 不同的特殊处理是, 服务器在验证成功后会储存用户的这个凭证,当用户此阶段会员到期时, 再次查询凭证, 当查询凭证有效期发生了变化, 根据具体请求结果, 为用户延长一个月的会员, 否则, 到期取消会员

丢单处理

由于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曾收到过伪造凭证的验证, 可以参考一下验证:

审核需知

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/221248.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午6:34
下一篇 2026年3月17日 下午6:34


相关推荐

  • python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv

    python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv量化研究尤其是进行基于价值投资的量化研究,需要上市公司的历史估值数据,如市盈率PE,市净率PB,或者市销率PS,市现率PCF。而有的人喜欢用exce或者csv文件的格式存放数据并且分析。我这里介绍一个网站,BaoStock,既支持直接下载历史数据为csv,也支持用程序下载数据并生成csv格式。网站地址是www.baostock.com,如果要下载历史估值数据,进入首页后,选择“沪深A股估值指标(日…

    2022年6月24日
    44
  • Dangling 指针

    Dangling 指针空悬指针 danglingpoin 2009 07 1011 19366 人阅读评论 0 收藏举报空悬指针在 EffectiveC 中文版 侯捷译 的条款 29 P128 简单的提到过 按我的理解 空悬指针 danglingpoin 是指指向一块已经删除了的内存的指针举个例子 int pa newint

    2025年11月7日
    4
  • 10款sublime插件推荐

    10款sublime插件推荐1. PackageControl作为安装SublimeText插件的必备利器,PackageControl是这款编辑器的标配,可以方便开发人员快速安装需要的插件。2. Git在工作中,版本控制软件最常用的软件之一,而最流行的VCS是 Git。你是否厌倦了保存文本文件,并切换回终端运行一些Git命令。如果你能从文本编辑器本身执行Git命令

    2022年6月24日
    45
  • php soapclient 参数,PHP SoapClient参数问题

    php soapclient 参数,PHP SoapClient参数问题使用 SOapUi 软件测试可以传输成功 使用 PHPSoapClien 参数传不过去 帮忙看看调用 TransDIYOrde 函数该如何传参 WSDLarray 1 0 gt string 89 TransDIYOrde TransDIYOrde paramet

    2026年3月16日
    2
  • 自动化测试——unittest框架

    自动化测试——unittest框架自动化测试——unittest框架文章目录自动化测试——unittest框架unittest一、TestCase(测试用例)二、TestSuite(测试套件)和TestRunner(测试执行)三、TestLoader(测试加载)四、Fixture(测试夹具)4.1方法级别4.2类级别五、断言六、跳过七、数据驱动(unittestddt)八、测试报告8.1自带测试报告8.2生成第三方测试报告unittest1、什么是Unittest框架? python自带一种单元测试框架2、为什么使用Un

    2022年10月14日
    2
  • loadrunner视频教程百度云_loadrunner使用教程图文

    loadrunner视频教程百度云_loadrunner使用教程图文播客视频,java虚拟用户http://www.boobooke.com/v/bbk1900/LR动态链接库小布老师视频:测试工具概述,兼LoadRunner介绍-1-4http://www.boobooke.com/v/bbk1046http://www.boobooke.com/v/bbk1047http://www.boobooke.com/v/

    2022年10月14日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号