Spring boot PayPal REST API返回无效的\u货币\u金额\u格式

Spring boot PayPal REST API返回无效的\u货币\u金额\u格式,spring-boot,paypal,payment-gateway,paypal-sandbox,Spring Boot,Paypal,Payment Gateway,Paypal Sandbox,响应代码:400详细信息:名称:验证\错误消息:无效请求-请参阅详细信息:[{ “字段”:“交易.金额”, “问题”:“无法构造com.paypal.platform.payments.model.rest.common.Amount的实例”,>问题:无效的\u货币\u金额\u格式” }]调试id:86ad5783892c3信息链接: package com.spring.soap.api; @配置 公共类PaypalConfig{ @值(${paypal.client.id}) 私有字符串cl

响应代码:400详细信息:名称:验证\错误消息:无效请求-请参阅详细信息:[{ “字段”:“交易.金额”, “问题”:“无法构造
com.paypal.platform.payments.model.rest.common.Amount的实例”
,>问题:无效的\u货币\u金额\u格式” }]调试id:86ad5783892c3信息链接:

package com.spring.soap.api;
@配置
公共类PaypalConfig{
@值(${paypal.client.id})
私有字符串clientId;
@值(${paypal.client.secret}”)
私有字符串clientSecret;
@值(${paypal.mode}”)
私有字符串模式;
@豆子
公共地图paypalSdkConfig(){
Map configMap=newhashmap();
configMap.put(“模式”,模式);
返回配置图;
}
@豆子
公共OAuthTokenCredential OAuthTokenCredential(){
返回新的OAuthTokenCredential(clientId、clientSecret、paypalSdkConfig());
}
@豆子
公共APIContext APIContext()引发PayPalRESTException{
APIContext context=新的APIContext(oAuthTokenCredential().getAccessToken());
setConfigurationMap(paypalSdkConfig());
返回上下文;
}
}
{
@自动连线
支付服务;
公共静态最终字符串SUCCESS\u URL=“pay/SUCCESS”;
公共静态最终字符串取消\u URL=“支付/取消”;
@GetMapping(“/”)
公共字符串home(){
返回“家”;
}
@邮戳(“/支付”)
公共字符串支付(@modeldattribute(“订单”)订单){
试一试{
Payment Payment=service.createPayment(order.getPrice()、order.getCurrency()、order.getMethod(),
order.getIntent(),order.getDescription(),“http://localhost:9090/“+取消URL,
"http://localhost:9090/“+SUCCESS_URL);
对于(链接:payment.getLinks()){
if(link.getRel().equals(“批准url”)){
return“redirect:+link.getHref();
}
}
}捕获(Paypalreste例外){
e、 printStackTrace();
}
返回“重定向:/”;
}
@GetMapping(值=取消\u URL)
公共字符串cancelPay(){
返回“取消”;
}
@GetMapping(值=成功\u URL)
公共字符串successPay(@RequestParam(“paymentId”)字符串paymentId,@RequestParam(“PayerID”)字符串PayerID){
试一试{
Payment Payment=服务.执行支付(paymentId,payerId);
System.out.println(payment.toJSON());
如果(payment.getState()等于(“已批准”)){
返回“成功”;
}
}捕获(Paypalreste例外){
System.out.println(e.getMessage());
}
返回“重定向:/”;
}
}
{
@自动连线
私有APIContext-APIContext;
公共支付(
双倍总数,
字符串货币,
字符串方法,
字符串意图,
字符串描述,
字符串取消URL,
字符串successUrl)引发PayPalRESTException{
金额=新金额();
金额。设置货币(币种);
总计=新的BigDecimal(总计)。设置刻度(2,舍入模式。向上舍入半个)。doubleValue();
amount.setTotal(String.format(“%.2f”,total));
事务=新事务();
事务.setDescription(描述);
交易。设置金额(金额);
列表事务=新建ArrayList();
交易。添加(交易);
付款人付款人=新付款人();
付款人.设置付款方式(方法);
付款=新付款();
支付。设定意图(意图);
付款。设置付款人(付款人);
支付。设置交易(交易);
RedirectUrls RedirectUrls=新的重定向URL();
重定向URL.setCancelUrl(取消URL);
重定向URL.setReturnUrl(成功URL);
支付。设置重定向URL(重定向URL);
返回付款。创建(apiContext);
}
public Payment executePayment(字符串paymentId,字符串PayRid)引发PayPalRESTException{
付款=新付款();
payment.setId(paymentId);
PaymentExecution paymentExecute=新的PaymentExecution();
paymentExecute.setPayerId(payerId);
返回payment.execute(apiContext,paymentExecute);
}
}

您的语言环境似乎正在使用逗号(
)作为小数分隔符格式化小数


PayPal API只接受带句点(
)的数字作为十进制分隔符

在我的例子中,我发送了带有非舍入值的明细小计:

141.750
因此,我只是将值四舍五入如下:

details.setSubtotal(subTotal.setScale(2, BigDecimal.ROUND_HALF_EVEN).toString());
(换句话说)

以这条线为例:

amount.setTotal(String.format("%.2f", total));
%.2f
更改为
%.3f
。最终的代码应该如下所示:

amount.setTotal(String.format("%.3f", total));

您的问题不包括您试图在“金额”字段中设置的字符串的样本值。具体来说,如果是itThanks的数量,则为true
amount.setTotal(String.format("%.2f", total));
amount.setTotal(String.format("%.3f", total));