iOS Handle Refunds 处理退款 --- WWDC20
1、前言
今年 WWDC 2020 苹果全球开发者大会,苹果宣布所有的内购品项类型,当用户退款成功时,开发者都能收到退款通知!!!退款通知!!!退款通知!!!
针对 App 内购买项目的退款通知现已可用
2020 年 06 月 24 日 App Store 服务器通知现在包含所有类型的 App 内购买项目的退款通知 (包括消耗型项目、非消耗型项目和非续期订阅)。这些信息能帮助您采取相应的行动,并告知他们相关的优惠更改,以及如何重新订阅。
针对 App 内购买项目的退款通知现已可用 - 新闻 - Apple Developer
2、处理退款
2.1 退款流程
在 2020 年 06 月 24 日之前,开发者完全不知道有用户退款了!(只有每月账单里看到退款的一个总数量 -。-):
2020 年 06 月 24 日开始,苹果新增流程:
2.2 退款通知
在苹果后台可以配置一个退款通知的回调地址(一个App配置一条链接):
配置的回调链接必须满足条件:
- 满足应用传输安全要求(使用
https
) - URL 最长 255 字符
注意:这里的 https
是指苹果的 App Transport Security (ATS),其中有协议的要求,比如使用 Transport Layer Security (TLS) protocol 1.2 版本,具体见苹果文档: Preventing Insecure Network Connections | Apple Developer Documentation。
2.3 退款通知的类型
苹果把回调的通知分为2种类型:
- 退款通知类型
- 取消通知类型
其中新增加的退款通知
类型是针对:
- 消耗型
- 非消耗型
- 非续期订阅
取消通知
类型是针对:
- 自动续期订阅
2.4 退款通知的内容
苹果返回的通知内容为 JSON 对象数据,所有的退款订单的通知是在 unified_receipt
里的 latest_receipt_info
数组中:
字段 | 说明 |
---|---|
environment |
收据生成的环境。values: Sandbox , PROD 。自动续订订阅是可以沙盒环境测试取消订阅。
|
latest_receipt | Base64编码的最新交易收据。 |
latest_receipt_info | 收据的列表 |
notification_type |
通知类型,退款的值应该是:REFUND , 可参考:notification_type
|
password | 验证收据时的 password,App 专用共享密钥是用于接收此 App 自动续订订阅收据的唯一代码。如果您需要将此 App 转让给其他开发者,或者需要将主共享密钥设置为专用,可能需要使用 App 专用共享密钥。 |
bid | App的 bundle id(包名) |
bvrs | App的版本号 |
unified_receipt |
退款的订单信息在这里
|
在 unified_receipt
里的 latest_receipt_info
是一个数组,其中包含的最近的100次应用内购买交易:
数据中每个退款订单的主要字段:
字段 | 说明 |
---|---|
original_transaction_id | 苹果订单的唯一标识 transaction_id |
cancellation_data_ms | 退款的时间 |
cancellation_reason | 用户退款的原因。(0或1,含义未知) |
bid | 应用包名 bundle id |
product_id | 商品唯一标识 id |
详细的返回字段见官方文档:
- responseBody | Apple Developer Documentation
- unified_receipt | Apple Developer Documentation
- responseBody.Latest_receipt_info | Apple Developer Documentation
2.5 退款通知的响应
您的服务器应发送HTTP状态代码,以指示服务器到服务器的通知接收是否成功:
- 如果回调接收成功,则发送 HTTP
200
。您的服务器不需要返回数据。 - 如果回调接收不成功,请发送 HTTP
50x
或40x
让 App Store 重试该通知。App Store在一段时间内尝试重试该通知,但在连续失败尝试后最终停止(3次
)。
注意事项:
- 当您使用包含退款交易的收据
transaction_data
向苹果服务器校验 verifyReceipt 时,JSON响应中不存在退款交易,自动续订订阅除外。 - 收到
REFUND
通知时,您有责任为每笔退款交易存储,监控并采取适当的措施。(因为苹果只通知一次,暂时无法在苹果后台查询退款的订单。也不能由开发者主动去苹果服务器查询。)
2.6 自动续订订阅通知
这个取消通知之前就一直有,所以这里不重复了,需要的自行搜索。
自动续订订阅的相关文档:
- Handling Subscriptions Billing | Apple Developer Documentation
- In-App Purchases and Using Server-to-Server Notifications - WWDC 2019 - Videos - Apple Developer
- Subscription Offers Best Practices - WWDC 2019 - Videos - Apple Developer
疑问解答
1、 苹果后台能否查看到退款的订单详情?
答:暂无。(估计明年 WWDC2021 会有啦?)
2、 消耗型、非消耗型、非续期订阅能不能在沙盒环境测试退款?
答:暂时不能。(估计未来会有?等更新吧....)
总结
大概就是这样,其实退款的流程并不复杂,很简单,但是为什么苹果用了那么多年才做出来呢?
要知道这个原因,还是要回顾一下历史~
退款的方式
用户可以通过那些方式申请退款:
- 联系Apple客户支持并要求退款
- 登录并使用Apple的自助服务工具 reportaproblem.apple.com 要求退款
- 要求他们的付款方式发行人退款 (比如要求银行取消扣费,或者黑卡无法扣费等)
详细:针对从 Apple 购买的 App 或内容申请退款 - Apple 支持
退款的政策
针对退款,不同国家或地区会有不同的“无条件退款期限”。
AppStore 商店退款政策:
- 欧盟区: 14天
无条件
退款。 - 中国台湾:7天
无条件
退款。 - 中国/美国/韩国等其它大多数国家:90天
有条件
退款。 (注:在中国区,每位App Store用户能享有一次无条件退款机会)
注:中国区 App Store 的具体退款政策:一个ID有一次无条件退款机会,一年2次有条件退款,第3次退款会非常难。至于退款到账时间快为36小时内,也有7-15个工作日退还。
正是这些“漏洞”,所以,出现专业的代充工作室,导致开发者坏帐非常严重~
特别是火爆的游戏代充(月流水(千万级)的12%可能就这样没了)~
很多不熟悉的朋友不太理解,总会问有那么多人退款吗?
其实,应用内购买的退款主要是针对游戏和直播打赏。游戏类的多是代充黑产;主播自己刷火箭打赏然后退款,收入照收,各种黑幕,只有业内人才懂的苦 -。-
“退款”滥用
“退款”人的具体手段方式:
- 1、利用淘宝店,以代充打折的名义获取玩家账号信息,在为玩家充值后申请退款。淘宝店获得充值金、玩家获得道具、游戏厂商亏钱;
- 2、收购消费过的App Store ID账号,要求至少要消费过500元以上。收到的账号会被用来退款和冲榜;
- 3、不断寻找有退款需求的新用户,帮其退款,收取佣金;
退款通知的意义
- 允许您对应用内内容的可访问管理 (例如游戏的宝石或金币回收或账户余额扣减等)
- 管理退款滥用
- 快速解决用户问题 (发现用户退款后,可以在应用内弹出联系客服,协助用户解决应用遇到的退款原因的问题?)
- 重新平衡游戏经济
处罚行动
一旦收到有关客户获得应用内购买退款的推送通知,作为开发人员,您可以采取七种不同的操作,从中等到严重(温和处理到严肃处理)。:
苹果旨在为客户和开发人员提供更好的体验,所以建议操作要慎重考虑。
对退款用户的处理
苹果给了一个示例,用户退款成功后,在 App 中给用户提示退款的时间和说明,可以重新购买,或者联系客服!
也许帮助需要帮助的用户,为他们解决为什么退款的原因,才能减少真正的退款用户,用户觉得值!那么退款数自然会减少~
所以,苹果当初为什么不愿意提供退款的接口?其实是一直想保护用户的隐私(退款自由),但是当“退款”滥用时,不得不这样提供了退款通知接口。
这正是我们所看到的,苹果想的,你怎么想!怎么做!想好在决定~
ps:题外话,大家一直觉得苹果的应用内购买做的很“烂”,是因为大家不太了解,苹果的这套支付系统有多复杂。可以打开下面的链接看看不同国家或地区的付款方式,要在一个应用里集成这些付款方式,不是一个支付宝或微信能想象到的。了解了才知道,唯有多学习:可与 Apple ID 搭配使用的付款方式 - Apple 支持
参考
- 针对 App 内购买项目的退款通知现已可用 - 新闻 - Apple Developer
- What’s new with in-app purchase - WWDC 2020 - Videos - Apple Developer
- Handling Refund Notifications | Apple Developer Documentation
- Enabling Server-to-Server Notifications | Apple Developer Documentation
- Handling Subscriptions Billing | Apple Developer Documentation
- App Store Server Notifications | Apple Developer Documentation
- In-App Purchases and Using Server-to-Server Notifications - WWDC 2019 - Videos - Apple Developer
- Subscription Offers Best Practices - WWDC 2019 - Videos - Apple Developer
iOS Handle Refunds 处理退款 --- WWDC20相关推荐
- iOS Handle Refunds 处理退款 --- WWDC20(Session 10661)
1.前言 今年 WWDC 2020 苹果全球开发者大会,苹果宣布所有的内购品项类型,当用户退款成功时,开发者都能收到退款通知!!!退款通知!!!退款通知!!! 针对 App 内购买项目的退款通知现已可 ...
- 苹果 iOS 内购三步曲:App 内退款、历史订单查询、绑定用户防掉单
????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金 37手游iOS技术运营团队 https://juejin.cn/post/697473339 ...
- 苹果iOS内购三步曲:App内退款、历史订单查询、绑定用户防掉单!--- WWDC21
一.前言 如果大家的 App 有使用 IAP 功能,那么可能会遇到用户反馈苹果充值成功,但是服务没有到账的情况,用户一般会提供这样的苹果收据: 用户反馈时提供的苹果收据中,有一个字段中 ORDER I ...
- 微信支付v3版本npm包
wechatpay-node-v3 # 微信支付v3 支持在ts和js中使用 欢迎大家加入一起完善这个api 前言 微信官方在2020-12-25正式开放了v3版本的接口,相比较旧版本v2有了不少改变 ...
- 电商API店铺订单接口(代码对接教程)
搜索当前会话用户作为卖家已卖出的增量交易数据(只能获取到三个月以内的交易信息) a. 一次请求只能查询时间跨度为一天的增量交易记录,即end_modified - start_modified < ...
- 淘宝官方商品、交易、订单、物流接口列表
淘宝官方商品.交易.订单.物流接口列表 1.商品API taobao.product.get 获取一个产品的信息 taobao.products.search 搜索产品信息 taobao.produc ...
- 淘宝/天猫官方商品/订单订单API接口
淘宝/天猫官方商品/订单订单API接口 测试地址:点击注册 商品接口列表 产品管理包 Taobao.product.get 获取一个产品的信息 官方文档 Taobao.products.search ...
- 淘宝API系列开发,buyer_info买家信息,买家卖家订单官方接口
接口列表 custom自定义API操作 buyer_cart_add添加到购物车 buyer_cart_remove删除购物车商品 buyer_cart_list获取购物车的商品列表 buyer_or ...
- 淘宝官方商品、交易、订单、物流接口列表(淘宝api)
大家都知道,目前淘宝开放平台的店铺订单和店铺商品接口权限已经不支持申请应用,有好多做店群业务,店铺订单同步,店铺交易,店铺订单物流,店铺订单消息推送,店铺订单插旗,店铺上传商品,店铺修改商品属性,店铺 ...
最新文章
- UTF8转换为GB编码gb2312转换为utf-8
- python3 ThreadPoolExecutor 线程池大小设置
- oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT
- Windows7部署WordPress傻瓜式教程-cnblogs
- 通过自定义消息调用主窗体的菜单项
- url 解析一个url里面的参数,获取地址栏参数信息
- postgresql数据库的 to_date 和 to_timestamp 将 字符串转换为时间格式
- python3.7模块内容_python3.7 time模块
- 点击添加一行_微信接龙表格操作方法图文教程,以及微信聊天框怎么另起一行...
- SSH连接工具-Tabby
- 智能蓝牙音箱方案的四大问题
- Facade模式新解
- 代码编程在线运行网站
- 【访问本地项目,localhosthost可以,本地ip不可以】
- [No0000163]卷福、神秘博士和一群老戏骨表演群口相声:To be or not to be该咋念,简直高潮迭起...
- android spannable 设置字体颜色,安卓文本样式-Spannable的使用
- 【Linux】Top命令参数解释
- mysql proxies priv_Mysql 5.7.18 利用 MySQL proxies_priv(模拟角色)实现类似用户组管理...
- ICLOUD储存空间要升级吗_白茶的储存,既要讲究密封,又要保持通风,是开玩笑吗?...
- 崩坏三8月20号服务器维修,崩坏38月20日版本更新维护通知怎么样 更新维护通知一览...
热门文章
- 2020年 年终总结,2021年 望‘牛’转乾坤 坚定前行!
- 2.知识表示与知识图谱笔记
- C#项目添加excel引用Microsoft.Office.Interop.Excel.dll
- hone hone clock 人体时钟
- 在OpenCV里实现负片函数imcomplement
- sql在插入语句使用子查询_SQL插入查询
- 数据库SQL:在插入语句中使用查询查询语句(动态获取数据库自增字段的值)
- ROS gazebo报错:ERROR: cannot launch node of type [mbot_teleop/mbot_teleop.py]
- 嵌入式与人工智能的关系和趋势
- 全网最新软件测试知识点总结