服务端IOS订阅类型支付接入详细说明与注意事项
一、说明
由于本人在开发ios订阅类型支付接入的时候,遇到了很多坑,也查了不少资料,逐步完善了整个ios订阅支付服务端接入的功能,在这里写下总结和一些注意事项的记录,方便未来需要重新接入或者避免一些不必要的坑,这里主要讲的是服务端的接入。
二、接入原因
客户端实现ios订阅支付后,支付成功会返回一个收据(一大串随机字符串),需要请求苹果服务器的接口来校验该收据的真实性,同时校验完成后苹果服务器也会发通知告诉我们的自己的服务器(ios后台配置的回调地址),这个时候就需要服务端来接入苹果服务器并处理该支付逻辑。这里不使用客户端直接接入苹果服务器校验收据接口的原因大概就是因为订阅类型需要共享密钥,防止该密钥暴露,同时服务器接入能更好处理逻辑。
三、接入必要配置
1.订阅类型需要从苹果后台获取一个共享密钥
2.需要在苹果后台配置好回调地址
3.需要配置订阅产品(周期,价格,我自己没什么了解,这个需要注意的是订阅有按组分,同一个组和不同组的产品是有区别的,例如同一个组的不同产品进行购买,他们的原始订单可能相同)
四、接入必要资源
简体中文文档 - Apple Developer
校验收据:通过 App Store 验证收据 - 简体中文文档 - Apple Developer
回调通知:启用 App Store 服务器通知 - 简体中文文档 - Apple Developer
退款处理:处理退款通知 - 简体中文文档 - Apple Developer
收据校验沙箱环境:https://sandbox.itunes.apple.com/verifyReceipt
收据校验生产环境:https://buy.itunes.apple.com/verifyReceipt
五、接入流程
1.服务端接入apple校验收据接口
注意事项:防止相同数据重复校验或者相同请求大量请求导致的不稳定因素,建议使用时间戳校验预防,不要将共享密钥暴露在客户端,共享密钥同时也可以对回调通知进行校验,校验收据后不要做为订单处理,最好一切以回调为主。
接口地址:https://buy.itunes.apple.com/verifyReceipt
接口类型:POST
接口格式:appliaction/json
功能说明:该接口主要是用来恢复订阅和支付校验,校验完成会有回调通知到商户服务器
请求参数:
官方:Apple Developer Documentation
{"password":"这里是共享密钥","receipt-data":"这里是收据的字符串"
}
返回结果:
状态码:Apple Developer Documentation
失败:
{"status":21000}
成功:
成功结果参数文档:responseBody | Apple Developer Documentation
主要参数说明:
{"environment": "Production", //请求环境"receipt": {"receipt_type": "Production","adam_id": xxx,"app_item_id": xxx,"bundle_id": "com.xxx","application_version": "2","download_id": xxx,"version_external_identifier": xxx,"receipt_creation_date": "2022-10-24 07:14:36 Etc/GMT","receipt_creation_date_ms": "1666595676000","receipt_creation_date_pst": "2022-10-24 00:14:36 America/Los_Angeles","request_date": "2023-02-24 03:29:47 Etc/GMT","request_date_ms": "1677209387760","request_date_pst": "2023-02-23 19:29:47 America/Los_Angeles","original_purchase_date": "2022-07-04 03:24:29 Etc/GMT","original_purchase_date_ms": "1656905069000","original_purchase_date_pst": "2022-07-03 20:24:29 America/Los_Angeles","original_application_version": "2","in_app": [ //所有订单都可能存在,主要是非订阅订单{"quantity": "1","product_id": "xxxx","transaction_id": "xxxx","original_transaction_id": "xxx","purchase_date": "2022-07-04 03:25:29 Etc/GMT","purchase_date_ms": "1656905129000","purchase_date_pst": "2022-07-03 20:25:29 America/Los_Angeles","original_purchase_date": "2022-07-04 03:25:30 Etc/GMT","original_purchase_date_ms": "1656905130000","original_purchase_date_pst": "2022-07-03 20:25:30 America/Los_Angeles","expires_date": "2022-07-11 03:25:29 Etc/GMT","expires_date_ms": "1657509929000","expires_date_pst": "2022-07-10 20:25:29 America/Los_Angeles","web_order_line_item_id": "xxx","is_trial_period": "false","is_in_intro_offer_period": "false","in_app_ownership_type": "PURCHASED"}]},"latest_receipt_info": [ //订单订阅集合,从上往下订单时间倒序,第一个为最新的支付订单{"quantity": "1","product_id": "xxx", //订单产品id,apple后台支付配置的参数"transaction_id": "xxx", //apple当前订单号"original_transaction_id": "xxx", //apple原始订单号,该用户在该产品第一笔支付订单,可当做同一批订单朔源"purchase_date": "2022-11-25 08:19:27 Etc/GMT", //订单时间"purchase_date_ms": "1669364367000","purchase_date_pst": "2022-11-25 00:19:27 America/Los_Angeles","original_purchase_date": "2022-07-04 03:25:30 Etc/GMT", //最初购买时间"original_purchase_date_ms": "1656905130000","original_purchase_date_pst": "2022-07-03 20:25:30 America/Los_Angeles","expires_date": "2023-11-25 08:19:27 Etc/GMT", //订阅过期时间"expires_date_ms": "1700900367000","expires_date_pst": "2023-11-25 00:19:27 America/Los_Angeles","web_order_line_item_id": "xxx","is_trial_period": "false", //是否是试用订单"is_in_intro_offer_period": "false","in_app_ownership_type": "PURCHASED","subscription_group_identifier": "xxx"}],"latest_receipt": "------------加密串------------","pending_renewal_info": [{"auto_renew_product_id": "xxx","product_id": "xxx","original_transaction_id": "xxx","auto_renew_status": "0"}],"status": 0 //状态成功
}
2.apple支付回调通知接入
回调通知配置:苹果后台可配置生产环境和沙箱环境的APPLE回调通知地址
接入文档:responseBodyV1 | Apple Developer Documentation
提示:接入apple支付回调apple提供了v1和v2两种类型,v2需要多一步加解密的操作
功能说明:该通知主要是订单状态的变更等,包括续订,付费通知,取消订阅,退款等通知
可进行订单处理
通知类型说明:
INITIAL_BUY | 首次购买 |
REFUND | 退款 |
CANCEL | 取消订阅 |
DID_RENEW | 自动续订 |
INTERACTIVE_RENEWAL | 应用界面或appstore手动续订 |
DID_RECOVER | 恢复订阅 |
回调请求参数示例
{"notification_type":"DID_RENEW", //通知类型,该类型为续订通知"auto_renew_product_id":"xxx","password":"xxx", //共享密钥,可以验证是否真实通知"environment":"Sandbox","original_transaction_id":xxx,"unified_receipt":{"status":0,"environment":"Sandbox","latest_receipt_info":[ //第一笔为最新的通知订单{"quantity":"1","product_id":"xxx","transaction_id":"xxx", //当前订单号"purchase_date":"2022-06-08 09:51:55 Etc/GMT","purchase_date_ms":"1654681915000","purchase_date_pst":"2022-06-08 02:51:55 America/Los_Angeles","original_purchase_date":"2022-06-08 04:36:20 Etc/GMT","original_purchase_date_ms":"1654662980000","original_purchase_date_pst":"2022-06-07 21:36:20 America/Los_Angeles","expires_date":"2022-06-08 09:54:55 Etc/GMT","expires_date_ms":"1654682095000","expires_date_pst":"2022-06-08 02:54:55 America/Los_Angeles","web_order_line_item_id":"xxx","is_trial_period":"false","is_in_intro_offer_period":"false","original_transaction_id":"xxx", //原始订单号,该产品首次的订单号"in_app_ownership_type":"PURCHASED","subscription_group_identifier":"xxx"},{"quantity":"1","product_id":"xxx","transaction_id":"xxx","purchase_date":"2022-06-08 09:48:03 Etc/GMT","purchase_date_ms":"xxx","purchase_date_pst":"2022-06-08 02:48:03 America/Los_Angeles","original_purchase_date":"2022-06-08 04:36:20 Etc/GMT","original_purchase_date_ms":"1654662980000","original_purchase_date_pst":"2022-06-07 21:36:20 America/Los_Angeles","expires_date":"2022-06-08 09:51:03 Etc/GMT","expires_date_ms":"1654681863000","expires_date_pst":"2022-06-08 02:51:03 America/Los_Angeles","web_order_line_item_id":"xxx","is_trial_period":"false","is_in_intro_offer_period":"false","original_transaction_id":"xxx","in_app_ownership_type":"PURCHASED","subscription_group_identifier":"xxx"}],"pending_renewal_info":[{"auto_renew_status":"1","auto_renew_product_id":"xxx","product_id":"xxx","original_transaction_id":"xxx"}]},"bvrs":"xxx","bid":"com.xxx","auto_renew_status":"true"
}
六、接入问题说明
1.latest_receipt_info集合订单按时间倒序排序,所以第一笔为最新的订单
2.ios收据为账户维度,即收据和通知获取的数据为该账户的历史订单集合,非当前支付
3.ios订单未返回金额等参数,需要自己做处理
4.ios退款通知不支持订阅类型
5.apple支付为全球性支付,需要自己处理货币转换
6.同一个产品包括同产品组,在同一个账户支付会生成一个原始订单号,可根据该订单号溯源
7.订单校验只适用于恢复订阅和收据校验,具体支付处理按通知为主
8.状态码21007为测试环境的收据请求到了正式环境
相关文章:
服务端IOS订阅类型支付接入详细说明与注意事项
一、说明 由于本人在开发ios订阅类型支付接入的时候,遇到了很多坑,也查了不少资料,逐步完善了整个ios订阅支付服务端接入的功能,在这里写下总结和一些注意事项的记录,方便未来需要重新接入或者避免一些不必要的坑,这里…...
【剑指Offer】重建二叉树(递归+迭代)
重建二叉树一、递归法二、迭代法题目链接 题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 示例 1: Input: preorder [3,9,20,15,7], inorder [9,3,15,…...
注解@Transactional 原理和常见的坑
这篇文章,会先讲述 Transactional 的 4 种不生效的 Case,然后再通过源码解读,分析 Transactional 的执行原理,以及部分 Case 不生效的真正原因1 项目准备下面是 DB 数据和 DB 操作接口:uidunameusex1张三女2陈恒男3楼仔…...
2023年全国最新交安安全员精选真题及答案4
百分百题库提供交安安全员考试试题、交安安全员考试预测题、交安安全员考试真题、交安安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 31.特种劳动防护用品必须具有“三证”,下列不属于“三证”的是&#…...
扬帆优配|半天翻倍,“蹭热点”翻车,前期“牛股”已近腰斩
周五上午,A股商场整体走低,多数职业板块和个股跌落,军工和核算机等板块逆势上涨,北向资金半天净卖出额约38亿元。 个股方面,昨夜公告被证监会立案查询的奥联电子股价再度大跌,盘中最贱价较近期高位已腰斩。…...
6 种易于上手的编程副业,每月赚取 1,000 多美元——没有废话
没有自由职业者或博客,也不需要前期费用。你们中的大多数人阅读这样的故事是希望其中的一些故事能帮助您赚更多的钱。好吧,几年前我还是同一个人。我希望尝试一些新的副业并赚点钱。其中一个视频建议我在网上写作,此后我写了很多技术文章。在…...
第九届蓝桥杯省赛 C++ B组 - 日志统计
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📚专栏地址:蓝桥杯题解集合 📝原题地址:日志统计 📣专栏定位:为想参加蓝桥杯的小伙伴整理常考算法题解,祝大家…...
记一次服务器入侵事件的应急响应
0x01 事件背景 8月某日,客户官网被黑,需在特定时间内完成整改。为避免客户业务受到影响,实验室相关人员第一时间展开本次攻击事件的应急处理。 0x02 事件分析 网站源码被篡改,攻击者一定获取到了权限,那么接下来的思…...
作用域链查找机制(回顾)
全局 / 私有变量作用域的概念作用域链 scopeChain 的概念作用域链 scopeChain 的形成函数执行步骤作用域链查找机制 全局 / 私有变量 全局变量:在全局上下文EC(G)中的全局变量对象VO(G)中,存储的变量 私有变量:在函数执行形成的私有上下文EC(XXX)中的变…...
前端基础之HTML扫盲
文章目录一. 第一个HTML程序1. 创建一个HTML文件并运行2. HTML的基本结构二. HTML常见标签1. 注释标签2. 标题标签3. 段落标签4. 换行标签5. 格式化标签6. 图片标签7. 超链接标签8. 表格标签9. 列表标签10. 表单标签10.1 input标签10.2 select标签10.3 textarea标签11. 无语义标…...
大规模食品图像识别:T-PAMI 2023论文解读
美团基础研发平台视觉智能部与中科院计算所展开科研课题合作,共同构建大规模数据集Food2K,并提出渐进式区域增强网络用于食品图像识别,相关研究成果已发表于T-PAMI 2023。本文主要介绍了数据集特点、方法设计、性能对比,以及基于该…...
【java】Spring Cloud --Spring Cloud Alibaba RocketMq 异步通信实现
文章目录介绍RocketMQ特点Spring Cloud StreamWindow搭建部署RocketMQ下载启动NameServer服务启动Broker服务示例创建 RocketMQ 消息生产者创建 RocketMQ 消息消费者使用示例示例关联项目运行示例测试介绍 RocketMQ 是一款开源的分布式消息系统,基于高可用分布式集…...
玫瑰花变蚊子血,自动化无痕浏览器对比测试,新贵PlayWright Vs 老牌Selenium,基于Python3.10
也许每一个男子全都有过这样的两个女人,至少两个。娶了红玫瑰,久而久之,红的变了墙上的一抹蚊子血,白的还是床前明月光;娶了白玫瑰,白的便是衣服上沾的一粒饭黏子,红的却是心口上一颗朱砂痣。–…...
Spring Cloud入门篇 Hello World | Spring Cloud 1
一、专栏说明 Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如:服务发现/注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。 本文主要介绍Spring C…...
C++学习笔记-数据结构
结构 是C中另一种用户自定义的可用数据类型,允许存储不同类型的数据项。 C/C 数组允许定义可存储相同类型数据项的变量,但是结构是 C 中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。 结构用于表示一条记录,假…...
【C++的OpenCV】第五课-OpenCV图像常用操作(二):OpenCV的基本绘图、平滑滤波(模糊)处理
让我们继续一、OpenCV基本绘图1.1 OpenCV关于绘图的操作1.1.1 cv::Point()1.1.2 cv::Scalar()1.1.3 cv::line()画线1.1.4 cv::rectangle()画矩形1.1.5 cv::circle()画圆二、图像的平滑滤波处理2.1 概念2.2 OpenCV关于图像模糊的操作2.2.1 常用滤波器的分类2.2.2 各种滤波方法具…...
[SSD固态硬盘技术 19] 谁是数据的守护神? 盘内RAID1/RAID5图文详解_盘内数据冗余保护
版权声明: 付费作品,禁止转载前言提到冗余保护,最容易想到的就是RAID(Redundant Arrays of Independent Disks) , 独立冗余磁盘阵列。它是一种把多块独立的物理硬盘按不同方式组合形成一个硬盘组,以此提供比单个硬盘更高的存储性能…...
linux相对于windows环境为啥相对来说更加具有安全性
linux相对于windows环境为啥相对来说更加具有安全性 文章目录linux相对于windows环境为啥相对来说更加具有安全性前言一、linux不需要防病毒软件1.1Linux 桌面的恶意软件很少见1.2Linux 的软件安装更安全1.3Linux 保护自己免受恶意软件的侵害1.4杀毒效果存疑1.5Linux 良好的安全…...
iOS开发笔记之九十七——关于Restful API的一些总结
*****阅读完此文,大概需要3分钟******一、什么是 Restful API?Restful(Representational State Transfer表现层状态转换)是目前最流行的接口设计规范。Restful API 是一种设计风格(是设计风格而不是标准)&a…...
Linux系统Nginx下载和安装
文章目录golang学习面试网站Linux启动nginx参考Linux启动nginx版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/weixin_36755535/article/details/110…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
