From 79cb33cf1331efe3035a785670e38cbdc7442baf Mon Sep 17 00:00:00 2001 From: fxh <1763817137@qq.com> Date: Wed, 23 Jul 2025 16:07:25 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E9=80=A0=E7=A7=9F=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../soopin/order/wechat/WechatPayData.java | 62 ++++++++++++++++ .../soopin/order/wechat/WechatPayService.java | 74 +++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayData.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayService.java diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayData.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayData.java new file mode 100644 index 000000000..069b4fb65 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayData.java @@ -0,0 +1,62 @@ +package com.wzj.soopin.order.wechat; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@ConfigurationProperties(prefix = "wechat") +@Component("WechatPayData") +public class WechatPayData { + + /** 商户号 */ + public static String appId; + public static String secret; + public static String merchantId; + /** 商户API私钥路径 */ + public static String privateKeyPath; + /** 商户证书序列号 */ + public static String merchantSerialNumber; + /** 商户APIV3密钥 */ + public static String apiV3key; + public static String notifyUrl; + + public static String miniProgramAppId; + public static String miniProgramSecret; + + public void setAppId(String appId) { + WechatPayData.appId = appId; + } + + public void setSecret(String secret) { + WechatPayData.secret = secret; + } + + public void setMerchantId(String merchantId) { + WechatPayData.merchantId = merchantId; + } + + public void setPrivateKeyPath(String privateKeyPath) { + WechatPayData.privateKeyPath = privateKeyPath; + } + + public void setMerchantSerialNumber(String merchantSerialNumber) { + WechatPayData.merchantSerialNumber = merchantSerialNumber; + } + + public void setApiV3key(String apiV3key) { + WechatPayData.apiV3key = apiV3key; + } + + public void setNotifyUrl(String notifyUrl) { + WechatPayData.notifyUrl = notifyUrl; + } + + public void setMiniProgramAppId(String miniProgramAppId) { + WechatPayData.miniProgramAppId = miniProgramAppId; + } + + public void setMiniProgramSecret(String miniProgramSecret) { + WechatPayData.miniProgramSecret = miniProgramSecret; + } +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayService.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayService.java new file mode 100644 index 000000000..a8722cbd0 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/wechat/WechatPayService.java @@ -0,0 +1,74 @@ +package com.wzj.soopin.order.wechat; + +import com.wechat.pay.java.service.payments.jsapi.JsapiService; +import com.wechat.pay.java.service.payments.jsapi.model.Amount; +import com.wechat.pay.java.service.payments.jsapi.model.Payer; +import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest; +import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse; +import com.wechat.pay.java.service.refund.RefundService; +import com.wechat.pay.java.service.refund.model.AmountReq; +import com.wechat.pay.java.service.refund.model.CreateRequest; +import com.wechat.pay.java.service.refund.model.Refund; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Service; + + +@Service +@Slf4j +@ConditionalOnProperty(prefix = "wechat", name = "enabled", havingValue = "true") +public class WechatPayService { + + @Autowired + private JsapiService service; + + @Autowired + private RefundService refundService; + + /** + * jsapi下单 + * @param orderNo 订单号 + * @param desc 订单描述 + * @param totalAmount 总金额,单位:分 + * @param openId 用户openid + * @return prepay_id + */ + public String jsapiPay(String orderNo,String desc,Integer totalAmount,String openId, Long memberId,String appId){ + PrepayRequest prepayRequest = new PrepayRequest(); + prepayRequest.setAppid(appId); + prepayRequest.setMchid(WechatPayData.merchantId); + prepayRequest.setDescription(desc); + prepayRequest.setOutTradeNo(orderNo); + prepayRequest.setAttach(String.valueOf(memberId)); + prepayRequest.setNotifyUrl(WechatPayData.notifyUrl); + Amount amount = new Amount(); + amount.setTotal(totalAmount); + prepayRequest.setAmount(amount); + Payer payer = new Payer(); + payer.setOpenid(openId); + prepayRequest.setPayer(payer); + PrepayResponse response = service.prepay(prepayRequest); + return response.getPrepayId(); + } + + public Refund refundPay(String refundId,String payId,String notifyUrl,Long refundAmount, Long totalAmount,String reason) { + //请求参数 + CreateRequest request = new CreateRequest(); + request.setReason(reason); + //设置退款金额 根据自己的实际业务自行填写 + AmountReq amountReq = new AmountReq(); + amountReq.setRefund(refundAmount); + amountReq.setTotal(totalAmount); + amountReq.setCurrency("CNY"); + request.setAmount(amountReq); + //支付成功后回调回来的transactionId 按照实际情况填写 + request.setOutTradeNo(payId); + //支付成功后回调回来的transactionId 按照实际情况填写 + request.setOutRefundNo(refundId); + //退款成功的回调地址 + request.setNotifyUrl(notifyUrl); + //发起请求,申请退款 + return refundService.create(request); + } +}