支付服务中对支付金额支持小数的金额处理
支付的支付服务,支付金额带小数点的情况处理,不要强制转换为int,否则不支持支付金额小数
导致记录的金额不准确,同时在支付网关接收到mq消息效验金额是否一致,不通过。
支付宝
settleAmount = amountRefund.replace(".", ""); //将小数点替换,则统一转换为百分制,单位为分
微信
settleAmount = wxPayResData.getTotal_fee() ; //订单总金额,单位为分 ,所以此处不需要添加 + "00";
/** * 金额转换 */ Double transAmt = 0d; //真实支付金额,去掉小数点2位 // Integer transAmtTmp = 0; String total_freeze_credit_amount = "0"; //信用金额 String total_freeze_fund_amount = ""; //资金金额 try { // 容错处理 // transAmtTmp = Integer.valueOf(settleAmount) / 100; // settleAmount = String.valueOf(transAmtTmp); BigDecimal realTransAmt = BigDecimalUtils.getRealTransAmt(settleAmount); transAmt = realTransAmt.doubleValue(); settleAmount = String.valueOf(transAmt); if(StringUtils.isBlank(total_freeze_fund_amount)) { total_freeze_fund_amount = String.valueOf(transAmt);//设置默认值 冻结资金账户 } } catch (Exception e) { logger.error("settleAmount < 0的转换,仅仅针对测试金额。",e); }
import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalUtils { /** * 银联,applepay,微信,金额单位为分 保留2位小数点 * @param amt * @return */ public static BigDecimal getIntegerTransAmt(String amt){ /** * 保留2位小数 */ BigDecimal setScale2 = getDoubleTransAmt(amt); BigDecimal multiplicand = new BigDecimal("100"); //乘以100 /** * 乘以100 */ BigDecimal bignumresult = setScale2.multiply(multiplicand); //精确到分 return bignumresult; } public static BigDecimal getRealTransAmt(String amt){ /** * 保留2位小数 */ BigDecimal setScale2 = getDoubleTransAmt(amt); BigDecimal multiplicand = new BigDecimal("100"); //乘以100 /** * 除以100 */ BigDecimal bignumresult = setScale2.divide(multiplicand,2,RoundingMode.HALF_UP); //精确到分 return bignumresult; } /** * 快钱,连连支付,支付宝 单位 元 * @param amt * @return */ public static BigDecimal getDoubleTransAmt(String amt){ BigDecimal decimal = new BigDecimal(amt); BigDecimal setScale2 = decimal.setScale(2,BigDecimal.ROUND_HALF_UP); //四舍五入 return setScale2; } }