You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RestTemplate调用苹果内购验证API失败,请求解决方案

问题:RestTemplate调用苹果内购验证API失败(Postman可正常运行)

我尝试用RestTemplate调用苹果内购验证API,但一直失败,不过相同的请求在Postman里能正常跑通。相关代码如下:

HttpHeaders httpHeaders = new HttpHeaders(); 
// httpHeaders.setContentType(MediaType.APPLICATION_JSON); 
//httpHeaders.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));

MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>(); 
map.add(Constant.PURCHASE.RECEIPT_DATA, purchase.getReceiptData()); 
HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, httpHeaders); 
ResponseEntity<String> postResponse = restTemplate.postForEntity(iosPurchaseService, request, String.class);

想请教下:

  • 怎么用RestTemplate正确实现这个请求?
  • 是否苹果内购验证API不允许使用Base64编码的数据?

解答

嘿,我来帮你捋捋问题出在哪!首先,苹果内购验证API要求的是JSON格式的请求体,但你现在用MultiValueMap会默认发送application/x-www-form-urlencoded的表单数据,这和Postman里的请求格式完全不匹配——这就是请求失败的核心原因。

正确的实现步骤

  1. 配置正确的请求头:必须明确指定Content-Type为application/json,同时声明接受JSON格式的响应,这两步你之前注释掉了,得打开。
  2. 构造JSON请求体:苹果接口需要的是包含receipt-data字段的JSON对象,不是表单结构。你可以用Map或者自定义POJO来封装数据,别再用MultiValueMap了。

修改后的代码示例

// 1. 配置请求头
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON);
httpHeaders.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));

// 2. 构造JSON请求体
Map<String, String> requestBody = new HashMap<>();
requestBody.put("receipt-data", purchase.getReceiptData());
// 如果是自动续期订阅,记得加上共享密钥(在App Store Connect获取)
// requestBody.put("password", "你的应用共享密钥");

// 3. 构建请求实体
HttpEntity<Map<String, String>> request = new HttpEntity<>(requestBody, httpHeaders);

// 4. 发送请求
ResponseEntity<String> postResponse = restTemplate.postForEntity(iosPurchaseService, request, String.class);

关于Base64编码的疑问

完全不用担心,苹果内购验证API必须接收Base64编码的收据数据,甚至要求你把收据转换成无换行的Base64字符串(有些工具生成的Base64会带换行,这才可能导致验证失败)。你在Postman里能成功,说明你的收据编码是没问题的,只是请求格式错了。

额外排查小tips

  • 确认环境地址:沙箱环境用https://sandbox.itunes.apple.com/verifyReceipt,生产环境用https://buy.itunes.apple.com/verifyReceipt,别搞混了。
  • 如果是续期订阅,一定要加password字段,否则验证会失败。

内容的提问来源于stack exchange,提问作者Isura Amarasinghe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:38:41