spring-boot - PayPal REST API 返回 INVALID_CURRENCY_AMOUNT_FORMAT
问题描述
响应代码:400 详细信息:名称:VALIDATION_ERROR 消息:无效请求-查看详细信息详细信息:[{“字段”:“transactions.amount”,“问题”:“无法构造实例
com.paypal.platform.payments.model.rest.common.Amount
,>问题:INVALID_CURRENCY_AMOUNT_FORMAT”}] 调试- id:86ad5783892c3 信息链接:https ://developer.paypal.com/docs/api/payments/#errors
package com.spring.soap.api;
@Configuration
public class PaypalConfig {
@Value("${paypal.client.id}")
private String clientId;
@Value("${paypal.client.secret}")
private String clientSecret;
@Value("${paypal.mode}")
private String mode;
@Bean
public Map<String,String> paypalSdkConfig(){
Map<String,String> configMap= new HashMap<>();
configMap.put("mode",mode);
return configMap;
}
@Bean
public OAuthTokenCredential oAuthTokenCredential() {
return new OAuthTokenCredential(clientId,clientSecret,paypalSdkConfig());
}
@Bean
public APIContext apiContext() throws PayPalRESTException {
APIContext context = new APIContext(oAuthTokenCredential().getAccessToken());
context.setConfigurationMap(paypalSdkConfig());
return context;
}
}
{
@Autowired
PaypalService service;
public static final String SUCCESS_URL = "pay/success";
public static final String CANCEL_URL = "pay/cancel";
@GetMapping("/")
public String home() {
return "home";
}
@PostMapping("/pay")
public String payment(@ModelAttribute("order") Order order) {
try {
Payment payment = service.createPayment(order.getPrice(), order.getCurrency(), order.getMethod(),
order.getIntent(), order.getDescription(), "http://localhost:9090/" + CANCEL_URL,
"http://localhost:9090/" + SUCCESS_URL);
for(Links link:payment.getLinks()) {
if(link.getRel().equals("approval_url")) {
return "redirect:"+link.getHref();
}
}
} catch (PayPalRESTException e) {
e.printStackTrace();
}
return "redirect:/";
}
@GetMapping(value = CANCEL_URL)
public String cancelPay() {
return "cancel";
}
@GetMapping(value = SUCCESS_URL)
public String successPay(@RequestParam("paymentId") String paymentId, @RequestParam("PayerID") String payerId) {
try {
Payment payment = service.executePayment(paymentId, payerId);
System.out.println(payment.toJSON());
if (payment.getState().equals("approved")) {
return "success";
}
} catch (PayPalRESTException e) {
System.out.println(e.getMessage());
}
return "redirect:/";
}
}
{
@Autowired
private APIContext apiContext;
public Payment createPayment(
Double total,
String currency,
String method,
String intent,
String description,
String cancelUrl,
String successUrl) throws PayPalRESTException{
Amount amount = new Amount();
amount.setCurrency(currency);
total = new BigDecimal(total).setScale(2, RoundingMode.HALF_UP).doubleValue();
amount.setTotal(String.format("%.2f", total));
Transaction transaction = new Transaction();
transaction.setDescription(description);
transaction.setAmount(amount);
List<Transaction> transactions = new ArrayList<>();
transactions.add(transaction);
Payer payer = new Payer();
payer.setPaymentMethod(method);
Payment payment = new Payment();
payment.setIntent(intent);
payment.setPayer(payer);
payment.setTransactions(transactions);
RedirectUrls redirectUrls = new RedirectUrls();
redirectUrls.setCancelUrl(cancelUrl);
redirectUrls.setReturnUrl(successUrl);
payment.setRedirectUrls(redirectUrls);
return payment.create(apiContext);
}
public Payment executePayment(String paymentId, String payerId) throws PayPalRESTException{
Payment payment = new Payment();
payment.setId(paymentId);
PaymentExecution paymentExecute = new PaymentExecution();
paymentExecute.setPayerId(payerId);
return payment.execute(apiContext, paymentExecute);
}
}
解决方案
采取这一行:
amount.setTotal(String.format("%.2f", total));
更改%.2f
为%.3f
。最终代码应如下所示:
amount.setTotal(String.format("%.3f", total));
推荐阅读
- node.js - 在 SSH2 中为 NodeJS 清除客户端控制台?
- php - 使用 larasocket 广播聊天在 Laravel 8 上不起作用
- javascript - bootsrtap 模态未显示
- android-studio - 如何在 Android Studio 中关闭“每日提示”?
- java - Jackson:(De)Serializer 和 StdConverter 有什么区别?
- phpstorm - JetBrains 模板文件 | 复数变单数
- c++ - 如何从 C++ 代码检测和连接 wifi 显示器
- php - PHP代码中的多个sql和错误消息
- pytorch - 推理时,如何使用 EfficientDet-Pytorch 设置目标参数?
- java - 如何获取响应数据以在 JsonObjectRequest 函数之外使用