package com.example.demo.Util; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.io.Decoders; import java.nio.file.Files; import java.nio.file.Paths; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Date; public class AppleTokenGenerator { // 你提供的真实信息(已全部填好) private static final String KEY_ID = "3J2S9VXU3V"; private static final String ISSUER_ID = "69a6de7e-1f9a-47e3-e053-5b8c7c11a4d1"; private static final String P8_FILE_PATH = "E:/Work/newgold/gold-java/src/main/java/com/example/demo/Util/AuthKey_3J2S9VXU3V.p8"; public static String generateToken() { try { // 读取 P8 私钥内容 String p8Content = Files.readString(Paths.get(P8_FILE_PATH)) .replace("-----BEGIN PRIVATE KEY-----", "") .replace("-----END PRIVATE KEY-----", "") .replaceAll("\\s+", ""); // 解码私钥 byte[] keyBytes = Decoders.BASE64.decode(p8Content); PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance("EC"); PrivateKey privateKey = keyFactory.generatePrivate(spec); // 生成苹果官方标准 JWT(补全typ字段,完全符合文档要求) return Jwts.builder() .setHeaderParam("alg", "ES256") .setHeaderParam("kid", KEY_ID) .setHeaderParam("typ", "JWT") // 🔴 苹果官方强制要求,之前漏了! .setIssuer(ISSUER_ID) .setAudience("appstoreconnect-v1") .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 15)) // 15分钟有效期(≤20分钟) .signWith(privateKey, SignatureAlgorithm.ES256) .compact(); } catch (Exception e) { e.printStackTrace(); return null; } } // // 运行直接输出可用 Token // public static void main(String[] args) { // String token = generateToken(); // System.out.println("复制下面这一行直接用:"); // System.out.println("Bearer " + token); // } }