一、前期准备工作:
上篇博客配置的一些参数和文件Jar包 都要用到
微信支付需要小程序和商户绑定
APP绑定微信商户平台获取商户id(mchID)、
证书(商户后台下载)、
支付签名密钥(商户后台设置api密钥)、
退款签名密钥(商户后台设置api密钥ipv3)等
可以去微信官方文档那里查看怎么获取生成后台所需要的参数
官方文档:
支付异步回调通知:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_7&index=8
退款异步回调通知:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_16&index=11
二、支付流程:
个人理解:
微信支付需要提供三个接口 :
第一步是你的创建订单的动作
第二步前端确认用户支付的情况下 通过订单ID查询生成调用微信支付的参数 执行扣款动作
第三步微信支付成功后会自动调你提供给微信的回调地址
在回调操作里面修改订单状态 完成你支付成功后的后续动作。
PS:
支付退款的回调地址 必须是外网可以访问的
微信支付金额是分 支付宝是元
三、微信支付详细代码案例:
日期工具类:
import cn.njcool.common.enums.DateEnum;
import cn.njcool.common.enums.NumberEnum;
import org.apache.commons.lang3.StringUtils;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalField;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.List;
/**
* @Name: DateUtil
* @Author: zhu
* @Date: 2020-02-07
* @Description: 日期时间处理工具类
*/
public class DateUtil {
private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter DATE_TIME_FORMAT = DateTimeFormatter
.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter NO_SPACE_DATE_TIME_FORMAT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
private static final DateTimeFormatter DATE_TIME_WITH_HMS_FORMAT = DateTimeFormatter
.ofPattern("HH:mm:ss");
public static String formatDateTime(LocalDateTime date, DateEnum dateEnum) {
if (date != null) {
switch (dateEnum) {
case DATE: {
return DATE_FORMAT.format(date);
}
case DATE_TIME: {
return DATE_TIME_FORMAT.format(date);
}
case NO_SPACE_DATE_TIME: {
return NO_SPACE_DATE_TIME_FORMAT.format(date);
}
case TIME_WITH_HMS: {
return DATE_TIME_WITH_HMS_FORMAT.format(date);
}
}
}
return null;
}
public static LocalDateTime formatDateTime(String dateStr) {
if (StringUtils.isNotEmpty(dateStr)) {
if (dateStr.length() == DateEnum.DATE.getValue()) {
dateStr += " 00:00:00";
return LocalDateTime.parse(dateStr, DATE_TIME_FORMAT);
} else if (dateStr.length() == DateEnum.DATE_TIME.getValue()) {
return LocalDateTime.parse(dateStr, DATE_TIME_FORMAT);
} else if (dateStr.length() == DateEnum.NO_SPACE_DATE_TIME.getValue()) {
return LocalDateTime.parse(dateStr, NO_SPACE_DATE_TIME_FORMAT);
} else if (dateStr.length() == DateEnum.TIME.getValue()) {
dateStr = "2020-01-01 " + dateStr + ":00";
return LocalDateTime.parse(dateStr, DATE_TIME_FORMAT);
}
}
return null;
}
public static List<String> getWeekDateList(int week, String endDate, List<String> excludeDateList) {
LocalDateTime now = LocalDateTime.now();
List<String> resultList = new ArrayList<>();
TemporalField temporalField = WeekFields.of(DayOfWeek.of(1), 1).dayOfWeek();
LocalDateTime localDateTime = now.with(temporalField, week);
if (localDateTime.isBefore(now)) {
localDateTime = localDateTime.plusWeeks(1);
}
while (true) {
String localDateTimeStr = formatDateTime(localDateTime, DateEnum.DATE);
if (localDateTimeStr.compareTo(endDate) > NumberEnum.ZERO.getValue()) {
break;
}
if (!excludeDateList.contains(localDateTimeStr)) {
resultList.add