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