From ff9623fe8e994925c2dc73b804382b7986653104 Mon Sep 17 00:00:00 2001 From: GYJ <1157756119@qq.com> Date: Thu, 1 Aug 2024 11:00:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../pay/controller/ThirdPayController.java | 25 ++-- .../app/ApiWeiXinPayController.java | 34 +++++ .../sqx/modules/pay/service/WxService.java | 4 +- .../pay/service/impl/WxServiceImpl.java | 129 ++++++++++++++++-- .../modules/yskPay/utils/RequestWrapper.java | 84 ++++++++++++ 6 files changed, 253 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/sqx/modules/yskPay/utils/RequestWrapper.java diff --git a/.gitignore b/.gitignore index b83d222..58da1f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target/ +/logs/ diff --git a/src/main/java/com/sqx/modules/pay/controller/ThirdPayController.java b/src/main/java/com/sqx/modules/pay/controller/ThirdPayController.java index cb516a7..a11725f 100644 --- a/src/main/java/com/sqx/modules/pay/controller/ThirdPayController.java +++ b/src/main/java/com/sqx/modules/pay/controller/ThirdPayController.java @@ -2,6 +2,7 @@ package com.sqx.modules.pay.controller; import com.sqx.common.utils.Result; import com.sqx.modules.app.annotation.Login; +import com.sqx.modules.common.service.CommonInfoService; import com.sqx.modules.yskPay.resp.PublicResp; import com.sqx.modules.yskPay.resp.WxScanPayResp; import com.sqx.modules.yskPay.service.ThirdPayService; @@ -25,22 +26,30 @@ import java.math.BigDecimal; public class ThirdPayController { final private ThirdPayService thirdPayService; - public ThirdPayController(ThirdPayService thirdPayService) { + private final CommonInfoService commonRepository; + + public ThirdPayController(ThirdPayService thirdPayService, CommonInfoService commonRepository) { this.thirdPayService = thirdPayService; + this.commonRepository = commonRepository; } // @Login @ApiOperation("微信支付宝支付订单") @PostMapping("/wxPayJsApiOrder") -// public Result wxPayJsApiOrder(@RequestAttribute("userId") Long userId, Long parentId, Integer type, Long addressId, Integer orderType) throws Exception { - public Result wxPayJsApiOrder() { + public Result wxPayJsApiOrder(@RequestAttribute("userId") Long userId, Long parentId, Integer type, Long addressId, Integer orderType) throws Exception { +// public Result wxPayJsApiOrder() { - PublicResp scanpay = thirdPayService.scanpay("https://paymentapi.sxczgkj.cn", "66691a6afdf641f0bf1dc701", + String thirdPayUrl = commonRepository.findOne(421).getValue(); + String thirdUserAppId = commonRepository.findOne(422).getValue(); + String thirdUserStoreId = commonRepository.findOne(424).getValue(); + String thirdUserKey = commonRepository.findOne(423).getValue(); + String userWxAppId = commonRepository.findOne(45).getValue(); + + PublicResp scanpay = thirdPayService.scanpay(thirdPayUrl, thirdUserAppId, "外卖订单", "外卖订单", 1L, - "WECHAT", "wxd88fffa983758a30", "or1l869Gqm3jUeqbmuL1TFKK4XrM", "1.80.169.5", - "202407310944110001", "S2406120331", - "https://paymentapi.sxczgkj.cn", null, - "jikd52TefZcSPI5hRWrfPSpQcXZrbqshbnLmqH6UattqspIDEzjbGvZmfwTW58RMf1XuPhN4zE1GbIjKy3b1oabgOx5n79faT93Si6i7g2IPSQJAln2NNsCSNynHIJ8p"); + "WECHAT", userWxAppId, "o5Fun5ff9AWRjL2K0_sRTjMJHCPQ", "1.80.169.5", + "202407310944110003", thirdUserStoreId, + "https://paymentapi.sxczgkj.cn", null, thirdUserKey); System.out.println(scanpay); diff --git a/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java b/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java index 06f0a26..77d04fe 100644 --- a/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java +++ b/src/main/java/com/sqx/modules/pay/controller/app/ApiWeiXinPayController.java @@ -1,9 +1,14 @@ package com.sqx.modules.pay.controller.app; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import com.sqx.common.utils.Result; import com.sqx.modules.app.annotation.Login; import com.sqx.modules.pay.dao.PayDetailsDao; import com.sqx.modules.pay.service.WxService; +import com.sqx.modules.yskPay.utils.RequestWrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; @@ -19,6 +24,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigDecimal; +import java.util.Map; /** * @author fang @@ -93,6 +99,22 @@ public class ApiWeiXinPayController { return notify(2,request); } + @PostMapping("/thirdPayNotify") + @ApiOperation("用户端支付回调") + public String thirdPayNotify(HttpServletRequest request) { + Map map = getParameterMap(request); + log.info("支付回调返回信息:{}", JSONUtil.toJsonStr(map)); + if (map != null && !map.isEmpty() && map.containsKey("code") && "000000".equals(map.get("code") + "")) { + JSONObject object = JSONUtil.parseObj(map.get("bizData")); + if (object.containsKey("state") && "TRADE_SUCCESS".equals(object.getStr("state"))) { +// String tradeNo=object.get("payOrderId").toString(); + String orderNo = object.getStr("mchOrderNo"); + return wxService.thirdPayBack(orderNo); + } + } + return null; + } + @PostMapping("/notifyShop") @ApiOperation("商户端app微信回调") public String notifyShop(HttpServletRequest request) { @@ -184,4 +206,16 @@ public class ApiWeiXinPayController { } } + + private Map getParameterMap(HttpServletRequest request) { + RequestWrapper requestWrapper = new RequestWrapper(request); + String body = requestWrapper.getBody(); + if (StrUtil.isNotEmpty(body)) { + return JSONUtil.toBean(body, Map.class); + }else { + Map parameterMap = request.getParameterMap(); + return parameterMap; + } + } + } diff --git a/src/main/java/com/sqx/modules/pay/service/WxService.java b/src/main/java/com/sqx/modules/pay/service/WxService.java index c963f1e..1b96ffc 100644 --- a/src/main/java/com/sqx/modules/pay/service/WxService.java +++ b/src/main/java/com/sqx/modules/pay/service/WxService.java @@ -20,6 +20,8 @@ public interface WxService { String payBackShop(String resXml, Integer type); + String thirdPayBack(String orderNo); + boolean wxRefund(PayDetails payDetails); Result balanceOrder(Long userId,Long parentId, Integer orderType, Long addressId); @@ -34,4 +36,4 @@ public interface WxService { void notifyRider(PayDetails payDetails); -} \ No newline at end of file +} diff --git a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java index 0de4706..b071dc5 100644 --- a/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java +++ b/src/main/java/com/sqx/modules/pay/service/impl/WxServiceImpl.java @@ -1,7 +1,9 @@ package com.sqx.modules.pay.service.impl; +import cn.hutool.core.util.ObjectUtil; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.wxpay.sdk.WXPay; import com.github.wxpay.sdk.WXPayConstants; import com.github.wxpay.sdk.WXPayUtil; @@ -50,6 +52,9 @@ import com.sqx.modules.utils.AmountCalUtils; import com.sqx.modules.utils.MD5Util; import com.sqx.modules.utils.SenInfoCheckUtil; import com.sqx.modules.utils.WXConfigUtil; +import com.sqx.modules.yskPay.resp.PublicResp; +import com.sqx.modules.yskPay.resp.WxScanPayResp; +import com.sqx.modules.yskPay.service.ThirdPayService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.gavaghan.geodesy.Ellipsoid; @@ -126,6 +131,9 @@ public class WxServiceImpl implements WxService { @Autowired private ShopMessageService shopMessageService; + @Autowired + private ThirdPayService thirdPayService; + private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock(true); private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @@ -426,7 +434,7 @@ public class WxServiceImpl implements WxService { if (type == 4 || type == 5) { return aliPayController.payVip(Double.valueOf(one.getValue()), type, userId, generalOrder, 4); } - return pay(Double.valueOf(one.getValue()), type, userId, generalOrder, 4); + return pay2(Double.valueOf(one.getValue()), type, userId, generalOrder, 4); } @Transactional @@ -474,7 +482,7 @@ public class WxServiceImpl implements WxService { if (type == 4 || type == 5) { return aliPayController.aliPayMoney(money.doubleValue(), type, userId, generalOrder, 2); } - return pay(money.doubleValue(), type, userId, generalOrder, 2); + return pay2(money.doubleValue(), type, userId, generalOrder, 2); } @Override @@ -597,20 +605,97 @@ public class WxServiceImpl implements WxService { return aliPayController.payAppOrders(payMoney.doubleValue(), type, tbOrder2.getUserId(), generalOrder, 1); } appOrderDao.updateById(tbOrder1); - return pay(payMoney.doubleValue(), type, tbOrder2.getUserId(), generalOrder, 1); + return pay2(payMoney.doubleValue(), type, tbOrder2.getUserId(), generalOrder, 1); } - /** - * 微信支付订单生成 - * - * @param moneys 支付金额 带小数点 - * @param type 类型 1app 2 二维码支付 3小程序 公众号支付 - * @param userId 用户id - * @param outTradeNo 单号 - * @param classify 支付类型 1支付订单 2充值 - * @return - * @throws Exception - */ + private Result pay2(Double moneys, Integer type, Long userId, String outTradeNo, Integer classify) throws Exception { + //h5服务域名配置 + CommonInfo oneu = commonInfoService.findOne(19); + + String notifyUrl = oneu.getValue() + "/sqx_fast/app/wxPay/thirdPayNotify"; + + String body = ""; + if (classify == 1) { + //订单类型 + body = "下单支付"; + } else if (classify == 2) { + body = "充值余额"; + } else if (classify == 4) { + body = "购买会员"; + } + Double mul = AmountCalUtils.mul(moneys, 100); + + String openId; + UserEntity userEntity = userService.queryByUserId(userId); + if (type == 2) { + openId = userEntity.getWxOpenId(); + } else { + openId = userEntity.getOpenId(); + } + + String thirdPayUrl = commonInfoService.findOne(421).getValue(); + String thirdUserAppId = commonInfoService.findOne(422).getValue(); + String thirdUserStoreId = commonInfoService.findOne(424).getValue(); + String thirdUserKey = commonInfoService.findOne(423).getValue(); + String userWxAppId = commonInfoService.findOne(45).getValue(); + + PublicResp scanpay = thirdPayService.scanpay(thirdPayUrl, thirdUserAppId, + body, body, mul.longValue(), + "WECHAT", userWxAppId, openId, "127.0.0.1", + outTradeNo, thirdUserStoreId, + notifyUrl, null, thirdUserKey); + + if (scanpay != null) { + if ("000000".equals(scanpay.getCode())) { + WxScanPayResp wxScanPayResp = scanpay.getObjData(); + if ("TRADE_AWAIT".equals(wxScanPayResp.getState())) { + PayDetails payDetails = payDetailsDao.selectByOrderId(outTradeNo); + if (payDetails == null) { + String money = String.valueOf(mul.intValue()); + payDetails = new PayDetails(); + payDetails.setState(0); + payDetails.setCreateTime(sdf.format(new Date())); + payDetails.setOrderId(outTradeNo); + payDetails.setUserId(userId); + payDetails.setMoney(AmountCalUtils.divide(Double.parseDouble(money), 100)); + payDetails.setClassify(classify); + payDetails.setType(type); + payDetailsDao.insert(payDetails); + } + + String payInfo = wxScanPayResp.getPayInfo(); + JSONObject jsonObj = JSONObject.parseObject(payInfo); + Map param = new HashMap<>(); + param.put("appid", jsonObj.getString("appid")); + param.put("partnerid", ""); + param.put("prepayid", ""); + param.put("package", jsonObj.getString("package")); + param.put("noncestr", jsonObj.getString("nonceStr")); + param.put("timestamp", jsonObj.getString("timeStamp")); + param.put("sign", jsonObj.getString("paySign")); + param.put("outtradeno", jsonObj.getString("tradeNo")); + param.put("signType", jsonObj.getString("signType")); + return Result.success().put("data", param); + } else { + return Result.error(scanpay.getMsg()); + } + } + } + + return Result.error("支付失败"); + } + + /** + * 微信支付订单生成 + * + * @param moneys 支付金额 带小数点 + * @param type 类型 1app 2 二维码支付 3小程序 公众号支付 + * @param userId 用户id + * @param outTradeNo 单号 + * @param classify 支付类型 1支付订单 2充值 + * @return + * @throws Exception + */ private Result pay(Double moneys, Integer type, Long userId, String outTradeNo, Integer classify) throws Exception { //h5服务域名配置 CommonInfo oneu = commonInfoService.findOne(19); @@ -996,6 +1081,20 @@ public class WxServiceImpl implements WxService { return xmlBack; } + @Override + public String thirdPayBack(String orderNo) { + PayDetails payDetails = payDetailsDao.selectByOrderId(orderNo); + //设置查询条件 + if (payDetails.getState() == 0) { + payDetailsDao.updateState(payDetails.getId(), 1, sdf.format(new Date()), ""); + //调用处理接口 + //业务操作 + notfiy(payDetails); + + } + return "SUCCESS"; + } + public String getGeneralOrder() { Date date = new Date(); @@ -1433,4 +1532,4 @@ public class WxServiceImpl implements WxService { } -} \ No newline at end of file +} diff --git a/src/main/java/com/sqx/modules/yskPay/utils/RequestWrapper.java b/src/main/java/com/sqx/modules/yskPay/utils/RequestWrapper.java new file mode 100644 index 0000000..c483625 --- /dev/null +++ b/src/main/java/com/sqx/modules/yskPay/utils/RequestWrapper.java @@ -0,0 +1,84 @@ +package com.sqx.modules.yskPay.utils; + +import javax.servlet.ReadListener; +import javax.servlet.ServletInputStream; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import java.io.*; + +public class RequestWrapper extends HttpServletRequestWrapper { + private final String body; + + public RequestWrapper(HttpServletRequest request) { + super(request); + StringBuilder stringBuilder = new StringBuilder(); + BufferedReader bufferedReader = null; + InputStream inputStream = null; + try { + inputStream = request.getInputStream(); + if (inputStream != null) { + bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); + char[] charBuffer = new char[128]; + int bytesRead = -1; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } else { + stringBuilder.append(""); + } + } catch (IOException ex) { + ex.printStackTrace(); + } finally { + if (inputStream != null) { + try { + inputStream.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + if (bufferedReader != null) { + try { + bufferedReader.close(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + } + body = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() throws IOException { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes()); + ServletInputStream servletInputStream = new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + @Override + public boolean isReady() { + return false; + } + @Override + public void setReadListener(ReadListener readListener) { + } + @Override + public int read() throws IOException { + return byteArrayInputStream.read(); + } + }; + return servletInputStream; + + } + + @Override + public BufferedReader getReader() throws IOException { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } + + public String getBody() { + return this.body; + } +}