后端做app连续会员包月功能 -- IOS连续订阅 支付宝周期扣款

news/2025/1/15 18:12:32/

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.ppmy.cn/news/748590.html

相关文章

iOS开发者因“自动订阅”被拒N次最终过审的心路历程

我有位刚入行的开发者朋友(以下简称小张),最近在操作订阅这一块的时候的时候,遇到了很多问题,原本以为只是一些小小的问题,没想到他却因此连续被拒了4次,整整持续了十几天时间!下面我…

iOS订阅测试终极指南The Ultimate Guide to iOS Subscription Testing

订阅测试如何测试呢?平时遇到的都是消耗型商品,没有持续性,买完就完了,而订阅型是一个持续时间段,这个时间内有很多故事发生,测试起来相对也是复杂的多。找到一篇文章,参考下: 找到…

apple iOS订阅开发-服务端

前言 开发苹果订阅,客户端的改动不大,主要服务端要处理苹果服务器发送的通知,判断通知类型,验证收据 基本步骤 1.苹果后台创建订阅商品,创建共享密钥password2.苹果后台配置通知自己服务器地址url3.解析苹果通知&am…

IOS自动续期订阅

订阅状态的处理 https://help.apple.com/app-store-connect/#/dev0067a330b 服务端通知处理 https://developer.apple.com/documentation/appstoreservernotifications?languagedata https://www.jianshu.com/p/9531a85ba165 自动续期订阅总结 https://www.jianshu.com/p/…

取消苹果arcade订阅操作步骤

哦有时候,我们开通apple arcade订阅用了一段时间,不想续费了,想要将其退订,今天这期视频就教大家具体的arcade订阅退订的操作方法,希望对大家有所帮助。 1.打开 App Store ,点击右上角的用户头像 2.选择订阅项目。 3.找到 Apple Arcade &am…

iOS连续订阅IAP自动续订服务端接入流程

业务逻辑 注意: 同一Apple 账号生成续订订单的原始交易ID(original_transaction_id)一致 服务端处理交易过程 :要确定一个交易ID(transaction_id)只能完成一笔订单,处理完该交易的订单之后,该交易ID记录标…

iOS开发,自动续期订阅的坑

自动续期订阅相较于普通内购,需要一个共享密钥,这个共享密钥在申请内购时获得。秘钥用于向苹果服务器请求收据信息。 购买过程不再赘述。 购买成功后,自动续期订阅最大的问题在于购买成功后是否续期成功,和到期时间。 解决这个…

ios订阅_iOS订阅测试分步指南

ios订阅 Testing a subscription can be as challenging as developing it. In this article, we will go over the complete process of subscription testing. 测试订阅与开发订阅一样具有挑战性。 在本文中,我们将介绍订阅测试的完整过程。 Fist of all, to do any type o…