jwtUtil基于接入苹果apple kit内购

apple内购,访问apple服务器jwt生成问题(java) 阅读详情

一:关键代码 


import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

/** 
* @author 作者  yyy
* @version 创建时间:2023年9月14日 下午3:34:21 
*/
@Component
public class JwtUtils {
	@Resource
	HttpGetUtil httpGetUtil;
	public static String getAppleJwtToken(String key,Map<String, Object> header,Map<String, Object> claims) {
		PrivateKey privateKey = null;
        try {
            //ES256无法使用Base64加密的秘钥来生成jwt 必须解码
            KeyFactory kf = KeyFactory.getInstance("EC");
            privateKey = kf.generatePrivate(new PKCS8EncodedKeySpec(Base64.getDecoder().decode(key)));
        } catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
        }
        //生成jwt
        return Jwts.builder()
                .setHeader(header)
                .setClaims(claims)
                .signWith(SignatureAlgorithm.ES256, privateKey)
                .compact();
    }
	//发送http get请求
    public static String get(String httpUrl, String token) {
        String result = "";
        try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
            HttpGet request = new HttpGet(httpUrl);
            request.setHeader("Content-Type", "application/json");
            // 自定义请求头
            if (token != null) {
                request.setHeader("Authorization", "Bearer" + " " + token);
            }
            try (CloseableHttpResponse response = httpClient.execute(request)) {
                HttpEntity responseEntity = response.getEntity();
                if (responseEntity != null) {
                    result = EntityUtils.toString(responseEntity, "utf-8");
                }
            }
            return result;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static String getPayload(String data) {
    	String subStr = data.split("\\.")[1];
        byte[] encodedBytes = Base64.getDecoder().decode(subStr.getBytes(StandardCharsets.UTF_8));
        String payload = new String(encodedBytes, StandardCharsets.UTF_8);
        return payload;
    }
	public static void main(String[] args) {

        Map<String, Object> header = new HashMap<>();
        header.put("alg", "ES256");
        header.put("kid", "");
        header.put("typ", "JWT");

        Map<String, Object> claims = new HashMap<>();
        claims.put("iss", "苹果内购后台获取");
        claims.put("iat", System.currentTimeMillis() / 1000);
        long exp = System.currentTimeMillis() + 60 * 60 * 1000;
        claims.put("exp", exp / 1000);
        claims.put("aud", "appstoreconnect-v1");
        claims.put("bid", "");
        //从p8文件获取的秘钥 此处为了方便演示直接使用的字符串,建议从p8文件中读取,确保安全性
        String key = "";
        
        String token=JwtUtils.getAppleJwtToken(key,header,claims);
		System.out.println("token---"+token);
//		String st=JwtUtils.get("https://api.storekit.itunes.apple.com/inApps/v1/lookup/MQ1QY", token);
		HttpGetUtil httpGetUtil=new HttpGetUtil();
		URI uri=null;
		try {
			uri = new URI("https://api.storekit.itunes.apple.com/inApps/v1/lookup/MQ1QY");
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Map<String, String> head=new HashMap<>();
		head.put("Content-Type", "application/json");
		head.put("Authorization", "Bearer" + " " + token);
		String st=httpGetUtil.get(uri,head, null);
		System.out.println("----apple-result-"+st);
		JSONObject jsob=JSONObject.parseObject(st);
		JSONArray jsary=jsob.getJSONArray("signedTransactions");
		for (int i = 0; i < jsary.size(); i++) {
			String js = jsary.getString(i);			
			String payload=JwtUtils.getPayload(js);
	        System.out.println("----apple-result-date=-"+payload);
		}
//		String trid=JwtUtils.get("https://api.storekit.itunes.apple.com/inApps/v1/history/310001", JwtUtils.getAppleJwt());
//		System.out.println(trid);
	}


}

二:引入的包如下

        <dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>

App Store内部购买产品总结(获取app store token)--Java版(三) app store 单次购买+订阅续费+获取apple store token 阅读详情

相关推荐

Java支付--苹果内购

苹果内购

zth13015409853的博客 4605

Java服务端接入苹果内购。实现票据二次校验、自动续期订阅

记录一下 Java 服务端接入苹果内购。

zilin-lynn的博客 2369

使用Java接入苹果内购流程(附主要代码)

使用Java接入苹果内购流程,包括验证支付票据,接入续费订阅等。

技术杠精的博客 1万+

IOS内购验证 (Java版)

IOS内购验证 (Java版) 此处给各位贴出apple官方文档 apple收据文档 apple收据responseBody字段释义 package xxxxx; /** * @description 苹果验证返回结果状态码枚举 * @Author xc * @Date 2021/3/12 18:23 **/ public enum IosStatusCodeEnum { CODE_SUCCESS("0", "收据是有效, 验证成功"), CODE_NULL("-1", "苹

qq_43757585的博客 2742

Java接入苹果支付 – IAP支付 – IOS应用内支付- 完整版

本页目录 IAP介绍IAP参考连接接入IAP快速导航:准备工作 认证协议(签订银行信息) 设定商品价格productId 上线设置注册自己的沙箱账号:添加沙箱账号Java编码 大致编码如下,具体会随着苹果业务变动,传递参数会发生相应变化苹果支付业务思维导图基础 DomainIAP介绍IAP支付全称In-App purchase,是指苹果App Store的应用内购买,是苹果为App内购买虚拟商品...

weixin_45129599的博客 5371

苹果授权登录,后端校验(Sign in with Apple)

今天上午找"苹果授权登录后台处理"解决方案,在csdn翻阅了10来篇文章,10篇有大概4篇内容重复率很高,但是博主id却不一样,也有些确实提供了帮助,但大多数文章有些杂乱,没有逻辑,有些参数都来的莫名其妙,有些代码自己都没验证就贴了上来,纯属浪费时间.在此并非厚此薄彼,更有甚者,直接copy他人的博客,标点符号都不改,并且还标为"原创",这些人不仅代码Ctrl c+Ctrl v,博客都得如此,还的署上大名,将copy来的标为原创。之所以写这篇博客,一是为了记录,二是为了提供一种思路。

weixin_43529116的博客 3687

Java实现iOS内购实现记录

支付凭证解析工具 import javax.net.ssl.*; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.security.cert.CertificateException; import java.security.cer

Crazy_young_man的博客 1084

苹果内购支付验签(php)

苹果支付成功后走php验证支付结果传receipt支付凭证(自动订阅:所以需要增加一个参数: password: 秘钥, 就可以了, 但是官方文档说秘钥仅仅用在自动续订上面 大家叫后台加个验证,如果苹果验证返回21004的话(21004 你提供的共享密钥和账户的共享密钥不一致),就加上password字段去验证,可以成功 经过验证:购买过自动续期订阅后,验证内购时(即使是消耗型商品)必须带上password字段。)...

weixin_42115358的博客 1923

apple授权登录(服务端)

apple授权登录

qq_38847167的博客 7293

Unity通过Vosk实现离线语音识别方法

以下是一个使用 Unity 和 Vosk(一个开源的离线语音识别库)的简单示例。将Vosk的DLL文件(如libvosk.dll、vosk.dll等)放入Assets/Plugins文件夹中。通过以上步骤,你可以在Unity中实现一个简单的离线语音识别功能。音频格式:确保录音的音频格式与Vosk模型要求的格式一致(通常是16kHz、16bit单声道)。首先,你需要下载Vosk的语音识别模型。在Assets文件夹中创建一个Plugins文件夹,用于存放Vosk的DLL文件。打开Unity并创建一个新的项目。

qq_39515892的博客 2070

thinkphp5.0.24反序列化漏洞分析

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

m0_67392182的博客 1871

Java接入内购 Apple Pay、Google Play

java 接入内购 Apple Pay、Google Play

ccxboy的博客 4009

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

IOS支付,java后台代码

最近公司开发APP需要做IOS的支付功能,所以研究了一下IOS的支付,IOS支付和国内的微信支付宝支付流程有点不一样,IOS支付成功后也是依赖IOS APP回调的后台服务器,回调时携带IOS支付成功后的支付凭证等信息给服务器,不像微信支付宝是使用的他们的服务器通过REST API的方式回调,这可能和苹果是全球跨国企业,但有的国家对隐私做的比较严,不想暴露服务器的地址,所以才采用的这种方式,下面直接...

H的博客 4064

TikTok达人私信自动化:用Node.js和纯JavaScript实现WSS协议通信(附完整代码结构)

本文详细介绍了如何使用Node.js和WSS协议实现TikTok达人私信自动化系统。通过分层架构设计、WSS连接管理、消息加密策略及频率控制,开发者可以构建稳定高效的私信工具,突破平台API限制,适用于跨境电商和社交媒体运营场景。

weixin_30352645的博客 519

【软件使用】Calibre部分提参的实用技巧与常见问题解析

本文深入解析Calibre部分提参功能的实用技巧与常见问题,重点介绍hcell和xcell文件的配置方法、PEX命令的进阶使用技巧,以及时钟失真等典型问题的排查指南。通过精准控制寄生参数提取范围,显著提升复杂芯片设计的效率与准确性。

weixin_30836759的博客 116

全网最佳,第三方登录系列——苹果登录

第三方登录系列第一篇——Apple登录

了迹奇有没 8694

AT89C52单片机+LCD屏:手把手教你做一个能算小数和负数的计算器(附完整代码)

本文详细介绍了如何使用AT89C52单片机和LCD1602显示屏构建一个支持小数和负数运算的高精度计算器。从硬件选型、系统架构设计到核心算法实现,提供了完整的代码示例和优化技巧,特别适合51单片机初学者和课程设计参考。

weixin_30374009的博客 368

苹果内购验证Java服务端实现:从沙箱到生产环境的完整指南

支付回调是移动应用服务端开发中的常见场景,尤其在iOS生态中,苹果内购验证是保障虚拟商品交易安全的核心环节。服务端通过将客户端上送的票据发送至Apple验证服务器,结合沙箱环境与生产环境的切换策略,实现可靠校验。技术价值在于防止伪造票据和重放攻击,确保用户权益。本文从基础概念出发,围绕Java实现,讲解沙箱票据回退、订阅续订处理、幂等防重等关键实践,帮助开发者构建完整的苹果支付回调链路。

weixin_31240035的博客 247

【异常】OpenClaw网关仪表盘 pairing required 报错排查与解决方案

在OpenClaw网关仪表盘页面,完成WebSocket URL、网关令牌等必填项配置后,点击「连接」按钮尝试建立网关连接时,页面下方出现红色报错提示框,核心报错内容为,无法完成网关连接建立,且该报错在令牌配置正确、网络链路通畅的场景下仍会触发。该报错常见于非本地回环地址的访问场景,包括局域网远程访问、公网域名/IP访问、云服务器部署的网关远程管理等场景,本地127.0.0.1回环地址访问通常可正常连接。

奶爸的编程之路,也就一周冷个三天 1077

RT-Thread GD32F4xx HWTIMER驱动

GD32F4xx RT-Thread 硬件定时器驱动调试使用记录

madao1234的博客 1481

IAP StoreKit2后端开发完全指南

原文地址:https://zou8944.com/2022/05/13/IAP-StoreKit2%E5%90%8E%E7%AB%AF%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/ TL;DR; 2021年10月,苹果发布了StoreKit2。新API和流程看起来更加简化,但是苹果官方文档并没有让开发者接入变得简单,调试起来也是各种问题,这方便和StoreKit1一样做的不好。梳理是必要的。 文档研读 文档目录 官方文档虽然有组织结构,但并不清晰,按照如下结构去看,能够.

zou8944的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【JAVA】IOS内购二次验证及掉单问题解决

这个估计是我踩过的最大的坑,当时做微信支付的时候也没这么坑爹,当然他俩也半斤八两。。。 苹果官方明确表示:验证支付时,可能会有一定的延迟。第一次处理的时间就专注的解决这个问题了,忽略了掉单的问题(稍后再说),让我多次更新支付代码才降低了掉单率。 常识: 1,返回状态码含义: 2、正常返回结果格式: { "environment": "Sandbox", ...

weixin_30363817的博客 1123

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

苹果内购支付 Java 接口

支付流程,APP支付成功后 前端调用后端接口,后端接口将前端支付成功后拿到的凭据传给苹果服务器检查,如果接口返回成功了,就视为支付。代码,productId就是苹果开发者后台提前设置好的 产品id。

深度 862

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

App Store Server API 实践总结

????????关注后回复“进群”,拉你进程序员交流群????????关于 App Store 用户退款时并没有通知开发者,直到 2020 年 6 月苹果提供了退款通知,但是因为不是 API 方式,导致开发者不一定能收到退款通知。另外像用户充值成功但 app 没有提供金币或服务等,开发者一般无法判断用户是否真的付款了。综上,苹果在 WWDC21 带来了全新强大的 App Store Serv...

iOS_开发 7941
上一篇: java包含验证的请求
下一篇: mysql的FIND_IN_SET函数
豆丁
博客等级 码龄14年 8粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值