关于IOS购买商品回调至JAVA后端

App Store服务器通知 版本2(据说这个比1版本返回的信息多且安全,但是需要https)

验证苹果商店服务器通知 responseBodyV2 :转载。侵删

java 部分代码…(其实就是大致思路吧,希望能够起到帮助。不明白的可以留言,看到会回,我水平不是很高并且项目开发周期很短,有些地方写的不是很标准和规范,这是第一版先调通后期优化,有什么好的建议,也请多多留言,互相学习。。。轻喷)

因为我们做的是虚拟商品用户会员,沙盒环境下订阅后过期时间很快,并且回调有时候正常,有时候会慢半拍,可以多次测试,好心里有个底。

新用户第一次支付就会回调,具体状态可以看下边枚举类记录的状态,状态不是很全,但我估计差不多了。我们因为某些原因,没在下边的方法中写第一次购买。大家注意一下…用户会员的过期时间直接用苹果返回的数据中的就可以。

在这里插入图片描述

private ExecutorService executorService = Executors.newFixedThreadPool(20);
 
public RestResult subscribePay(Map map) {
   
        log.info("苹果订阅回调..............入参{}", JSON.toJSONString(map));
        String signedPayload = JwtUtils.verify(map.get("signedPayload").toString());
        if (StringUtils.isNotEmpty(signedPayload)) {
   
         //第一次解密
            String fromBASE64 = JwtUtils.getFromBASE64(signedPayload);
            log.info("苹果订阅回调.............JWS解密{}", fromBASE64);
            // 解密出来的字符串有时候最后会加特殊符号,所以截取了一下
            fromBASE64 = fromBASE64.substring(fromBASE64.indexOf("{"), fromBASE64.lastIndexOf("}") + 1);
            log.info("苹果订阅回调.............JWS解密——替换字符串{}", fromBASE64);
            JSONObject jsonObject = JSONObject.parseObject(fromBASE64);
            //判断uuid是否重复调用
            if (redisBaseUtil.redisCounter(jsonObject.get("notificationUUID").toString(), RedisBaseUtil.APPLE_TIME)) {
   
                String s = JSONObject.parseObject(jsonObject.get("data").toString()).get("signedTransactionInfo").toString();
                log.info("苹果订阅回调.拿到加密数据============{}", s);
                //解密拿到数据
                String verify = JwtUtils.verify(s);
                log.info("苹果订阅回调.JWS解密拿到数据============{}", verify);
                if (StringUtils.isEmpty(verify)) {
   
                    redisBaseUtil.remove(jsonObject.get("notificationUUID").toString());
                    return RestResult.error(BizCode.BZ_APPLE_ERROR.code, BizCode.BZ_APPLE_ERROR.message);
                }
                //线程池
                executorService.execute(() -> {
   
                    String fromBASE641 = JwtUtils.getFromBASE64(verify);
                    //第一标识
                    String notificationType = jsonObject.get("notificationType").toString();
                    //第二标识
                    String subtype = String.valueOf(Optional.ofNullable(jsonObject
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值