admin管理员组

文章数量:1027454

支付服务中对支付金额支持小数的金额处理

支付的支付服务,支付金额带小数点的情况处理,不要强制转换为int,否则不支持支付金额小数 导致记录的金额不准确,同时在支付网关接收到mq消息效验金额是否一致,不通过。

支付宝 settleAmount = amountRefund.replace(".", "");     //将小数点替换,则统一转换为百分制,单位为分 微信 settleAmount = wxPayResData.getTotal_fee() ; //订单总金额,单位为分 ,所以此处不需要添加 + "00";

代码语言:javascript代码运行次数:0运行复制
/**
                 * 金额转换
                 */
                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);
                }
代码语言:javascript代码运行次数:0运行复制
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;
    }
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-05-04,如有侵权请联系 cloudcommunity@tencent 删除微信bigdecimal测试服务网关

支付服务中对支付金额支持小数的金额处理

支付的支付服务,支付金额带小数点的情况处理,不要强制转换为int,否则不支持支付金额小数 导致记录的金额不准确,同时在支付网关接收到mq消息效验金额是否一致,不通过。

支付宝 settleAmount = amountRefund.replace(".", "");     //将小数点替换,则统一转换为百分制,单位为分 微信 settleAmount = wxPayResData.getTotal_fee() ; //订单总金额,单位为分 ,所以此处不需要添加 + "00";

代码语言:javascript代码运行次数:0运行复制
/**
                 * 金额转换
                 */
                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);
                }
代码语言:javascript代码运行次数:0运行复制
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;
    }
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-05-04,如有侵权请联系 cloudcommunity@tencent 删除微信bigdecimal测试服务网关

本文标签: 支付服务中对支付金额支持小数的金额处理