苹果 服务通知 V2
在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解码:
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>
苹果 服务通知 V2相关推荐
- 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题
微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题 参考文章: (1)微信小程序模板消息(服务通知消息)原始post工具 ...
- 认证服务号可通过模板消息向用户发送重要的服务通知
2014年08月14日微信团队向具有支付权限的公众号开放了模板消息,使用效果良好,现扩大模板消息开放范围,向认证后的服务号进行开放.所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的 ...
- .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)
基于上一篇文件".NET Core 小程序开发零基础系列(1)--开发者启用并校验牵手成功"的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题 ...
- android9 前台服务通知_Android通知概览
通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒.来自他人的通信信息或应用中的其他及时信息.用户可以点按通知来打开应用,或直接从通知中执行操作. 此页面将概述通知的显示位置和可用 ...
- 酒店预订、酒店检索、酒店详情、房间预订、订单管理、会员、优惠券、客房预订、高保真原型、酒店app、需求清单、组件规范、架构图、订单通知、服务通知、收藏、客服、搜索、导航、评价、支付、充值、登录、浏览
酒店预订.酒店检索.酒店详情.房间预订.订单管理.会员.优惠券.客房预订.高保真原型.酒店app.需求清单.组件规范.架构图.订单通知.服务通知.收藏.客服.搜索.导航.评价.支付.充值.登录.浏览 ...
- itools 2014(苹果同步软件) v2.0.3.8 官方免费版
itools 2014(苹果同步软件) v2.0.3.8 官方免费版 软件大小:2.75MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-05-22 应用平台:/Wi ...
- 微信小程序 消息订阅 长期订阅 一次授权 多次接收 微信服务通知
微信小程序消息订阅 长期订阅 一次授权 多次接收 发送微信服务通知消息 这里讲长期订阅! 长期订阅! 长期订阅! 需求描述: – 根据用户不同标签(租户.业主.维修师傅.居委会成员)一键向人员统一发送 ...
- 使用阿里云短信服务API实现短信验证码以及短信服务通知
使用阿里云短信服务API实现短信验证码以及短信服务通知 前言 一 .短信调用简要说明 二 .官方不带签名原生态测试demo 调用结果如下 三 .以上为不带模板和签名的API调用结果 下面加入签名和模板 ...
- 微信小程序发送服务通知
服务通知在微信开发中很常见,支付,审核等等都需要用到服务通知. 记录一下开发中用到的需求,以后直接复制. public static void senddingyue(String open_id,S ...
- 微信小程序发送多条服务通知
看了官方文档的服务通知推送,必须要用户手动触发才能获取到fromId,而用户点击一次,只能获取到一个fromId,那么在这点击一次的情况下,怎么才能获取到多个fromId呢,当时这个问题困扰了我2个多 ...
最新文章
- 你知道那些JVM性能调优
- 电子病历、HL7交流QQ群:14739311欢迎一起交流
- Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信
- Android4.0设置界面修改总结
- 2021年3月程序员工资统计,平均15189元,又涨了
- java 生成csr_Java以编程方式生成CSR
- 冲刺第二阶段工作总结01
- 聊聊springboot session timeout参数设置
- html浏览xsd,XSD 简易元素
- 今年暑假不ac (c语言版)
- 【公众号】微信进入公众号链接自动获取授权登陆
- 程序人生:羽翼未丰的我,当年如何在一个公司从A干到B
- 最详细的美国旅游签证办理流程
- Genymotion启动失败解决方案
- STM32输出PWM波形以及实现LED呼吸灯
- 【PMP】专题沟通管理 错题
- opencv 图像的变换
- dotnet OpenXML 文本 Kerning 字间距的作用
- [FFmpeg] AVPacket 的使用记录(初始化、引用、解引用、释放)
- CSS3实现自适应的聊天气泡
热门文章
- UE4 WebBrowser插件清除浏览器缓存
- qq邮箱发html版式是乱的,为什么在Word里编辑的内容到QQ邮箱里发给别人是乱的,我用附件发的呀...
- 用计算机画画的图片,儿童电脑画画大全图片
- 【读书笔记】《我的奋斗》罗永浩
- 袁国宝:罗永浩直播之道
- 计算机专业要考哪些证书?这5种证书含金量最高,拿到就是高薪
- 工信部用户隐私信息收录整改排查
- 读DL论文心得之RCNN
- c++系列:关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、Msvcp100D.dll 故障查及解决方法
- 运用计算机技术和语文教学,计算机信息技术与小学语文教学整合的优势