后端做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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52104.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Stripe订阅模式(类似于会员,按月按年自动扣款)

文章目录 stripe订阅模式与普通支付模式的区别支付成功回调支付失败回调订阅生命周期 一、区别 创建stripe订单时(支付接口)的区别: 1.普通订阅模式创建session前需要先创建价格对象,订阅需要在价格对象中多添加一个recurringPar…

论文投稿指南——中文核心期刊推荐(新闻事业)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

想用Python赚钱?——安排!

利用Python进行网络抓取,本文会告诉你最显而易见的赚钱办法,还有隐藏的最不明显的赚钱方法。 数据是一种非常有用的资源。有人甚至称数据为21世纪的石油。 这就是为什么不仅是公司,而且普通人也会花钱在电子表格中获得干净的数据,…

微信小程序数据请求

微信小程序的数据请求 一、常用的数据请求方式 JS原生实现 第一种:let xhrnew XMLHttpRequest()xhr.open()xhr.send()第二种:fetch() 支持promisefetch(接口地址).then(function(response) {return response.json();}).then(function(myJson) {consol…

如何用Stata完成(shui)一篇经济学论文(十一):分组和去重

文章目录 分组去重 不出意外的话,这应该是stata有关数据处理的最后一篇。emmm,其实我一开始只打算写数据处理部分的stata教程,因为我觉得对于我来说,数据处理才是最头疼的部分。不过关于后面回归,还是有些东西想跟大家…

卷积神经网络之父的强人工智能路线图:自监督,推理,规划

导读 2023 年 6 月 9 日,智源大会第一天。在这场众星云集的盛会中。目前「深度学习三驾马车」中最活跃的 Yann LeCun 教授带来了重磅演讲「朝向能学习, 思考和计划的机器进发( Towards Machines that can Learn, Reason, and Plan&#xff09…

双色球彩票训练任务含对比

玩法规则:“双色球”每注投注号码由 6 个红色球号码和 1 个蓝色球号码 组成。红色球号码从 1—33 中选择,蓝色球号码从 1—16 中选择。 package section_6_1008;import java.util.Random; import java.util.Scanner;public class section_6_1008 {publ…

一文读懂 OpenAI 创始人的「世界币」

作者 | 美漪 大概所有人,都曾经有这样一个梦想:「啥也不干,天天躺着就有人给发钱。」 现在,这个从各种角度看起来都是绝对的「白日梦」,真的有机会实现了。 当地时间 7 月 24 日,OpenAI 掌门人 Sam Altman …

书中自有黄金屋系列9:值得反复阅读的一本书《向上生长》

如果要说哪一本书对我影响最大,那肯定是这本我反复读了五遍以上九边写的《向上生长》了。很多深刻的人生道理被作者用通俗易懂的方式讲解说明,这才是最发人深省的。下面是我读书的一些笔记和思考: 1.人为什么要学习 就像人不吃饭就会死亡&…

Gavin老师Transformer直播课感悟 - Rasa对话机器人项目实战之保险行业Insurance Bot架构设计、流程分析、状态管理及智能对话实验剖析(五十五)

本文继续围绕工业级业务对话平台和框架Rasa,对Rasa对话机器人项目实战之保险行业Insurance Bot架构设计、流程分析、状态管理及基于Rasa Interactive的智能对话实验进行分析。 一、Rasa对话机器人项目实战之保险行业Insurance Bot架构设计、流程分析、状态管理及基于Rasa Inte…

GPT3.5之模仿例子完成任务

首先导入open_ai key import openai import os from dotenv import load_dotenv, find_dotenv # 导入第三方库_ load_dotenv(find_dotenv()) # 读取系统中的环境变量openai.api_key os.getenv(OPENAI_API_KEY) # path1.api_key os.getenv(path) print(openai.api_key) # p…

与 ChatGPT 进行有效交互的几种策略

在这篇文章中,您将了解即时工程。尤其, 如何在提示中提供对响应影响最大的信息什么是角色、正面和负面提示、零样本提示等如何迭代使用提示来利用 ChatGPT 的对话性质 废话不多说直接开始吧!!! 提示原则 快速工程是有…

随机森林(Random Forest)通俗教程

目录 1 什么是随机森林?2 随机森林的特点3 随机森林的相关基础知识4 随机森林的生成5 袋外错误率(oob error)6 随机森林工作原理解释的一个简单例子7 随机森林的Python实现8 参考内容 1 什么是随机森林? 作为新兴起的、高度灵活的…

加密流量分类-论文9:DarknetSec: A novel self-attentive deep learning method for darknet traffic.....

加密流量分类-论文9:DarknetSec: A novel self-attentive deep learning method for darknet traffic classification and application identification 0、摘要1、文章核心观点引入2、模型结构2.1 模型总览2.2 预处理层2.4 特征提取层 4、实验5、总结与思考 0、摘要…

陌陌X-SIGN算法HOOK

文章目录 前言应用到的工具java 层分析frida hook aesEncode,a,sign 这三个方法总结预告: 下章节我们讲:陌陌X-SIGN还原 前言 学习是必然的,一路并不是平台的到道路,总要有点意外和惊喜。人嘛!…

152.网络安全渗透测试—[Cobalt Strike系列]—[会话管理/派生]

我认为,无论是学习安全还是从事安全的人多多少少都会有些许的情怀和使命感!!! 文章目录 一、会话管理1、实验环境2、会话派生(1)128的cs会话派生给128的cs本身(2)128的cs会话派生给…

森林攻略

1.存档攻略 C盘/ Users / Administrator / AppData / LocalLow / SKS / The forest / 一列数字 你保存的存档,就在那个名称全是数字的文件夹中,只需把其中的存档文件保存在U盘或网盘中,下次玩时,把保存的存档文件放到存档文件夹…

Isolation Forest孤立森林(二)之sklearn实现,源码分析

孤立森林算法sklearn实现,源码分析 算法一: 首先初始化一些参数 class sklearn.ensemble.IsolationForest(n_estimators100, max_samples’auto’, contamination’legacy’, max_features1.0, bootstrapFalse, n_jobsNone, behaviour’old’, random_stateNone, v…

森林图

森林图 以统计指标和统计分析方法为基础,用数值计算绘制出的图形,通常是在平面直角坐标系中,以一条垂直的无效 线(0或者1)为中心,用平衡于x轴的多条线段描述每个组指标的中值和可信区间,最后一…