diff --git a/ruoyi-admin/src/main/resources/application-druid-root.yml b/ruoyi-admin/src/main/resources/application-druid-root.yml index 897a2f9..358ffe6 100644 --- a/ruoyi-admin/src/main/resources/application-druid-root.yml +++ b/ruoyi-admin/src/main/resources/application-druid-root.yml @@ -6,8 +6,8 @@ spring: druid: # 主库数据源 jdbc:mysql://localhost:3306/catmdogf?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true master: -# url: jdbc:mysql://47.97.158.59:3306/catmdogf_test20250624?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true - url: jdbc:mysql://47.97.158.59:3306/catmdogf_prod20250624?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true + url: jdbc:mysql://47.97.158.59:3306/catmdogf_test20250624?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true +# url: jdbc:mysql://47.97.158.59:3306/catmdogf_prod20250624?useUnicode=true&useSSL=false&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true username: root password: Qweruiop@123 # 从库数据源 @@ -77,6 +77,10 @@ wechat: staffAppId: wx01f0f43759922fda staffSecret: b0a5617e6e4c387262a32af2b355c8b6 publicKeyId: PUB_KEY_ID_0116656396912025062400291558001601 + publicKeyPath: E:\\git_java\\api_java\\pet-admin\\pet-admin\\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem +# publicKeyPath: E:\\file\\2025\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem +# publicKeyPath: E:\\file\\2025\\project\\1\pet-admin\\ruoyi-admin\\src\\main\\resources\\pub_key.pem +# publicKeyPath: /data/software/app/key/pub_key.pem pay: v3: # 租户id diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 0a713f2..e914046 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -20,7 +20,7 @@ ruoyi: # 开发环境配置.0 server: # 服务器的HTTP端口,默认为8080 - port: 8080 + port: 8002 servlet: # 应用的访问路径 context-path: / diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java index e39e65b..3183f59 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/ApiMallOrderController.java @@ -319,7 +319,7 @@ public class ApiMallOrderController extends BaseController { @ApiOperation("mall-查询-再次支付") @PostMapping("/orderPay") - public ResponseEntity orderPay(@RequestBody OrderPayRequest req){ + public ResponseEntity orderPay(@RequestBody OrderPayRequest req){ log.info("订单支付","提交的数据:"+ JSONObject.toJSONString(req)); String redisKey = "h5_oms_order_pay_"+req.getPayId(); String redisValue = req.getPayId()+"_"+System.currentTimeMillis(); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java index 8b69ad1..15f8d04 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/contoller/H5AppointmentController.java @@ -117,7 +117,7 @@ public class H5AppointmentController { // orderService.submitOrderService(order.getId(), form.getPetOrderServices()); //TODO 4、创建支付预付单 log.info("4 创建支付预付单......"); - OrderPayResponse response = orderService.orderCreateAndPay(order, member, form.getOpenId()); + Object response = orderService.orderCreateAndPay(order, member, form.getOpenId()); log.info("5 创建订单完成:" + response); return AjaxResult.successData(response); diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java index 33fa0ad..c8cd97a 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/IApiMallOrderService.java @@ -32,5 +32,5 @@ public interface IApiMallOrderService { //再次支付 - OrderPayResponse orderPay(OrderPayRequest req); + Object orderPay(OrderPayRequest req); } diff --git a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java index 17db4ab..76ce264 100644 --- a/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java +++ b/ruoyi-catdog/src/main/java/com/ruoyi/applet/service/impl/IApiMallOrderServiceImpl.java @@ -35,6 +35,7 @@ import com.cyl.tencent.OrderMessageModel; import com.cyl.wechat.WechatPayData; import com.cyl.wechat.WechatPayService; import com.cyl.wechat.WechatPayUtil; +import com.cyl.wechat.pay.MpWxPayService; import com.github.pagehelper.PageHelper; import com.ruoyi.applet.service.IApiMallOrderService; import com.ruoyi.applet.utils.WechatRefundUtil; @@ -110,7 +111,8 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { // @Lazy private WechatPayService wechatPayService; - + @Autowired + private MpWxPayService mpWxPayService; @Autowired @@ -494,7 +496,7 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { @Override - public OrderPayResponse orderPay(OrderPayRequest req) { + public Object orderPay(OrderPayRequest req) { QueryWrapper qw = new QueryWrapper<>(); qw.eq("pay_id", req.getPayId()); qw.eq("status", 0); @@ -566,48 +568,64 @@ public class IApiMallOrderServiceImpl implements IApiMallOrderService { openId = memberWechat.getRoutineOpenid(); appId = WechatPayData.miniProgramAppId; } - String prepayId = wechatPayService.jsapiPay( - String.valueOf(req.getPayId()), + + Object order1 = mpWxPayService.createOrder( orderDesc, + "127.0.0.1", + String.valueOf(req.getPayId()), price, + String.valueOf(req.getPayId()), openId, - req.getMemberId(), - appId + "{}", + WechatPayData.notifyUrl, + String.valueOf(req.getMemberId()) ); - /* - String prepayId = wechatPayService.jsapiPay( - String.valueOf(order.getPayId()), - orderDesc, - Integer.valueOf(payAmount), - openId, - member.getId(), - appId - ); - **/ - - OrderPayResponse response = new OrderPayResponse(); - response.setPayType(2); - String nonceStr = WechatPayUtil.generateNonceStr(); - long timeStamp = WechatPayUtil.getCurrentTimestamp(); - prepayId = "prepay_id=" + prepayId; - String signType = "RSA"; - String paySign = null; - String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) - .collect(Collectors.joining("\n", "", "\n")); - try { - paySign = WechatPayUtil.getSign(signatureStr, WechatPayData.privateKeyPath); - } catch (Exception e) { - throw new RuntimeException("支付失败"); - } - response.setAppId(appId); - response.setTimeStamp(String.valueOf(timeStamp)); - response.setNonceStr(nonceStr); - response.setSignType(signType); - response.setPackage_(prepayId); - response.setPaySign(paySign); - response.setOrderId(orderList.get(0).getId()); - return response; + return order1; + +// +// String prepayId = wechatPayService.jsapiPay( +// String.valueOf(req.getPayId()), +// orderDesc, +// price, +// openId, +// req.getMemberId(), +// appId +// ); +// +// /* +// String prepayId = wechatPayService.jsapiPay( +// String.valueOf(order.getPayId()), +// orderDesc, +// Integer.valueOf(payAmount), +// openId, +// member.getId(), +// appId +// ); +// **/ +// +// OrderPayResponse response = new OrderPayResponse(); +// response.setPayType(2); +// String nonceStr = WechatPayUtil.generateNonceStr(); +// long timeStamp = WechatPayUtil.getCurrentTimestamp(); +// prepayId = "prepay_id=" + prepayId; +// String signType = "RSA"; +// String paySign = null; +// String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) +// .collect(Collectors.joining("\n", "", "\n")); +// try { +// paySign = WechatPayUtil.getSign(signatureStr, WechatPayData.privateKeyPath); +// } catch (Exception e) { +// throw new RuntimeException("支付失败"); +// } +// response.setAppId(appId); +// response.setTimeStamp(String.valueOf(timeStamp)); +// response.setNonceStr(nonceStr); +// response.setSignType(signType); +// response.setPackage_(prepayId); +// response.setPaySign(paySign); +// response.setOrderId(orderList.get(0).getId()); +// return response; } } diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/controller/PayNotifyController.java b/ruoyi-mall/src/main/java/com/cyl/h5/controller/PayNotifyController.java index d695f5c..8430222 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/controller/PayNotifyController.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/controller/PayNotifyController.java @@ -166,7 +166,7 @@ public class PayNotifyController { message.setTradeStatus(Transaction.TradeStateEnum.SUCCESS); message.setPayTime(new Date()); message.setTradeNo(notify.getTransactionId()); - h5OrderService.payCallBack(message); + h5OrderService.payCallBackForBCHSHI(message); log.info("新版本微信公钥的支付回调成功:{}", notify); return; diff --git a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java index 583c6ff..6e679b2 100644 --- a/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java +++ b/ruoyi-mall/src/main/java/com/cyl/h5/service/H5OrderService.java @@ -45,6 +45,7 @@ import com.cyl.tencent.OrderMessageModel; import com.cyl.wechat.WechatPayData; import com.cyl.wechat.WechatPayService; import com.cyl.wechat.WechatPayUtil; +import com.cyl.wechat.pay.MpWxPayService; import com.github.pagehelper.PageHelper; import com.google.gson.Gson; import com.ruoyi.common.constant.Constants; @@ -91,6 +92,9 @@ public class H5OrderService { @Autowired private MemberAddressMapper memberAddressMapper; + @Autowired + private MpWxPayService mpWxPayService; + @Autowired private H5MemberAddressService h5MemberAddressService; @@ -1084,7 +1088,7 @@ public class H5OrderService { } - public OrderPayResponse orderCreateAndPay(Order order, Member member, String openId) { + public Object orderCreateAndPay(Order order, Member member, String openId) { log.info("【支付】开始组装支付参数"); QueryWrapper orderItemQw = new QueryWrapper<>(); orderItemQw.eq("order_id", order.getId()); @@ -1120,48 +1124,63 @@ public class H5OrderService { String appId = WechatPayData.miniProgramAppId; //TODO - String payAmount = order.getPayAmount().multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString(); + int payAmount = order.getPayAmount().multiply(new BigDecimal(100)).intValueExact(); +// String payAmount = order.getPayAmount().multiply(new BigDecimal(100)).stripTrailingZeros().toPlainString(); if (payMangeDev){ - payAmount = "1";//支付一分钱 + payAmount = 1;//支付一分钱 } - String prepayId = wechatPayService.jsapiPay( - String.valueOf(order.getPayId()), + Object order1 = mpWxPayService.createOrder( orderDesc, - Integer.valueOf(payAmount), + "127.0.0.1", + String.valueOf(order.getPayId()), + payAmount, + String.valueOf(order.getPayId()), openId, - member.getId(), - appId + "{}", + WechatPayData.notifyUrl, + String.valueOf(member.getId()) ); -// String prepayId = "TODO"; - log.info("【支付】jsapiPay支付成功,预付单ID:" + prepayId); - OrderPayResponse response = new OrderPayResponse(); - response.setPayType(2); - String nonceStr = WechatPayUtil.generateNonceStr(); - long timeStamp = WechatPayUtil.getCurrentTimestamp(); - prepayId = "prepay_id=" + prepayId; - String signType = "RSA"; - String paySign = null; - String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) - .collect(Collectors.joining("\n", "", "\n")); - //TODO -// paySign = "TODO"; - try { - paySign = WechatPayUtil.getSign(signatureStr, WechatPayData.privateKeyPath); - } catch (Exception e) { - log.error("获取签名失败,"); - throw new RuntimeException("支付失败"); - } - response.setAppId(appId); - response.setTimeStamp(String.valueOf(timeStamp)); - response.setNonceStr(nonceStr); - response.setSignType(signType); - response.setPackage_(prepayId); - response.setPaySign(paySign); - response.setOrderId(order.getId()); - return response; + return order1; + +// String prepayId = wechatPayService.jsapiPay( +// String.valueOf(order.getPayId()), +// orderDesc, +// Integer.valueOf(payAmount), +// openId, +// member.getId(), +// appId +// ); +//// String prepayId = "TODO"; +// +// log.info("【支付】jsapiPay支付成功,预付单ID:" + prepayId); +// OrderPayResponse response = new OrderPayResponse(); +// response.setPayType(2); +// String nonceStr = WechatPayUtil.generateNonceStr(); +// long timeStamp = WechatPayUtil.getCurrentTimestamp(); +// prepayId = "prepay_id=" + prepayId; +// String signType = "RSA"; +// String paySign = null; +// String signatureStr = Stream.of(appId, String.valueOf(timeStamp), nonceStr, prepayId) +// .collect(Collectors.joining("\n", "", "\n")); +// //TODO +//// paySign = "TODO"; +// try { +// paySign = WechatPayUtil.getSign(signatureStr, WechatPayData.privateKeyPath); +// } catch (Exception e) { +// log.error("获取签名失败,"); +// throw new RuntimeException("支付失败"); +// } +// response.setAppId(appId); +// response.setTimeStamp(String.valueOf(timeStamp)); +// response.setNonceStr(nonceStr); +// response.setSignType(signType); +// response.setPackage_(prepayId); +// response.setPaySign(paySign); +// response.setOrderId(order.getId()); +// return response; } diff --git a/ruoyi-mall/src/main/java/com/cyl/wechat/pay/MpWxPayService.java b/ruoyi-mall/src/main/java/com/cyl/wechat/pay/MpWxPayService.java index 46650a5..18bdf29 100644 --- a/ruoyi-mall/src/main/java/com/cyl/wechat/pay/MpWxPayService.java +++ b/ruoyi-mall/src/main/java/com/cyl/wechat/pay/MpWxPayService.java @@ -1,20 +1,29 @@ package com.cyl.wechat.pay; +import com.cyl.h5.pojo.response.OrderPayResponse; import com.cyl.wechat.pay.config.WxPay; import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.File; +import java.util.Map; +@Slf4j @Component public class MpWxPayService { public boolean dev = true; + + @Autowired public WxPay wxPay; + + @Autowired public WxPayService wxPayService; @@ -85,8 +94,8 @@ public class MpWxPayService { * @return */ public Object createOrder(String productName, String clientIp, - String productId, Integer price, String orderNo, - String openId, String body){ + String productId, Integer price, String orderNo, + String openId, String body, String notifyOneUrl, String attach){ WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setDeviceInfo("WEB"); //设备号 request.setTradeType("JSAPI"); //交易类型 @@ -95,19 +104,30 @@ public class MpWxPayService { request.setDetail(productName); //商品详情 request.setTotalFee(price); //总金额|分计 request.setSpbillCreateIp(clientIp); //终端IP - request.setNotifyUrl(wxPay.notifyOneUrl);//设置回调路径 + request.setNotifyUrl(notifyOneUrl);//设置回调路径 request.setProductId(productId); //商品id request.setOpenid(openId); //JSAPI OPENID + request.setAttach(attach); if (dev){ request.setTotalFee(price); - request.setNotifyUrl(wxPay.notifyUrlOneDev); + request.setNotifyUrl(notifyOneUrl); } try { - Object order = wxPayService.createOrder(request); + Object order = wxPayService.createOrder(request); + +// OrderPayResponse response = new OrderPayResponse(); +// response.setPackage_(order.get("packageValue")); +// response.setPayType(2); +// response.setTimeStamp(order.get("timeStamp")); +// response.setPaySign(order.get("paySign")); +// response.setNonceStr(order.get("nonceStr")); +// response.setAppId(order.get("appId")); +// response.setSignType(order.get("signType")); + return order; } catch (WxPayException e) { e.printStackTrace(); - return e.getLocalizedMessage(); + throw new RuntimeException(e.getMessage()); } } @@ -115,9 +135,11 @@ public class MpWxPayService { public WxPayOrderNotifyResult notify(String requestBody){ WxPayOrderNotifyResult notify = null; try { + log.info("微信回调参数:{}", requestBody); notify = wxPayService.parseOrderNotifyResult(requestBody); } catch (WxPayException e) { e.printStackTrace(); + throw new RuntimeException(e.getMessage()); } return notify; }