一:关键代码
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>