diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java index 9c252071..dbec191c 100644 --- a/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java +++ b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/WxPayDriver.java @@ -1,17 +1,27 @@ package com.mdd.common.plugin.wechat; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; +import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result; +import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; +import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; import com.github.binarywang.wxpay.config.WxPayConfig; +import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl; import com.mdd.common.entity.setting.DevPayConfig; +import com.mdd.common.entity.user.UserAuth; import com.mdd.common.enums.ClientEnum; import com.mdd.common.mapper.setting.DevPayConfigMapper; -import com.mdd.common.util.ConfigUtils; -import com.mdd.common.util.MapUtils; +import com.mdd.common.plugin.wechat.request.PaymentRequestV3; +import com.mdd.common.plugin.wechat.request.RefundRequestV3; +import com.mdd.common.util.*; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.Map; /** @@ -40,6 +50,87 @@ public class WxPayDriver { WxPayDriver.wxPayService = wxPayService; } + /** + * 微信支付 + * + * @param requestV3 请求参数 + * @return WxPayUnifiedOrderV3Result.JsapiResult + * @throws Exception 异常 + */ + public static WxPayUnifiedOrderV3Result.JsapiResult unifiedOrder(PaymentRequestV3 requestV3) throws Exception { + // 订单参数 + Integer terminal = requestV3.getTerminal(); + String openId = requestV3.getOpenId(); + String attach = requestV3.getAttach(); + String outTradeNo = requestV3.getOutTradeNo(); + BigDecimal orderAmount = requestV3.getOrderAmount(); + String description = requestV3.getDescription(); + + // 失效时间 + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); + Long expireTime = System.currentTimeMillis() + (30 * 60 * 1000); + String timeExpire = format.format(expireTime) + "+08:00"; + + // 订单信息 + WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request(); + wxPayUnifiedOrderV3Request.setOutTradeNo(outTradeNo); + wxPayUnifiedOrderV3Request.setDescription(description); + wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire); + wxPayUnifiedOrderV3Request.setAttach(attach); + wxPayUnifiedOrderV3Request.setNotifyUrl(RequestUtils.uri() + "/api/pay/notifyMnp"); + + // 订单金额 + WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); + amount.setTotal(AmountUtil.yuan2Fen(orderAmount.toPlainString())); + amount.setCurrency("CNY"); + wxPayUnifiedOrderV3Request.setAmount(amount); + + // 付款人员 + WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); + payer.setOpenid(openId); + + // H5平台 + if (terminal == ClientEnum.H5.getCode()) { + WxPayUnifiedOrderV3Request.SceneInfo sceneInfo = new WxPayUnifiedOrderV3Request.SceneInfo(); + WxPayUnifiedOrderV3Request.H5Info h5Info = new WxPayUnifiedOrderV3Request.H5Info(); + h5Info.setType("android"); + sceneInfo.setH5Info(h5Info); + sceneInfo.setPayerClientIp(IpUtils.getHostIp()); + sceneInfo.setDeviceId("1"); + wxPayUnifiedOrderV3Request.setSceneInfo(sceneInfo); + } + + // 发起订单 + WxPayService wxPayService = WxPayDriver.handler(terminal); + wxPayUnifiedOrderV3Request.setPayer(payer); + return wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request); + } + + /** + * 发起退款 + * + * @param request 请求参数 + * @return WxPayRefundV3Result 退款结果 + * @throws WxPayException 退款异常 + */ + public static WxPayRefundV3Result refund(RefundRequestV3 request) throws WxPayException { + WxPayRefundV3Request requestObj = new WxPayRefundV3Request(); + request.setTransactionId(request.getTransactionId()); + request.setOutTradeNo(request.getOutRefundNo()); + request.setOutRefundNo(request.getOutRefundNo()); + request.setReason(request.getReason()); + request.setNotifyUrl(request.getNotifyUrl()); + request.setSubMchid(request.getSubMchid()); + request.setGoodsDetails(request.getGoodsDetails()); + + WxPayRefundV3Request.Amount amount = new WxPayRefundV3Request.Amount(); + amount.setRefund(request.getRefundAmount()); + amount.setTotal(request.getTotalAmount()); + amount.setCurrency(StringUtils.isEmpty(request.getCurrency()) ? "CNY" : request.getCurrency()); + + return wxPayService.refundV3(requestObj); + } + /** * 对象句柄 * diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/PaymentRequestV3.java b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/PaymentRequestV3.java new file mode 100644 index 00000000..7386916d --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/PaymentRequestV3.java @@ -0,0 +1,31 @@ +package com.mdd.common.plugin.wechat.request; + +import lombok.Data; + +import java.io.Serializable; +import java.math.BigDecimal; + +@Data +public class PaymentRequestV3 implements Serializable { + + private static final long serialVersionUID = 1L; + + /** 支付终端 */ + private Integer terminal; + + /** 用户身份 */ + private String openId; + + /** 扩展字段 */ + private String attach; + + /** 订单编号 */ + private String outTradeNo; + + /** 订单金额 */ + private BigDecimal orderAmount; + + /** 订单描述 */ + private String description; + +} diff --git a/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/RefundRequestV3.java b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/RefundRequestV3.java new file mode 100644 index 00000000..78cfd792 --- /dev/null +++ b/server/like-common/src/main/java/com/mdd/common/plugin/wechat/request/RefundRequestV3.java @@ -0,0 +1,46 @@ +package com.mdd.common.plugin.wechat.request; + +import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request; +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +@Data +public class RefundRequestV3 implements Serializable { + + private static final long serialVersionUID = -1L; + + /** 订单流水号 */ + private String transactionId; + + /** 订单单号 */ + private String outTradeNo; + + /** 退款单号 */ + @SerializedName("out_refund_no") + private String outRefundNo; + + /** 退款原因 */ + private String reason; + + /** 通知接口 */ + private String notifyUrl; + + /** 退款金额 */ + private Integer refundAmount; + + /** 订单总额 */ + private Integer totalAmount; + + /** 退款币种 */ + private String currency; + + /** 商品信息 */ + private List goodsDetails; + + /** 子商户号 */ + private String subMchid; + +} diff --git a/server/like-front/src/main/java/com/mdd/front/controller/PayController.java b/server/like-front/src/main/java/com/mdd/front/controller/PayController.java index 6c4f06f5..58c71069 100644 --- a/server/like-front/src/main/java/com/mdd/front/controller/PayController.java +++ b/server/like-front/src/main/java/com/mdd/front/controller/PayController.java @@ -2,7 +2,6 @@ package com.mdd.front.controller; import com.github.binarywang.wxpay.bean.notify.SignatureHeader; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyV3Result; -import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.mdd.common.aop.NotLogin; @@ -11,7 +10,6 @@ import com.mdd.common.entity.RechargeOrder; import com.mdd.common.enums.ClientEnum; import com.mdd.common.enums.PaymentEnum; import com.mdd.common.exception.OperateException; -import com.mdd.common.exception.PaymentException; import com.mdd.common.mapper.RechargeOrderMapper; import com.mdd.common.plugin.wechat.WxPayDriver; import com.mdd.front.LikeFrontThreadLocal; @@ -51,11 +49,11 @@ public class PayController { @PostMapping("/prepay") @ApiOperation("发起支付") - public AjaxResult prepay(@Validated @RequestBody PaymentValidate paymentValidate) { + public AjaxResult prepay(@Validated @RequestBody PaymentValidate requestObj) { // 接收参数 - String scene = paymentValidate.getScene(); - Integer payWay = paymentValidate.getPayWay(); - Integer orderId = paymentValidate.getOrderId(); + String scene = requestObj.getScene(); + Integer payWay = requestObj.getPayWay(); + Integer orderId = requestObj.getOrderId(); Integer terminal = LikeFrontThreadLocal.getTerminal(); // 订单处理 @@ -67,11 +65,11 @@ public class PayController { Assert.notNull(rechargeOrder, "订单不存在"); Assert.isTrue(!payWay.equals(PaymentEnum.WALLET_PAY.getCode()), "支付类型不被支持"); - paymentValidate.setAttach("recharge"); - paymentValidate.setOrderSn(rechargeOrder.getOrderSn()); - paymentValidate.setUserId(rechargeOrder.getUserId()); - paymentValidate.setOrderAmount(rechargeOrder.getOrderAmount()); - paymentValidate.setDescription("余额充值"); + requestObj.setUserId(rechargeOrder.getUserId()); + requestObj.setOutTradeNo(rechargeOrder.getOrderSn()); + requestObj.setOrderAmount(rechargeOrder.getOrderAmount()); + requestObj.setDescription("余额充值"); + requestObj.setAttach("recharge"); payStatus = rechargeOrder.getPayStatus(); rechargeOrder.setPayWay(payWay); @@ -87,22 +85,8 @@ public class PayController { } // 发起支付 - try { - switch (payWay) { - case 1: // 余额支付 - String attach = paymentValidate.getAttach(); - String orderSn = paymentValidate.getOrderSn(); - iPayService.handlePaidNotify(attach, orderSn, null); - break; - case 2: // 微信支付 - WxPayUnifiedOrderV3Result.JsapiResult result = iPayService.wxPay(paymentValidate, terminal); - return AjaxResult.success(result); - } - } catch (Exception e) { - throw new PaymentException(e.getMessage()); - } - - throw new PaymentException("发起支付失败"); + Object result = iPayService.prepay(requestObj, terminal); + return AjaxResult.success(result); } @NotLogin diff --git a/server/like-front/src/main/java/com/mdd/front/service/IPayService.java b/server/like-front/src/main/java/com/mdd/front/service/IPayService.java index 679683f9..c9cd547c 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/IPayService.java +++ b/server/like-front/src/main/java/com/mdd/front/service/IPayService.java @@ -22,14 +22,13 @@ public interface IPayService { List payWay(String from, Integer terminal); /** - * 微信支付 + * 发起支付 * * @param params 参数 * @param terminal 终端 - * @return WxPayUnifiedOrderV3Result.JsapiResult - * @throws Exception 异常 + * @return Object */ - WxPayUnifiedOrderV3Result.JsapiResult wxPay(PaymentValidate params, Integer terminal) throws Exception; + Object prepay(PaymentValidate params, Integer terminal); /** * 支付回调处理 diff --git a/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java index 0300c1cc..94b58a25 100644 --- a/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java +++ b/server/like-front/src/main/java/com/mdd/front/service/impl/PayServiceImpl.java @@ -5,6 +5,7 @@ import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request; import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result; import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum; import com.github.binarywang.wxpay.service.WxPayService; +import com.mdd.common.core.AjaxResult; import com.mdd.common.entity.RechargeOrder; import com.mdd.common.entity.setting.DevPayConfig; import com.mdd.common.entity.setting.DevPayWay; @@ -13,6 +14,7 @@ import com.mdd.common.entity.user.UserAuth; import com.mdd.common.enums.ClientEnum; import com.mdd.common.enums.LogMoneyEnum; import com.mdd.common.enums.PaymentEnum; +import com.mdd.common.exception.PaymentException; import com.mdd.common.mapper.LogMoneyMapper; import com.mdd.common.mapper.RechargeOrderMapper; import com.mdd.common.mapper.setting.DevPayConfigMapper; @@ -20,6 +22,7 @@ import com.mdd.common.mapper.setting.DevPayWayMapper; import com.mdd.common.mapper.user.UserAuthMapper; import com.mdd.common.mapper.user.UserMapper; import com.mdd.common.plugin.wechat.WxPayDriver; +import com.mdd.common.plugin.wechat.request.PaymentRequestV3; import com.mdd.common.util.*; import com.mdd.front.service.IPayService; import com.mdd.front.validate.PaymentValidate; @@ -30,7 +33,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; -import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -92,72 +96,35 @@ public class PayServiceImpl implements IPayService { } /** - * 微信支付 + * 发起支付 * - * @author fzr - * @param params 支付参数 + * @param params 参数 * @param terminal 终端 - * @throws Exception 异常 + * @return Object */ - @Override - public WxPayUnifiedOrderV3Result.JsapiResult wxPay(PaymentValidate params, Integer terminal) throws Exception { - // 订单参数 - Integer userId = params.getUserId(); - String attach = params.getAttach(); - String orderSn = params.getOrderSn(); - BigDecimal orderAmount = params.getOrderAmount(); - String description = params.getDescription(); - - // 查询OpenId - String openId = ""; - UserAuth userAuth = userAuthMapper.selectOne(new QueryWrapper() - .eq("user_id", userId) - .eq("terminal", terminal) - .last("limit 1")); - - // 设置OpenId - if (StringUtils.isNotNull(userAuth)) { - openId = userAuth.getOpenid(); + public Object prepay(PaymentValidate params, Integer terminal) { + try { + switch (params.getPayWay()) { + case 1: // 余额支付 + String attach = params.getAttach(); + String orderSn = params.getOutTradeNo(); + this.handlePaidNotify(attach, orderSn, null); + return Collections.emptyList(); + case 2: // 微信支付 + PaymentRequestV3 requestV3 = new PaymentRequestV3(); + requestV3.setTerminal(terminal); + requestV3.setOpenId(""); + requestV3.setAttach(params.getAttach()); + requestV3.setOutTradeNo(params.getOutTradeNo()); + requestV3.setOrderAmount(params.getOrderAmount()); + requestV3.setDescription(params.getDescription()); + return WxPayDriver.unifiedOrder(requestV3); + } + } catch (Exception e) { + throw new PaymentException(e.getMessage()); } - // 失效时间 - SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - Long expireTime = System.currentTimeMillis() + (30 * 60 * 1000); - String timeExpire = format.format(expireTime) + "+08:00"; - - // 订单信息 - WxPayUnifiedOrderV3Request wxPayUnifiedOrderV3Request = new WxPayUnifiedOrderV3Request(); - wxPayUnifiedOrderV3Request.setOutTradeNo(orderSn); - wxPayUnifiedOrderV3Request.setDescription(description); - wxPayUnifiedOrderV3Request.setTimeExpire(timeExpire); - wxPayUnifiedOrderV3Request.setAttach(attach); - wxPayUnifiedOrderV3Request.setNotifyUrl(RequestUtils.uri() + "/api/pay/notifyMnp"); - - // 订单金额 - WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount(); - amount.setTotal(AmountUtil.yuan2Fen(orderAmount.toPlainString())); - amount.setCurrency("CNY"); - wxPayUnifiedOrderV3Request.setAmount(amount); - - // 付款人员 - WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer(); - payer.setOpenid(openId); - - // H5平台 - if (terminal == ClientEnum.H5.getCode()) { - WxPayUnifiedOrderV3Request.SceneInfo sceneInfo = new WxPayUnifiedOrderV3Request.SceneInfo(); - WxPayUnifiedOrderV3Request.H5Info h5Info = new WxPayUnifiedOrderV3Request.H5Info(); - h5Info.setType("android"); - sceneInfo.setH5Info(h5Info); - sceneInfo.setPayerClientIp(IpUtils.getHostIp()); - sceneInfo.setDeviceId("1"); - wxPayUnifiedOrderV3Request.setSceneInfo(sceneInfo); - } - - // 发起订单 - WxPayService wxPayService = WxPayDriver.handler(terminal); - wxPayUnifiedOrderV3Request.setPayer(payer); - return wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxPayUnifiedOrderV3Request); + throw new PaymentException("支付发起异常"); } /** diff --git a/server/like-front/src/main/java/com/mdd/front/validate/PaymentValidate.java b/server/like-front/src/main/java/com/mdd/front/validate/PaymentValidate.java index 82ea3692..0605bd18 100644 --- a/server/like-front/src/main/java/com/mdd/front/validate/PaymentValidate.java +++ b/server/like-front/src/main/java/com/mdd/front/validate/PaymentValidate.java @@ -33,7 +33,7 @@ public class PaymentValidate implements Serializable { private String attach; @ApiModelProperty(value = "订单编号", notes = "该参数无需传递") - private String orderSn; + private String outTradeNo; @ApiModelProperty(value = "订单金额", notes = "该参数无需传递") private BigDecimal orderAmount;