|
|
@@ -1,8 +1,7 @@
|
|
|
package beilv.wx.pay.service;
|
|
|
|
|
|
-import beilv.carinformation.domain.CarInformation;
|
|
|
import beilv.carinformation.mapper.CarInformationMapper;
|
|
|
-import beilv.competition.domain.Competition;
|
|
|
+import beilv.common.core.domain.AjaxResult;
|
|
|
import beilv.competition.mapper.CompetitionMapper;
|
|
|
import beilv.order.domain.StoreOrder;
|
|
|
import beilv.order.domain.StoreRefund;
|
|
|
@@ -13,8 +12,6 @@ import beilv.system.service.ISysMemberService;
|
|
|
import beilv.wx.pay.config.WxPayProperties;
|
|
|
import beilv.wx.pay.domain.vo.AppPayParam;
|
|
|
import beilv.wx.pay.domain.vo.AppRefundParam;
|
|
|
-import beilv.wx.pay.enums.OrderTypeEnum;
|
|
|
-import beilv.wx.pay.enums.PayOrderConstants;
|
|
|
import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
|
|
|
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Response;
|
|
|
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
|
|
|
@@ -68,24 +65,23 @@ public class IWxPayService {
|
|
|
*/
|
|
|
public JsapiResult unifiedOrder(AppPayParam param) throws Exception {
|
|
|
SysMember user = getSysMember(param.getUserId());
|
|
|
+ param.setSysMember(user);
|
|
|
//生成唯一标识商家订单号
|
|
|
- String outTradeNo = generateOutTradeNo(param.getOrderType());
|
|
|
WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
|
|
|
request.setAppid(wxPayProperties.getAppId());
|
|
|
request.setMchid(wxPayProperties.getMchId());
|
|
|
- request.setDescription(orderInfo(param, user));
|
|
|
- request.setOutTradeNo(outTradeNo);
|
|
|
+ request.setDescription(param.getDescription());
|
|
|
+ request.setOutTradeNo(param.getOrderId());
|
|
|
request.setNotifyUrl(wxPayProperties.getNotifyUrl());
|
|
|
WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
|
|
|
- amount.setTotal(yuanToFen(param.getMoney()));
|
|
|
+ amount.setTotal(yuanToFen(param.getPayPrice()));
|
|
|
amount.setCurrency("CNY");
|
|
|
request.setAmount(amount);
|
|
|
request.setPayer(new WxPayUnifiedOrderV3Request.Payer().setOpenid(user.getOpenId()));
|
|
|
JsapiResult jsapiResult = this.wxService.createOrderV3(TradeTypeEnum.JSAPI, request);
|
|
|
if (StringUtils.isNotEmpty(jsapiResult.getPackageValue())) {
|
|
|
//成功之后创建订单
|
|
|
- generateOrder(user, param, outTradeNo, jsapiResult.getPackageValue(), orderInfo(param, user));
|
|
|
-
|
|
|
+ generateOrder(param, jsapiResult.getPackageValue());
|
|
|
}
|
|
|
return jsapiResult;
|
|
|
}
|
|
|
@@ -109,73 +105,33 @@ public class IWxPayService {
|
|
|
.intValueExact();
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 统一下单接口
|
|
|
*
|
|
|
* @return 预支付交易会话标识
|
|
|
*/
|
|
|
- private void generateOrder(SysMember user, AppPayParam param, String outTradeNo, String payId, String remark) {
|
|
|
+ private void generateOrder(AppPayParam param, String payId) {
|
|
|
StoreOrder storeOrder = new StoreOrder();
|
|
|
- storeOrder.setOrderId(outTradeNo);
|
|
|
- storeOrder.setOrderType(param.getOrderType());
|
|
|
- storeOrder.setUid(user.getId());
|
|
|
- storeOrder.setRealName(user.getUsername());
|
|
|
- storeOrder.setUserPhone(user.getMobile());
|
|
|
- storeOrder.setUserAddress(user.getAddress());
|
|
|
+ storeOrder.setOrderId(param.getOrderId());
|
|
|
+ storeOrder.setUid(param.getSysMember().getId());
|
|
|
+ storeOrder.setRealName(param.getSysMember().getUsername());
|
|
|
+ storeOrder.setUserPhone(param.getSysMember().getMobile());
|
|
|
+ storeOrder.setUserAddress(param.getSysMember().getAddress());
|
|
|
storeOrder.setTotalNum(1);
|
|
|
- storeOrder.setPayType(param.getPayType());
|
|
|
- storeOrder.setTotalPrice(param.getMoney());
|
|
|
- storeOrder.setPayPrice(param.getMoney());
|
|
|
+ storeOrder.setTotalPrice(param.getTotalPrice());
|
|
|
+ storeOrder.setPayPrice(param.getPayPrice());
|
|
|
storeOrder.setPayTime(new Date());
|
|
|
storeOrder.setPayId(payId);
|
|
|
storeOrder.setCreateTime(new Date());
|
|
|
- storeOrder.setRemark(remark);
|
|
|
storeOrderMapper.insertStoreOrder(storeOrder);
|
|
|
}
|
|
|
|
|
|
- //生成商户订单号
|
|
|
- public String generateOutTradeNo(String orderType) {
|
|
|
- String prefix = "";
|
|
|
+ //生成退款订单号
|
|
|
+ public String generateOutTradeNo() {
|
|
|
String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
|
|
|
String random = String.valueOf((int) ((Math.random() * 9 + 1) * 100000)); // 6位随机
|
|
|
- if (orderType.equals(OrderTypeEnum.MEMBER_CHARGING.getValue())) {
|
|
|
- prefix = PayOrderConstants.RECHARGE_ORDER_PREFIX;
|
|
|
- } else if (orderType.equals(OrderTypeEnum.SINGLE_TIME.getValue())) {
|
|
|
- prefix = PayOrderConstants.CAR_ORDER_PREFIX;
|
|
|
- } else if (orderType.equals(OrderTypeEnum.MANY_TIMES.getValue())) {
|
|
|
- prefix = PayOrderConstants.EVENT_ORDER_PREFIX;
|
|
|
- } else if (orderType.equals(OrderTypeEnum.APPOINTMENT.getValue())) {
|
|
|
- prefix = PayOrderConstants.APPOINTMENT_ORDER_PREFIX;
|
|
|
- } else if (orderType.equals(OrderTypeEnum.WATCH_GAME.getValue())) {
|
|
|
- prefix = PayOrderConstants.REGISTRATION_ORDER_PREFIX;
|
|
|
- } else if (orderType.equals(OrderTypeEnum.REFOUND_MONEY.getValue())) {
|
|
|
- prefix = PayOrderConstants.REFOUND_MONEY_PREFIX;
|
|
|
- }
|
|
|
- return prefix + time + random;
|
|
|
- }
|
|
|
-
|
|
|
- //获取购买商品信息
|
|
|
- private String orderInfo(AppPayParam param, SysMember user) {
|
|
|
- String orderType = param.getOrderType();
|
|
|
- String isVip = user.getIsVip();
|
|
|
- if (orderType.equals(OrderTypeEnum.MEMBER_CHARGING.getValue())) {
|
|
|
- return "会员充值";
|
|
|
- } else if (orderType.equals(OrderTypeEnum.SINGLE_TIME.getValue())) {
|
|
|
- CarInformation carInformation = carInformationMapper.selectCarInformationById(Long.valueOf(param.getOrderId()));
|
|
|
- if ("1".equals(isVip)) {
|
|
|
- return carInformation.getMemberPrice().toString();
|
|
|
- }
|
|
|
- return carInformation.getName();
|
|
|
- } else if (orderType.equals(OrderTypeEnum.MANY_TIMES.getValue())) {
|
|
|
- Competition competition = competitionMapper.selectCompetitionById(Integer.valueOf(param.getOrderId()));
|
|
|
- return competition.getCompetitionTitle() + competition.getCompetitionType() + "报名";
|
|
|
- } else if (orderType.equals(OrderTypeEnum.APPOINTMENT.getValue())) {
|
|
|
- return "球场预约";
|
|
|
- } else if (orderType.equals(OrderTypeEnum.WATCH_GAME.getValue())) {
|
|
|
- Competition competition = competitionMapper.selectCompetitionById(Integer.valueOf(param.getOrderId()));
|
|
|
- return competition.getCompetitionTitle() + competition.getCompetitionType() + "观赛";
|
|
|
- }
|
|
|
- return null;
|
|
|
+ return "REF" + time + random;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -183,7 +139,7 @@ public class IWxPayService {
|
|
|
*
|
|
|
* @return 处理结果
|
|
|
*/
|
|
|
- public ResponseEntity<String> handleNotify(String notifyData, HttpServletRequest request) {
|
|
|
+ public AjaxResult handleNotify(String notifyData, HttpServletRequest request) {
|
|
|
SignatureHeader header = getRequestHeader(request);
|
|
|
try {
|
|
|
WxPayNotifyV3Result res = this.wxService.parseOrderNotifyV3Result(notifyData, header);
|
|
|
@@ -193,14 +149,14 @@ public class IWxPayService {
|
|
|
// 成功处理订单
|
|
|
processOrderPayment(decryptRes.getOutTradeNo());
|
|
|
// 成功返回200/204,body无需有内容
|
|
|
- return ResponseEntity.status(200).body("");
|
|
|
+ return AjaxResult.success();
|
|
|
} else {
|
|
|
// 失败返回4xx或5xx,且需要构造body信息
|
|
|
- return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
|
|
|
+ return AjaxResult.error();
|
|
|
}
|
|
|
} catch (WxPayException e) {
|
|
|
// 失败返回4xx或5xx,且需要构造body信息
|
|
|
- return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
|
|
|
+ return AjaxResult.error("微信支付回调失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -218,11 +174,7 @@ public class IWxPayService {
|
|
|
order.setPaid(1); // 设置为已支付
|
|
|
order.setStatus(1); // 设置订单状态为已支付
|
|
|
order.setPayTime(new java.util.Date()); // 设置支付时间
|
|
|
-
|
|
|
storeOrderMapper.updateStoreOrder(order);
|
|
|
-
|
|
|
- // TODO: 根据订单类型处理不同的业务逻辑
|
|
|
- // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -234,38 +186,37 @@ public class IWxPayService {
|
|
|
public WxPayRefundV3Result refund(AppRefundParam param) throws WxPayException {
|
|
|
WxPayRefundV3Request request = new WxPayRefundV3Request();
|
|
|
//商户退款单号
|
|
|
- request.setOutRefundNo(param.getOutTradeNo());
|
|
|
+ request.setOutRefundNo(param.getOrderId());
|
|
|
//原支付商户订单号
|
|
|
- request.setOutTradeNo(param.getOutTradeNo());
|
|
|
+ request.setOutTradeNo(param.getOrderId());
|
|
|
//退款原因说明
|
|
|
- request.setReason("不想要了");
|
|
|
+ request.setReason(param.getReason());
|
|
|
WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount();
|
|
|
//原订单总金额(单位:分)
|
|
|
- amount.setTotal(yuanToFen(param.getMoney()));
|
|
|
+ amount.setTotal(yuanToFen(param.getTotalPrice()));
|
|
|
//退款金额(单位:分)
|
|
|
- amount.setRefund(yuanToFen(param.getMoney()));
|
|
|
+ amount.setRefund(yuanToFen(param.getRefundAmount()));
|
|
|
//货币类型,默认 "CNY"
|
|
|
amount.setCurrency("CNY");
|
|
|
request.setAmount(amount);
|
|
|
request.setNotifyUrl(wxPayProperties.getRefundNotifyUrl());
|
|
|
- String outTradeNo = param.getOutTradeNo();
|
|
|
-
|
|
|
- refundOrder(getSysMember(param.getUid()), param, outTradeNo, request.getReason());
|
|
|
+ param.setSysMember(getSysMember(param.getUserId()));
|
|
|
+ refundOrder(param);
|
|
|
return this.wxService.refundV3(request);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * 统一下单接口
|
|
|
+ * 统一退款接口
|
|
|
*
|
|
|
* @return 预支付交易会话标识
|
|
|
*/
|
|
|
- private void refundOrder(SysMember user, AppRefundParam param, String outTradeNo, String reason) {
|
|
|
+ private void refundOrder(AppRefundParam param) {
|
|
|
StoreRefund storeRefund = new StoreRefund();
|
|
|
- storeRefund.setUid(user.getId());
|
|
|
- storeRefund.setRefundNo(generateOutTradeNo(param.getOrderType()));
|
|
|
- storeRefund.setOrderId(outTradeNo);
|
|
|
- storeRefund.setRefundAmount(param.getMoney());
|
|
|
- storeRefund.setRefundReason(reason);
|
|
|
+ storeRefund.setUid(param.getSysMember().getId());
|
|
|
+ storeRefund.setRefundNo(generateOutTradeNo());
|
|
|
+ storeRefund.setOrderId(param.getOrderId());
|
|
|
+ storeRefund.setRefundAmount(param.getRefundAmount());
|
|
|
+ storeRefund.setRefundReason(param.getReason());
|
|
|
storeRefund.setCreateTime(new Date());
|
|
|
storeRefundMapper.insertStoreRefund(storeRefund);
|
|
|
}
|
|
|
@@ -275,7 +226,7 @@ public class IWxPayService {
|
|
|
*
|
|
|
* @return 处理结果
|
|
|
*/
|
|
|
- public ResponseEntity<String> parseRefundNotify(String notifyData, HttpServletRequest request) {
|
|
|
+ public AjaxResult parseRefundNotify(String notifyData, HttpServletRequest request) {
|
|
|
SignatureHeader header = getRequestHeader(request);
|
|
|
try {
|
|
|
WxPayRefundNotifyV3Result res = this.wxService.parseRefundNotifyV3Result(notifyData, header);
|
|
|
@@ -285,14 +236,14 @@ public class IWxPayService {
|
|
|
// 成功处理订单
|
|
|
processOrderRefund(decryptRes.getOutTradeNo());
|
|
|
//成功返回200/204,body无需有内容
|
|
|
- return ResponseEntity.status(200).body("");
|
|
|
+ return AjaxResult.success();
|
|
|
} else {
|
|
|
//失败返回4xx或5xx,且需要构造body信息
|
|
|
- return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
|
|
|
+ return AjaxResult.error();
|
|
|
}
|
|
|
} catch (WxPayException e) {
|
|
|
//失败返回4xx或5xx,且需要构造body信息
|
|
|
- return ResponseEntity.status(500).body(WxPayNotifyV3Response.fail("错误原因"));
|
|
|
+ return AjaxResult.error("微信退款回调失败");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -305,27 +256,21 @@ public class IWxPayService {
|
|
|
StoreOrder order = storeOrderMapper.selectStoreOrderByOrderId(outTradeNo);
|
|
|
if (order != null) {
|
|
|
// 检查订单是否已经处理过
|
|
|
- if (order.getRefundStatus() == null && order.getPaid() == 1) {
|
|
|
+ if (order.getRefundStatus() != null && order.getPaid() == 1) {
|
|
|
// 更新订单状态
|
|
|
- order.setStatus(1); // 设置订单状态为已退款
|
|
|
+ order.setStatus(2); // 设置订单状态为已退款
|
|
|
order.setUpdateTime(new Date());
|
|
|
storeOrderMapper.updateStoreOrder(order);
|
|
|
-
|
|
|
- // TODO: 根据订单类型处理不同的业务逻辑
|
|
|
- // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
|
|
|
}
|
|
|
}
|
|
|
StoreRefund refund = storeRefundMapper.selectStoreRefundByOrderId(outTradeNo);
|
|
|
if (refund != null) {
|
|
|
// 检查订单是否已经处理过
|
|
|
- if (refund.getRefundStatus() == null && refund.getRefundStatus().equals("1")) {
|
|
|
+ if (refund.getRefundStatus() != null && refund.getRefundStatus().equals("1")) {
|
|
|
// 更新订单状态
|
|
|
refund.setRefundStatus("2"); // 设置订单状态为已退款
|
|
|
refund.setSuccessTime(new Date());
|
|
|
storeRefundMapper.updateStoreRefund(refund);
|
|
|
-
|
|
|
- // TODO: 根据订单类型处理不同的业务逻辑
|
|
|
- // 例如:会员充值订单更新用户会员状态、购买商品订单更新库存等
|
|
|
}
|
|
|
}
|
|
|
}
|