苹果 服务通知 V2

news/2024/10/31 1:35:29/

    在iOS开发中如果涉及到虚拟物品购买,就需要使用iap服务。iap支付确实很蛋疼,商品分类多:消耗品、非消耗品、自动订阅商品,非续订商品。像非消耗品需要支持访客模式购买,还需要支持恢复的功能,就是用户换了手机在没有登录(app自己的账号)的情况下也可以恢复之前购买的商品(相同icloud ID),确实给开发带来不少的额外工作,你还必须得支持,不然审核不给过。这还是正向流程,像逆向流程对接更是一言难尽。这里分享下在对接苹果通知(退款、订阅状态变更等消息)过程中一些经验,苹果后台可以配置接收通知的url 分沙盒和线上两个url。
    苹果支付通知v2跟v1区别还是很大的。首先是流程上 v1在收到通知后需要再次调用苹果的http接口校验票据的合法性,而v2版本是通过jws(JSON Web Signature)验证其合法性,不需要再次调用苹果服务,直接公钥验签就行。再次是数据结构上的不同,v1通知 http body里直接给了明文,v2由于是jws ,所以内容本身是不可读的。
通知内容:
通知的大致样子
    signedPayload 就是jws,通过 . 号拼接的,分为三部分,分别是 header,payload,signature。分别 通过new String(Base64.getUrlDecoder().decode("***"))就可以解码看到可读的文本。
header解码:
header
payload解码:
payload解码内容

里面的signedTransactionInfo也是个jws,做同样的操作就可以了。
    获取通知内容不难,关键是怎么验签。因为苹果后台提供下载私钥,开始以为就用这个私钥导出的公钥验签就可以了。为啥会有这个想法,主要还是思维定势。像支付宝、微信的通知都是这么弄的,会给我们提供公钥来验签。但隐约的又觉得不太靠谱,签名的私钥不应该给到外人。后来在 https://jwt.io/ 网站 测试验签的时候,发现把整个jws贴进来就能验签通过,但是我并没有告诉它公钥啊。经过仔细发现,原来它直接使用header里的证书验签的。至此问题得到解决,苹果后台提供下载的私钥其实是在我们请求苹果接口时签名用的。这也有点不合理的地方,私钥是除了自己随都不可以知道的,但是苹果霸道的给我们直接提供私钥下载,而不是给我们提供一个配置公钥的入口。
    结论:苹果支付通知的验签 是通过jwt里面的证书验签的,x5c就是 header解码后的内容,这里使用的是第一个证书。

    public Jws<Claims> verifyJWT(List<String> x5c, String jws){try {X509Certificate cert = getCert(x5c.get(0));if (!cert.getSubjectDN().getName().contains("Apple Inc")){logger.info("not apple cert . name = {}", cert.getIssuerX500Principal().getName());return null;}return Jwts.parserBuilder().setSigningKey(cert.getPublicKey()).build().parseClaimsJws(jws);}catch (JwtException exc){logger.info("jws verify failure.", exc);return null;} catch (Exception exc){logger.info("jws verify error.", exc);return null;}}public static X509Certificate getCert(String x5c) throws CertificateException {String stripped = x5c.replaceAll("-----BEGIN (.*)-----", "");stripped = stripped.replaceAll("-----END (.*)----", "");stripped = stripped.replaceAll("\r\n", "");stripped = stripped.replaceAll("\n", "");stripped.trim();byte[] keyBytes = Base64.getDecoder().decode(stripped);CertificateFactory fact = CertificateFactory.getInstance("X.509");return (X509Certificate) fact.generateCertificate(new ByteArrayInputStream(keyBytes));}

jw验签的工具类 maven依赖:

       <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.2</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.2</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId> <version>0.11.2</version><scope>runtime</scope></dependency>

http://www.ppmy.cn/news/548512.html

相关文章

CoCosNet v2论文解读

文章目录 创新点算法Multi-level domain alignmentHierarchical GRU-assisted PatchMatchTranslation network损失函数 实验结论 论文&#xff1a; 《CoCosNet v2: Full-Resolution Correspondence Learning for Image Translation》 github&#xff1a; https://github.com/…

DeblurGAN-v2: Deblurring (Orders-of-Magnitude) Faster and Better阅读笔记

论文&#xff1a;https://arxiv.org/pdf/1908.03826.pdf 代码&#xff1a;https://github.com/TAMU-VITA/DeblurGANv2 abstract 我们提出了一个名为DeblurGAN-v2的端到端的生成对抗网络&#xff0c;它对于去模糊产生了非常好的性能。DeblurGAN-v2基于conditional GAN(带有两个…

以太网 V2 MAC帧的封装,解析,发送

核心算法分析&#xff1a; 1. 解析帧结构模块 本模块实现了将封装好的MAC帧各字段解析为可阅读的文本的功能。 其中&#xff0c;任意位置的读入失败都抛出文件已到达末尾异常&#xff0c;结束解析。 2. 封装数据帧模块 本模块实现了将用户输入的文本封装为MAC帧的功能。 3. 模拟…

UUID-五个版本-v1|v2|v3|v4|v5-使用说明

1、UUID概要 UUID 的全称是 Universally Unique Identifier&#xff0c;中文为通用唯一识别码。 构成&#xff1a;由一组32位数的16进制数字所构成。 格式&#xff1a;以连字号分为五段&#xff0c;表现形式为8-4-4-4-12的32个字符 xxxxxxxx-xxxx-Mxxx-Nxxx-xxxxxxxxxxxx如&…

MobileNet v2 算法笔记

论文&#xff1a;Inverted Residuals and Linear Bottlenecks Mobile Networks for Classification, Detection and Segmentation 链接&#xff1a;https://128.84.21.199/abs/1801.04381 第三方代码&#xff08;可用于在ImageNet数据集上训练&#xff09;&#xff1a;https:…

开始使用DOCKER COMPOSE V2

Compose V2 项目启动于2021年6月&#xff0c;直到2022年4月26号&#xff0c;发布了GA版本。在发布GA版本后&#xff0c;社区也宣布对于Compose V1将不会再进行功能更新&#xff0c;将在6个月后结束生命周期&#xff08;EOL&#xff09;&#xff0c;期间会进行关键的安全和错误修…

卸载V2ray

停用并卸载服务&#xff08;systemd&#xff09;&#xff1a; systemctl stop v2ray systemctl disable v2ray 停用并卸载服务&#xff08;sysv&#xff09;&#xff1a; service v2ray stop update-rc.d -f v2ray remove 然后删除以下文件&#xff1a; /etc/v2ray/* /usr…

# Kinect V2 简介

Kinect V2 简介 文章为个人学习笔记 整理了一些网络资源和视频知识。 提示&#xff1a;自己也是小白&#xff0c;文章不免会出现不少的错误。 文章目录 Kinect V2 简介前言一、Kinect V2是什么&#xff1f;二、硬件信息1.摄像头结构2.连接线 三、软件准备1.kinect for window …