优化支付代码

This commit is contained in:
TinyAnts
2023-03-23 11:36:29 +08:00
parent a9549e23c9
commit 8475dc5324
7 changed files with 214 additions and 96 deletions

View File

@@ -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);
}
/**
* 对象句柄
*

View File

@@ -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;
}

View File

@@ -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<WxPayRefundV3Request.GoodsDetail> goodsDetails;
/** 子商户号 */
private String subMchid;
}