在正式开始前,先给不熟悉 IAP 支付的同学介绍一些基础知识,以及西瓜视频使用 IAP 的具体场景。
IAP 是苹果官方的支付方式,对于绝大多数虚拟物品的购买,苹果会强制要求走 IAP 支付,不然可能会遭遇拒审的问题。 IAP 又分为四种订阅类型,我们比较常用的是消耗型商品跟自动续期订阅。
consumable
(消耗型商品),FGO / 明日方舟 等氪金一笔 518 就是这个类型,可以反复购买,购买后的商品会被一次性消费。nonConsumable
(非消耗型商品),多年以前愤怒的小鸟解锁新关卡就是这个类型,只能买一次,买了之后永久有效。autoRenewable
(自动续期订阅),每个周期会自动扣款的商品,例如 西瓜视频的影视会员。大家用得应该比较多了。nonRenewable
(非自动续期订阅 ),不会自动扣款的,可多次订阅的商品。
从左到右分别是 进入会员中心
,调用 SDK(客户端)进行支付
,显示会员权益
三个场景的示例。
用户在进入会员中心页面后,用户选择需要购买的特定档位后,发起支付,拉起苹果的支付弹窗,完成支付后,刷新会员中心页并鉴权成功后,给用户展示会员权益。
从左到右分别是 进入详情页
,调用 SDK(客户端)进行支付
,播放完整影片
三个场景的示例图。
用户在进入详情页观看试看片段后,用户选择需要购买的特定档位后,发起支付,拉起苹果的支付弹窗,完成支付后,刷新播放器进行鉴权,成功后播放完整影片。
今天我的分享分为三个部分:
进入我们的第一部分,业务跟中台各自应该承担哪些职责。 对于中台来说,需要对业务屏蔽 IAP 的实现细节这些实现细节也包括一些订单的异常状态处理,包括掉单、补单的操作,与苹果校验订单真实性等。总而言之就是将业务所不关心的细节全部屏蔽。
而对于业务来说,就需要尽可能吸引用户下单,提高用户的转化率,优化购买流程,或者是购买更有吸引力的版权内容。同时还可能会做一些促销活动,例如买一个月会员,赠送 3 天权益等。那赠送的三天权益,或者说实际的会员到期时间,那就是业务自行管理的。同时业务还需要建立用户直接相关的数据面板,进行转化的分析等。
那么刚才是站在业务跟中台的角度去论述的。现在我们换一个思路,按客户端,服务端的角度来看问题。
对于客户端来说,一个完整的流程是在 APP 启动的时候,就开始接受 SKPaymentQueue
的消息,检查是否有未完成的订单,如果有的话就进行处理。当然如果用户发起了支付,也会进行处理。接着会解析 Transaction 中的数据,找到合适的业务方进行处理,发货完成,最后结束这笔未完成的订单。
由于大型 APP 中,例如说西瓜视频,会有多个独立的业务方,例如长视频、直播等,对应独立的业务服务器来校验订单。但是苹果的 SKPaymentQueue
只有一个。如果各个业务方都进行监听,并各自处理逻辑,会导致很多问题。
因此由一个地方进行管控,接收 SKPaymentQueue
的消息,并进行订单的转发,是一个更合适的选择。并且还可以留下完整的日志,方便排查这笔 Transaction
最后转发到了哪个业务方,进行了怎么样的处理。
那么如何确定一个商品是哪个业务方处理的呢?由于苹果的机制,在一个 APP 下,每个商品都拥有自己独立的 Product ID
,是 String 类型,不可重复。
因此每个业务方可以使用不同的前缀对各自的商品进行区分,这样就可以完成区分。当业务真的很复杂的话,还可以使用正则进行匹配。需要保证每一个 Product Id
只有一个业务方能够响应。这样方便判断这个业务方的回调能否处理。注意:每个业务线应该只处理自己的商品 ID,操作非自己业务的商品 ID 会有很大隐患(主要在延迟发货的情况下,会变成掉单)。
对于客户端来说,中台 SDK 也需要尽可能抹去的 StoreKit 细节以及各种不同的商品类型。对于业务方来说,只需要知道预订单的单号,以及 Receipt
,Transaction
等信息。同时业务方也不需要对这些信息进行解析或别的操作,仅需要将信息透传至对应的服务端即可。
刚才是只有客户端,现在我们再把服务端的部分加进来。 业务的客户端在最上,业务的服务端在最下。中间是中台的客户端,也就是俗称的支付 sdk,以及中台的服务端。
Transaction
。流程比较长,但如果我们扣掉中台的部分的话,发现对于业务来说,完全不用区分是哪种商品类型,也不用处理异常情况,甚至不需要关心这笔订单是不是在本设备上发起支付的。需要的仅是发起支付,接受支付结果。 由于订单状态复杂,且苹果的校验服务不稳定,因此可能经常发生延迟发货的情况。因此延迟发货的处理,就变得十分重要。 这里只简单列举一个 case:苹果的通知会发往同一个 Apple ID 的所有设备上,因此可能你在 A 设备上购买,第一次收到购买成功的通知却是在 B 设备上,因为 A 设备后续可能未曾启动 APP。面对这种情况,还需要查询 APP 内自有的同一账号的近期内的预订单记录,并查询到最接近的一笔,进行发货。 我们进入下一部分,建立数据看板。 这一块重点是在客户端的看板。中台那里会有 IAP 解析的监控,例如订单校验超时的次数,平均接口耗时等。基本都是服务端校验的事情了,与客户端没有太大关系,这里就不再展开。
那业务方是否还需要自己建立一些客户端上的监控呢?是需要的。众所周知,服务端的监控耗时,如 pct50,pct90 并不能完全表现为用户感知的刷新时间。同时掉单可能是中台服务验证超时,也有可能是业务服务端发货逻辑写的有问题。同时支付中台的问题也会反应到业务的埋点上,可以辅助共同排查问题。
另外一个原因是,我们无法从苹果的 API 返回值准确判断,这个用户是不是“掉单”了,因为苹果给我们的结果都是“用户取消了支付”。掉单的概念是,用户付了钱,但是却没有享受到权益。因此只能退一步,看别的有价值的大盘数据来侧面验证 IAP 服务的稳定性。
当我们站在用户的视角,他关心的就是点击按钮后并支付完成后,能不能看到视频 / 能不能享受到权益。如果不能看到,那就会比较窝火,进而造成客诉。因此业务关注的点,实际应该由用户操作的路径中进行提炼。 结合我们的业务场景,最终在创建订单、支付结果、支付后鉴权结果,三个节点建立进行监控。
同时指标需要多维观察,除了阈值报警外,波动报警(参考窗口)也可辅助排除误报。
在建立了完善的埋点之后,应对客诉事件时,进行补发也会更加方便,甚至可以根据埋点做自动化脚本辅助判断。
一般来说,用户投诉掉单时,会附上苹果发到邮箱的收据截图。在今年的 WWDC21 之前,我们是无法判断这收据的真伪的。当然预计在今年年底,我们就可以通过 Server API
,通过传入 Order ID
去向苹果查询订单真伪了。
举个例子,我们可以判断用户是否在订单发生前一段时间内是是否发生过支付行为(创建过预订单),来辅助我们判断是否应该给用户补发。当然具体的风控策略会远比这个复杂,在这里就不展开了。
我们进入分享的第三部分,StoreKit 在 WWDC20/21 上都带来了一些非常实用的新特性,对 IAP 的开发体验带来了极大的提升。
我们来回顾一下之前沙盒环境测试是一个多么复杂的流程。 需要去苹果的后台创建新的 IAP 档位,且 product id 是一次性的,申请错了会很麻烦。然后等待。创建新的沙盒账号。 如果需要测试首购优惠,则需要创建很多沙盒账号,并且来回切换。 测试自动续期订阅时,由于过期与否是苹果控制。且 1 个月的单次过期是 5min,一年的单次过期是 30min。如果苹果判定自动续期成功 2 次,你就需要等待 1h。是否续期成功,我们都无法控制。 同时由于沙盒账号没有管理页面,我们也无法进行主动的取消,这部分的测试必须上线再进行。好在一般来说订阅了一次之后,下一次扣款在一个月以后,在这期间,服务器将逻辑处理好即可。 更不用说有时候沙盒环境会无法连接,或者无法登录沙盒账号 这种服务不稳定带来的问题了。体验是极其糟糕的。
而在 WWDC20 上,苹果为我们带来了右图所示的 StoreKit Configuration File(下简称 StoreKit File),上述的问题都能解决。 如图所示是 StoreKit 文件创建一个订阅组的示范,图中圈出的部分是订阅组的优先级,跟 AppStore Connect 上的设置是一样的,可以有 1-3 三种优先级。我们可以看到,功能的支持还是十分完善的。 测试商品时,选项也是十分齐全。图中 1 是包括首开优惠,2 是促销优惠,都是可以进行设置的。 左图是可以本地管理历史订单,可以在控制台上选择一笔订单进行退款。方便开发者对退款的场景进行测试。 在左图的面板里,还可以取消订阅的,尽可能模拟可能发生的用户行为。
右图可以设置 自动续期订阅的过期时间,曾经苹果的自动续期订阅会由后台来自动帮你续期,或者续期失败。而一年的订阅产品,一次等待需要半小时,十分浪费时间。有了 StoreKit File 之后,对于升降级的测试,也更方便,不用等待 30min 再进行,自由决定时间的流逝速度。
右图中还有控制家长监控购买(Ask to Buy)。
综上,我们就在 APP 内,进行完整的,带支付流程的单元测试,不用再等待沙盒的商品生效。
对 StoreKit File,做个总结,极大节约了开发自动续费时的开发以及测试成本。当然因为是测试的票据,所以需要服务端配合对检验订单的过程进行一些改造。
在 iOS14 的设备上,设置 - App Store - 翻到最下面登陆沙盒账号之后,单击沙盒账号,再点击 Manage 就可以进入管理页面。iOS14 之前,沙盒账号是没有这个管理页面的。在这个页面里可以做到:
下面我们会介绍 StoreKit2 的新特性,这些特性全部只有 swift 的 API,且仅对 iOS15 生效。但其中也有一些新特性,我们可以轻松接入。
isEligibleForIntroOffer,这个属性的放出可以说是解决了判断能否享受首购优惠重大难题。并且这个属性的接入不需要迁移整体的支付流程至 Swift,只是接入获取 Product 的部分即可。 在有这个属性之前,我们如果要判断这个 Apple ID 是否能享受首购优惠 (IntroductoryOffer) 是非常复杂的。 iOS11 还必须要服务器帮助,iOS12 虽然可以本地判断了,但依旧麻烦。简单介绍下 iOS12 的流程。
Purchase 方法调用后就能发起购买,不得不说,新 API 这个只需要一句话就能发起调用还是很舒服的,对使用方屏蔽了 SKPayment 与 SKPaymentQueue 的调用。
let result = try await product.purchase()
Purchase 方法同时还提供了一些自定义的参数,可以在调用 purchase 方法的时候传入一些信息,其中 appAccountToken 是最有用的,能解决延迟发货或掉单时无法准确补发的问题。
之前我们往往会将需要保存的预订单信息放到 SKPayment.applicationUsername 中去,但是实际情况中我们发现,这个参数总是会有丢失的情况,且苹果已经明确标注这个字段不可信。因此在购买前,需要提前创建一个预订单,将设备账号等信息储存至服务端,在服务器层面做一次映射,以应对延迟发货的问题。
希望这个参数足够稳定,不会在实际使用中丢失,建议在适配后进行观察。
对于 custom 参数,疑似是苹果为后续升级也能兼顾到低版本系统准备的。在 Beta 版本中尝试往其中注入自定义参数,这些自定义参数在 Transaction.payloadData 属性中也没有返回。或许是只有苹果限定的值才会生效。这也对上了上一章中提到的为后续低版本兼容准备的 BackingValue。
如果可以由我们自行注入参数那就是最好的了,但这个得等正式版放出后再进行验证。苹果官方在本 session 中并未展开。 对这部分新特性做个总结,如果你的 APP 对自动续费需求强烈,且产品形态经常使用 首购优惠 (Introductory prices),那么接入 StoreKit 2 绝对不容错过,实用性很高。appAccountToken 也有望解决困扰已久的掉单补发难题,开发者也能在应对恶意退款时做出对应的处理。
作为代价,因为这些新 API 仅对 iOS15 生效,对于需要支持老 iOS 版本的,原本的代码都无法舍弃,不仅是客户端,业务的服务器也将面临维护两套支付代码的窘境。是否值得接入,就由各位自行拿捏吧。 此前想要在 iOS 平台上退款还需要面临一个问题,就是退款申请页面的入口实在很隐蔽。当消费者出于某种原因想要退款就需要到苹果官网进行操作,但在其页面上并没有关于这一点的一级或二级入口,而直接搜索“退款”,则只会被引导到 Apple Store 的退款,也就是关于苹果硬件设备的退款页面上,但真正的 App Store 退款地址却是 reportaproblem.apple.com。
在未来的 iOS 15 中,用户能够直接在 APP 中完成退款操作的体验,无疑会极大的方便消费者。即便你一时冲动进行了不理智的消费,最起码可以现场就在 APP 中直接申请操作,而不用搜索“ iOS 退款”而被引入黑产团队的陷阱中。可能以后,能在 APP 内退款,也会成为一条审核标准。
关于 IAP 这一块,入门成本一直很高。部分原因是苹果之前的 API 设计不友好,且服务本身不如支付宝或微信一样稳定,在这两年的 WWDC 中我们可以看到苹果在这方面的努力。
篇幅所限,想详细了解 StoreKit 的新特性的话,可以查看这几篇文章。 【 WWDC21 10114 】 初见 StoreKit 2 【 WWDC21 10175 】 IAP 用户退款与客诉处理优化 【 WWDC21 10174 】 IAP 后台通信优化与实践 【 WWDC20 10659 】 介绍 Xcode 中的 StoreKit 测试
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/XGj95MLg4HWU6dhuqGdEOg
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。