后端做app连续会员包月功能 -- IOS连续订阅 支付宝周期扣款
IOS连续订阅总结
如何判断后续用户是续费
1. 服务端轮询续费表,会员到期的前一天,根据用户id。去苹果服务器检验用户是否续费成功a. 查询的状态应有:等待扣费、扣费失败b. 扣费失败 , 对于扣费失败的用户, 苹果仍会尝试扣款60天, 此时应该标记为扣费失败, 轮询时会查到该数据c. 已关闭, 订阅已经关闭, 不会再次扣费, 轮询时不会查到该数据d. 如果扣费成功,正常发放会员权益即可2. 用户进入会员首页时,检查用户订阅时间,如在扣款时间内,去苹果服务器获取用户订阅状态查询会有几种状态a. 有新的扣费(下个周期的扣费): 正常发放会员权益即可b: 已经关闭订阅: 更新用户订阅状态c: 已更换其他连续订阅产品:目前我们是只允许往高阶段更换(连续包月可以升级到连续包季,但是连续包季不能降低到连续包月),ios内购那边,如果你升级了,会按照当前商品时间比例退款,并同时变更为新的续订商品。所以我们服务端,需要按时间扣除会员权益,并更新为新的连续商品。d: 扣款失败:更新用户订阅状态为:扣费失败e: 有退款:退款逻辑f: 如果用户切换app账号,再用同一个appid连续订阅商品的时候,会切换绑定
苹果的异步通知类型
- INITIAL_BUY: 首次订阅成功
- CANCEL: 取消了订阅
- RENEWAL: 恢复了订阅
- INTERACTIVE_RENEWAL: 也是恢复了订阅,在sandbox测试时,6次收据之后,重新订阅,就会是这个状态
- DID_CHANGE_RENEWAL_PREF: 也是取消了订阅,在sandbox测试时,6次收据之后,就会变成这个状态
- DID_CHANGE_RENEWAL_STATUS:各种状态改变下都会调用,比如说首次购买会收到两次回调,一个是INITIAL_BUY一个是DID_CHANGE_RENEWAL_STATUS
苹果连续订阅表的设计
type AutoSubscriptionUserId string `bson:"userId" json:"userId"` // 当前权益的用户idOriginalUserId string `bson:"originalUserId" json:"originalUserId"` // 原始订阅的用户idOriginalTransactionId string `bson:"originalTransactionId" json:"originalTransactionId"` // 原始订阅唯一标识OriginalReceipt string `bson:"originalReceipt" json:"originalReceipt"` // 原始票据Receipt string `bson:"receipt" json:"receipt"` // 上一次的票据TransactionId []string `bson:"transactionId" json:"transactionId"` // 每一期的唯一标识OrderId string `bson:"orderId" json:"orderId"` // 订单idStatus int `bson:"status" json:"status"` // 订阅状态 100 订阅中; 101 关闭订阅;RenewStatus int `bson:"renewStatus" json:"renewStatus"` // 续费状态. 100: 扣费成功; 101: 等待扣费; 102: 扣费失败OriginalProductId string `bson:"originalProductId" json:"originalProductId"` // 一开始订阅的商品idProductId string `bson:"productId" json:"productId"` // 现在订阅的商品idExpiresDateMs int64 `bson:"expiresDateMs" json:"expiresDateMs"` // 订阅周期过期时间 毫秒PurchaseDateMs int64 `bson:"purchaseDateMs" json:"purchaseDateMs"` // 订阅周期开始时间 毫秒UpdatedAt int64 `bson:"updatedAt" json:"updatedAt"`CreatedAt int64 `bson:"createdAt" json:"createdAt"`
支付宝自动续费文档
周期扣款场景为 支付并签约
准备工作
微服务pay, 需要提供的基础接口
1. 原创建接口 加周期扣款参数
2. 查询签约接口
3. 解约接口
4. 后续扣款接口
5. 开发语言:go
6. 第三方sdk: https://github.com/smartwalle/alipay
恶心之处最短周期7天,测试时只能提前5天扣款,不能短时间调试
逻辑
1. 跟ios内购不太一样的地方就是,支付宝后续扣款需要自己去按照时间调接口扣款,不能像苹果一样,自动触发。
2. 还有在测试开发的时候,并不能短周期扣款(ps: 苹果在沙盒环境,连续包月、包季、包年会每5、15、60分钟自动续费一次)。导致不能随意所欲的跑完整个周期。目前我是这样设置的,测试服设置为7天一个周期,在支付成功后,过5分钟自动扣费一次,即下个周期的费用,但是后续就不能扣款了。只能这样
3. "execute_time" 支付宝里这个参数踩了坑,只能比这个时间早,不能比这个时间晚。比如我设置的时间为2021-09-12,扣款时间只能是 2021-09-07 ~ 2021-09-12,超过这个时间不能扣款了。如果后续想再扣款,需要调接口更改签约协议的扣款周期了。
4. 目前我的做法是,在续费表中,写入下个周期扣款的日期。每天轮询,如果有当天的扣款日期,就进行扣款。目前测试服没啥问题,线上待观察
5. 其他检查协议的逻辑,基本跟苹果续订类似,也是在用户查看会员 或者 定时的去查询用户的续订状态
支付宝签约表的设计
- 因为支付宝可以不同周期的同时存在,跟苹果的有冲突,所以重新建了一张表,结构类似
type AliPayAgreement struct {UserId string `bson:"userId" json:"userId"` // 当前权益的用户idExternalAgreementNo string `bson:"externalAgreementNo" json:"externalAgreementNo"` // 商户签约号,代扣协议中标示用户的唯一签约号(确保在商户系统中唯一)ExecuteTime string `bson:"executeTime" json:"executeTime"` // 下次扣款时间AgreementNo string `bson:"agreementNo" json:"agreementNo"` // 签约后的 用户签约号Sign string `bson:"sign" json:"sign"` // 用户签约号TransactionId []string `bson:"transactionId" json:"transactionId"` // 每一期的订单idOrderId string `bson:"orderId" json:"orderId"` // 订单idStatus int `bson:"status" json:"status"` // 订阅状态 100 签约中; 101 关闭签约; 102 待签约;RenewStatus int `bson:"renewStatus" json:"renewStatus"` // 续费状态. 100: 扣费成功; 101: 等待扣费; 102: 扣费失败ProductId string `bson:"productId" json:"productId"` // 现在订阅的商品idExpiresDateMs int64 `bson:"expiresDateMs" json:"expiresDateMs"` // 订阅周期过期时间 毫秒PurchaseDateMs int64 `bson:"purchaseDateMs" json:"purchaseDateMs"` // 订阅周期开始时间 毫秒UpdatedAt int64 `bson:"updatedAt" json:"updatedAt"`CreatedAt int64 `bson:"createdAt" json:"createdAt"`SignAt int64 `bson:"signAt" json:"signAt"`CloseAt int64 `bson:"closeAt" json:"closeAt"`FirstPrice int `bson:"firstPrice" json:"firstPrice"` // 首次扣款价格 单位: 分RenewPrice int `bson:"renewPrice" json:"renewPrice"` // 后续代扣价格 单位: 分AlipayUserId string `bson:"alipayUserId" json:"alipayUserId"` // 用户的支付宝账号对应的支付宝唯一用户号。AlipayLogonId string `bson:"alipayLogonId" json:"alipayLogonId"` // 用户的支付宝登录账号
}
测试服自动续费说明
自动续费说明
- 安卓自动续费目前仅有支付宝(支付宝支持最少7天一个周期)测试服,为了方便测试,连续包月、包季、包年,均设置为7天一个周期,5分钟后自动扣款一次。后续则按照7天一个周期进行扣款。后续根据周期时间,提前5天扣款。举例:2021-09-01 购买连续包月会员,支付宝那边显示每隔7天,自动扣款,下次扣款日期为 09-03(提前5天扣款)。实际为了测试,提前到当前时间,延迟5分钟执行。支付成功后,会员时间延长1个月。后续扣款时间为下个周期,即 3号+7天 = 10号。即09-10 再次进行下次扣款,后续以此类推。支付宝展示亦是如此
- IOS自动续费测试服,ios中连续包月、连续包季、连续包年,分别为5、15、60分钟一个周期,进行周期扣款,扣款次数最多为6次。(苹果那边固定设置,无法改变)。测试时最好使用未支付过的apple账号,避免其他错误。
IOS沙盒环境下的订阅周期
相关文档
支付宝周期扣款文档:
- 支付宝周期扣款官方文档
- 案例分析
苹果
app-store帮助中心
官方文档
超详细文档
其他优秀文档
https://blog.csdn.net/kaikai0803/article/details/95642913
https://www.jianshu.com/p/a3cb7760dbbe
https://blog.csdn.net/theCrucian/article/details/89406203
后端做app连续会员包月功能 -- IOS连续订阅 支付宝周期扣款相关推荐
- 站长做广告联盟和包月广告需要注意些什么?
站长做网站最终的目的就是为了实现赢利,其赢利模式一般通过两种方式获得,做广告联盟和包月广告.大家都知道这两种方式各有利弊,很多站长可能也都非常困惑,到底选用哪一种比较好,另外,做广告联盟的广告的话,有 ...
- iPhone苹果手机微信读书付费会员卡连续包月怎么取消关闭订阅?
iPhone苹果手机微信读书付费会员卡连续包月怎么取消关闭订阅? 1.苹果iPhone手机微信读书付费无限卡连续包月中,找到这个页面: 2.进入后,在底部找到包月中,并点击管理进入: 3.进入找到订阅 ...
- 支付宝周期扣款(支付后签约)业务功能总结(php+golang)
文档 周期扣款支付后签约场景文档:https://opendocs.alipay.com/open/041bxs 业务流程 1.处理签约成功回调,添加到订阅表 2.定时任务自行请求订阅表,把达到扣款日 ...
- app内嵌h5支付功能,跳转支付宝微信,vue组件
一.功能梳理 app内前h5涉及到支付的功能,ios非实物商品实付需要使用ios原生支付方式,实物商品则可以三方支付,主要的实现思路为后端返回跳转支付宝或微信的支付scheme链接,前端进行跳转支付, ...
- ios开发防止App被抓包(一句话实现iOS应用底层所有网络请求拦截(如ajax请求拦截),包含http-dns解决方法,有效防止DNS劫持,用于分析http,https请求,禁用/允许代理,防抓包)
ZXRequestBlock 安装 通过CocoaPods安装 pod 'ZXRequestBlock' 手动导入 将ZXRequestBlock拖入项目中. 导入头文件 #import " ...
- 优酷会员连续包月如何取消,最新方法 @2017-09-29
优酷会员连续包月如何取消,最新方法 @2017-09-29 步骤1: 登录优酷会员(在电脑的浏览器里) http://youku.com 步骤2: 如图,到这里直接取消自动续费即可: https:// ...
- 淘宝省钱卡连续包月可以只用一个月就取消吗?
原文来源:https://www.caochai.com/article-674.html 淘宝省钱卡连续包月可以只用一个月就取消:如果不想继续使用淘宝省钱卡连续包月功能扣费,可以打开我的支付宝设置内 ...
- 连续支付(周期扣款)功能开发及注意事项
最近有一个版本需求,需要接入周期扣款做连续会员的功能,没想到这一做就是小半个月,趟了很多坑,所以觉得有必要记录一下 1.周期扣款总体设计 在支付宝和微信中(非苹果支付),周期扣款的流程主要有以下两种, ...
- 怎么关闭苹果手机自动扣费_手机APP「会员自动续费」怎么办?教你一招快速关闭...
你们知道学霸君每个月最讨厌收到什么短信吗? 就是APP自动续费的短信.... 特别是有一些软件,明明百八年前就已经没用了 当时只是因为年少无知觉得会员包月续费开通会比较便宜,所以才开通的. 每次收到它 ...
最新文章
- origin9语言设置中文_英雄联盟手游怎么设置繁体 LOL手游繁中设置方法?_英雄联盟手游...
- Linux驱动入门篇(一):Hello, world
- 主键和索引哪个快_数据库两大神器【索引和锁】
- Zookeeper_原生API操作(一)
- javaee和javaee_JavaEE概念简介
- C++(STL):17---deque之迭代器使用
- 【亲测有效】Centos安装完成docker后启动docker报错docker: unrecognized service的两种解决方案
- STM32 HAL库 UART 串口读写功能笔记
- js去掉html标签和去掉字符串文本的所有的空格
- webpack资源管理
- ORACLE多表查询优化
- MySQL 千万级数据SQL的查询优化30条总结
- “NLP的那些事儿”开张了!
- Center OS 7
- Python菜鸟教程全目录
- JavaScript笔记 Object对象
- 2012工行软开中心-广州面试
- 数据的类型:分类数据、顺序数据、数值型数据
- 家政维修小程序+上门预约小程序+VUE前后端分离+uniapp(附近师傅+门店入驻+在线抢单服务APP、小程序、公众号、H5)
- 免费专属 | 100行Python代码实现一款高精度OCR工具
热门文章
- Ubuntu 安装 XDM 2018 ( Xtreme Download Manager 2018 )
- 如何用tensorflow使用自定义数据来训练,做物体检测
- 属鸡适不适合学计算机,生肖属相鸡适宜什么职业(详解)
- Mouse Controler(手机操控鼠标)
- 用好HugePage,告别Linux性能故障
- docker镜像操作
- php ECShop form,在ecshop中添加页面并且实现后台管理
- 将西瓜书中的表格数字化与可视化
- 某些PDF文档在福昕阅读器无法高亮标注以及注释等
- csgo跳投指令_CSGO控制台进阶指令