支付宝花呗计算金额工具类

本文介绍了一种用于计算花呗分期付款中各项费用的方法,包括每期本金、每期手续费及每期总费用等关键指标,并提供了具体实现的Java代码示例。
[url]https://docs.open.alipay.com/60/104790/[/url]
[url]https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.ZketYD&treeId=338&articleId=106464&docType=1[/url]
[url]https://docs.open.alipay.com/277/106748/[/url]

package com.baozun.store.util;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.baozun.store.constants.GucciAlipayConstants;

/**
* 花呗分期工具
* @author binrui.dong
* 2017年7月25日 下午5:58:08
*/
public class InstallmentUtil{

private static final Logger LOG = LoggerFactory.getLogger(InstallmentUtil.class);

private static final BigDecimal ONE_HUNDRED = BigDecimal.valueOf(100);

/**
* 1、获取用户每期本金
* 2、获取用户每期手续费
* 3、获取用户每期总费用
* @param payAmount 总额
* @param periods 期数
* @return
* <p>binrui.dong
* <p>2017年7月25日 下午6:03:38
*/
public static Map<String,BigDecimal> getInstallmentCost(BigDecimal payAmount, Integer periods){
Map<String,BigDecimal> map = new HashMap<String,BigDecimal>();
BigDecimal payAmountCent = payAmount.multiply(ONE_HUNDRED);//转化为分
BigDecimal totalFeeInDecimal = null;
switch (periods) {
case 3:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(GucciAlipayConstants.HB_FQ_THREE_FEE_RATE).setScale(2, RoundingMode.HALF_UP);
break;
case 6:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(GucciAlipayConstants.HB_FQ_SIX_FEE_RATE).setScale(2, RoundingMode.HALF_UP);
break;
case 12:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(GucciAlipayConstants.HB_FQ_TWELVE_FEE_RATE).setScale(2, RoundingMode.HALF_UP);
break;
}

map.put("allRateFee", totalFeeInDecimal.divide(ONE_HUNDRED,RoundingMode.HALF_EVEN).setScale(2, RoundingMode.HALF_EVEN));

map.put("allFee", payAmountCent.add(totalFeeInDecimal).divide(ONE_HUNDRED).setScale(2, RoundingMode.HALF_EVEN));
LOG.debug("总费用:" + map.get("allFee"));

BigDecimal eachFee = map.get("allRateFee").setScale(2, RoundingMode.HALF_DOWN).divide(BigDecimal.valueOf(periods), RoundingMode.HALF_DOWN);//文档里是ROUND_DOWN
map.put("eachFee", eachFee);
LOG.debug("每期手续费:" + map.get("eachFee"));

BigDecimal prinAndFee = map.get("allFee").setScale(2, RoundingMode.HALF_DOWN).divide(BigDecimal.valueOf(periods), RoundingMode.HALF_DOWN);//文档里是ROUND_DOWN
map.put("prinAndFee", prinAndFee);
LOG.debug("每期费用:" + map.get("prinAndFee"));

map.put("periods", BigDecimal.valueOf(periods));

return map;
}
public static Map<String,BigDecimal> getInstallmentCost2(BigDecimal payAmount, Integer periods){
Map<String,BigDecimal> map = new HashMap<String,BigDecimal>();
BigDecimal payAmountCent = payAmount.multiply(ONE_HUNDRED);//转化为分
BigDecimal totalFeeInDecimal = null;
switch (periods) {
case 3:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(new BigDecimal(0.023)).setScale(2, RoundingMode.HALF_UP);
break;
case 6:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(new BigDecimal(0.045)).setScale(2, RoundingMode.HALF_UP);
break;
case 12:
totalFeeInDecimal = payAmountCent.setScale(2, RoundingMode.HALF_UP)
.multiply(new BigDecimal(0.075)).setScale(2, RoundingMode.HALF_UP);
break;
}

map.put("allRateFee", totalFeeInDecimal.divide(ONE_HUNDRED,RoundingMode.HALF_EVEN).setScale(2, RoundingMode.HALF_EVEN));

map.put("allFee", payAmountCent.add(totalFeeInDecimal).divide(ONE_HUNDRED).setScale(2, RoundingMode.HALF_EVEN));
LOG.debug("总费用:" + map.get("allFee"));

BigDecimal eachFee = map.get("allRateFee").setScale(2, RoundingMode.HALF_DOWN).divide(BigDecimal.valueOf(periods), RoundingMode.HALF_DOWN);//文档里是ROUND_DOWN
map.put("eachFee", eachFee);
LOG.debug("每期手续费:" + map.get("eachFee"));

BigDecimal prinAndFee = map.get("allFee").setScale(2, RoundingMode.HALF_DOWN).divide(BigDecimal.valueOf(periods), RoundingMode.HALF_DOWN);//文档里是ROUND_DOWN
map.put("prinAndFee", prinAndFee);
LOG.debug("每期费用:" + map.get("prinAndFee"));

map.put("periods", BigDecimal.valueOf(periods));

return map;
}
public static void main(String[] args){
System.err.println(getInstallmentCost2(new BigDecimal(1111.11), 3));
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值