我正在使用 Java Spring boot - 我正在尝试完成 paypal 订阅 api 的集成。
我有一个在 WebClient 中工作的节目订阅计划 - 尽管我无法完成取消订阅方法的功能。
我得到一个 415 错误 --
“消息”:“来自 POST 的 415 不支持的媒体类型 https://api.sandbox.paypal.com/v1/billing/subscriptions/I-JJ0B8HRKSRYV/cancel”,
https://developer.paypal.com/api/rest/responses/
https://developer.paypal.com/docs/api/subscriptions/v1/#subscriptions_cancel - 当我查看 curl 方法时 - 它声称内容类型和接受在标题中 - 但它也可能是我尝试添加正文的方式?
//showSubscriptionDetails 方法
@CrossOrigin
@GetMapping("/api/showsubscriptiondetails")
@ResponseBody
public ResponseEntity<BaseResponse> showSubscriptionDetails(
@RequestParam("subscriptionID") String subscriptionID
) throws PayPalRESTException {
BaseResponse response = new BaseResponse();
String bearerToken = generateAccessToken();
String token = bearerToken.split(" ")[1].trim();
WebClient client = WebClient.create(host);
WebClient.ResponseSpec responseSpec = client.get()
.uri("/v1/billing/subscriptions/"+subscriptionID+"?fields=plan")
.headers(h -> {
h.setBearerAuth(token);
})
.retrieve();
String responseBody = responseSpec.bodyToMono(String.class).block();
ObjectMapper mapper = new ObjectMapper();
JsonNode root = null;
try {
root = mapper.readTree(responseBody);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
JsonNode status = root.path("status");
JsonNode plan = root.path("plan").get("name");
BasicDBObject res = new BasicDBObject();
res.put("status", status);
res.put("plan", plan);
response.setCode("OK");
response.setData(res);
response.setDescription(appMessageLocalUtil.getLanguageMessage("subscription.found"));
return ResponseEntity.ok().body(response);
}
//取消订阅方法
MultiValueMap<String, String> bodyValues = new LinkedMultiValueMap<>();
bodyValues.add("reason", "too expensive");
String bearerToken = generateAccessToken();
String token = bearerToken.split(" ")[1].trim();
WebClient client = WebClient.create(host);
WebClient.ResponseSpec responseSpec = client.post()
.uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
.headers(h -> {
h.setBearerAuth(token);
})
.retrieve();
String responseBody = responseSpec.bodyToMono(String.class).block();
System.out.println("responseSpec-- "+ responseSpec);
System.out.println("responseBody-- "+ responseBody);
...尝试
我尝试在标题中添加内容类型并作为主构建的一部分,但似乎没有通过。
WebClient client = WebClient.create(host);
WebClient.ResponseSpec responseSpec = client.post()
.uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
.headers(h -> {
h.setBearerAuth(token);
//h.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
//h.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
})
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
//.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_FORM_URLENCODED_VALUE)
//.contentType(MediaType.APPLICATION_FORM_URLENCODED)
//.accept(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromFormData(bodyValues))
.retrieve();
工作代码是这样的——使 body 成为一个对象并在 bodyinserter 中使用 fromValue——responseBody 在结果上为 null——但它确实取消了订阅 id
BasicDBObject body = new BasicDBObject();
body.put("reason", "xxx");
String bearerToken = generateAccessToken();
String token = bearerToken.split(" ")[1].trim();
WebClient client = WebClient.create(host);
WebClient.ResponseSpec responseSpec = client.post()
.uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
.headers(h -> {
h.setBearerAuth(token);
})
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(body))
.retrieve();
String responseBody = responseSpec.bodyToMono(String.class).block();
System.out.println("responseSpec-- "+ responseSpec);
System.out.println("responseBody-- "+ responseBody);
您链接到的 api 文档说取消正文是 json 并且包含 {“reason”: “too expensive”}。您正在发送表格。因此 415:form ≠ json.
试试这个:
String body = “{\”reason\”: \”too expensive\”}”;
WebClient client = WebClient.create(host);
WebClient.ResponseSpec responseSpec = client.post()
.uri("/v1/billing/subscriptions/"+subscriptionID+"/cancel")
.headers(h -> {
h.setBearerAuth(token);
})
.contentType(MediaType.APPLICATION_JSON)
.body(BodyInserters.fromValue(body))
.retrieve();