在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相关推荐

  1. 微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题

    微信小程序模板消息(服务通知消息)原始post工具封装(不使用jar包--坑比较多),解决47001(JSON格式)和中文乱码问题 参考文章: (1)微信小程序模板消息(服务通知消息)原始post工具 ...

  2. 认证服务号可通过模板消息向用户发送重要的服务通知

    2014年08月14日微信团队向具有支付权限的公众号开放了模板消息,使用效果良好,现扩大模板消息开放范围,向认证后的服务号进行开放.所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的 ...

  3. .NET Core 小程序开发零基础系列(2)——小程序服务通知(模板消息)

    基于上一篇文件".NET Core 小程序开发零基础系列(1)--开发者启用并校验牵手成功"的反映,个人觉得效果很不错,大家对公众号开发还是有很大需求的,同时也收到了很多同学的问题 ...

  4. android9 前台服务通知_Android通知概览

    通知是指 Android 在应用界面之外显示的消息,旨在向用户提供提醒.来自他人的通信信息或应用中的其他及时信息.用户可以点按通知来打开应用,或直接从通知中执行操作. 此页面将概述通知的显示位置和可用 ...

  5. 酒店预订、酒店检索、酒店详情、房间预订、订单管理、会员、优惠券、客房预订、高保真原型、酒店app、需求清单、组件规范、架构图、订单通知、服务通知、收藏、客服、搜索、导航、评价、支付、充值、登录、浏览

    酒店预订.酒店检索.酒店详情.房间预订.订单管理.会员.优惠券.客房预订.高保真原型.酒店app.需求清单.组件规范.架构图.订单通知.服务通知.收藏.客服.搜索.导航.评价.支付.充值.登录.浏览 ...

  6. itools 2014(苹果同步软件) v2.0.3.8 官方免费版

    itools 2014(苹果同步软件) v2.0.3.8 官方免费版 软件大小:2.75MB 软件语言:简体中文 软件性质:常用软件 软件授权:官方版 更新时间:2014-05-22 应用平台:/Wi ...

  7. 微信小程序 消息订阅 长期订阅 一次授权 多次接收 微信服务通知

    微信小程序消息订阅 长期订阅 一次授权 多次接收 发送微信服务通知消息 这里讲长期订阅! 长期订阅! 长期订阅! 需求描述: – 根据用户不同标签(租户.业主.维修师傅.居委会成员)一键向人员统一发送 ...

  8. 使用阿里云短信服务API实现短信验证码以及短信服务通知

    使用阿里云短信服务API实现短信验证码以及短信服务通知 前言 一 .短信调用简要说明 二 .官方不带签名原生态测试demo 调用结果如下 三 .以上为不带模板和签名的API调用结果 下面加入签名和模板 ...

  9. 微信小程序发送服务通知

    服务通知在微信开发中很常见,支付,审核等等都需要用到服务通知. 记录一下开发中用到的需求,以后直接复制. public static void senddingyue(String open_id,S ...

  10. 微信小程序发送多条服务通知

    看了官方文档的服务通知推送,必须要用户手动触发才能获取到fromId,而用户点击一次,只能获取到一个fromId,那么在这点击一次的情况下,怎么才能获取到多个fromId呢,当时这个问题困扰了我2个多 ...

最新文章

  1. 你知道那些JVM性能调优
  2. 电子病历、HL7交流QQ群:14739311欢迎一起交流
  3. Android中使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信
  4. Android4.0设置界面修改总结
  5. 2021年3月程序员工资统计,平均15189元,又涨了
  6. java 生成csr_Java以编程方式生成CSR
  7. 冲刺第二阶段工作总结01
  8. 聊聊springboot session timeout参数设置
  9. html浏览xsd,XSD 简易元素
  10. 今年暑假不ac (c语言版)
  11. 【公众号】微信进入公众号链接自动获取授权登陆
  12. 程序人生:羽翼未丰的我,当年如何在一个公司从A干到B
  13. 最详细的美国旅游签证办理流程
  14. Genymotion启动失败解决方案
  15. STM32输出PWM波形以及实现LED呼吸灯
  16. 【PMP】专题沟通管理 错题
  17. opencv 图像的变换
  18. dotnet OpenXML 文本 Kerning 字间距的作用
  19. [FFmpeg] AVPacket 的使用记录(初始化、引用、解引用、释放)
  20. CSS3实现自适应的聊天气泡

热门文章

  1. UE4 WebBrowser插件清除浏览器缓存
  2. qq邮箱发html版式是乱的,为什么在Word里编辑的内容到QQ邮箱里发给别人是乱的,我用附件发的呀...
  3. 用计算机画画的图片,儿童电脑画画大全图片
  4. 【读书笔记】《我的奋斗》罗永浩
  5. 袁国宝:罗永浩直播之道
  6. 计算机专业要考哪些证书?这5种证书含金量最高,拿到就是高薪
  7. 工信部用户隐私信息收录整改排查
  8. 读DL论文心得之RCNN
  9. c++系列:关于MSVCR100.dll、MSVCR100d.dll、Msvcp100.dll、Msvcp100D.dll 故障查及解决方法
  10. 运用计算机技术和语文教学,计算机信息技术与小学语文教学整合的优势