首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >支付服务中对支付金额支持小数的金额处理

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

作者头像
oktokeep
发布2025-05-05 13:26:57
发布2025-05-05 13:26:57
19300
代码可运行
举报
文章被收录于专栏:第三方工具第三方工具
运行总次数:0
代码可运行

支付的支付服务,支付金额带小数点的情况处理,不要强制转换为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.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档