diff --git a/src/main/java/com/pixelai/api/domain/apy/OrderPayAppService.java b/src/main/java/com/pixelai/api/domain/apy/OrderPayAppService.java index 3c84e22..76e65c7 100644 --- a/src/main/java/com/pixelai/api/domain/apy/OrderPayAppService.java +++ b/src/main/java/com/pixelai/api/domain/apy/OrderPayAppService.java @@ -14,7 +14,8 @@ import com.wechat.pay.java.core.exception.ValidationException; import com.wechat.pay.java.core.http.*; import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.util.GsonUtil; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.wechat.pay.java.service.partnerpayments.h5.model.Transaction; import com.wechat.pay.java.service.payments.h5.H5Service; import com.wechat.pay.java.service.payments.h5.model.*; @@ -54,10 +55,10 @@ public class OrderPayAppService { @Resource private PaConsumptionService paConsumptionService; - public String h5Pay(PaOrder order,HttpServletRequest request) { + public PaOrder h5Pay(PaOrder order,HttpServletRequest request) { List buyTypes = new ArrayList<>(Arrays.asList("1","2","3","4","5","6")); if (order.getBuyType()==null||!buyTypes.contains(order.getBuyType())) { - return "购买类型错误"; + throw new RuntimeException("购买类型错误"); } // request.setXxx(val)设置所需参数,具体参数可见Request定义 PrepayRequest prepayRequest = new PrepayRequest(); @@ -67,7 +68,7 @@ public class OrderPayAppService { prepayRequest.setAppid(weChatConfig.getAppId()); prepayRequest.setMchid(weChatConfig.getMerchantId()); prepayRequest.setDescription("钻石购买"); - prepayRequest.setNotifyUrl(weChatConfig.getNotifyUrl()); + prepayRequest.setNotifyUrl(weChatConfig.notifyUrl); String tradeNo = WeChatUtil.generateTradeNumber(); prepayRequest.setOutTradeNo(tradeNo); SceneInfo sceneInfo = new SceneInfo(); @@ -85,8 +86,9 @@ public class OrderPayAppService { order.setPayStatus(PayState.TO_BE_PAID); order.setCreateTime(new Date()); order.setState("t"); + order.setH5Url(response.getH5Url()); paOrderService.save(order); - return response.getH5Url(); + return order; } catch (Exception e) { e.printStackTrace(); @@ -96,22 +98,30 @@ public class OrderPayAppService { @Transactional public void payNotify(HttpServletRequest request) throws Exception{ + Logger logger = LoggerFactory.getLogger(getClass()); // 获取日志记录器 Transaction transaction; try { + System.out.println(request); + // 打印请求信息,便于调试 + logger.info("Received payment notification request: {}", request); transaction = notificationParser.parse(WeChatUtil.handleNodifyRequestParam(request), Transaction.class); + logger.info("Parsed transaction: {}", transaction); if (transaction.getTradeState() == Transaction.TradeStateEnum.SUCCESS) { PaOrder order = paOrderService.getOrderByTradeNo(transaction.getOutTradeNo()); if (Objects.isNull(order)) { + logger.warn("Order not found for tradeNo: {}", transaction.getOutTradeNo()); return; } //校验订单状态:若订单已支付则直接返回成功 if (Objects.equals(order.getPayStatus(), PayState.HAVE_TO_PAY)) { + logger.info("Order already paid, skipping further processing. Order ID: {}", order.getId()); return; } //支付成功-修改订单状态 - order.setPayStatus(PayState.TO_BE_PAID); + order.setPayStatus(PayState.HAVE_TO_PAY); order.setResult(transaction.getTradeStateDesc()); paOrderService.updateById(order); + logger.info("Order status updated to HAVE_TO_PAY. Order ID: {}", order.getId()); //支付成功-充值钻石 PaVipCurrency currency = new PaVipCurrency(); currency.setState("t"); @@ -128,6 +138,7 @@ public class OrderPayAppService { }else if (order.getBuyType().equals("6")){ currency.setNumerical(100); }else { + return; } currency.setUserid(order.getMemberId()); diff --git a/src/main/java/com/pixelai/api/pa/controller/PaOrderController.java b/src/main/java/com/pixelai/api/pa/controller/PaOrderController.java index 05443ba..96c6a4d 100644 --- a/src/main/java/com/pixelai/api/pa/controller/PaOrderController.java +++ b/src/main/java/com/pixelai/api/pa/controller/PaOrderController.java @@ -3,6 +3,7 @@ package com.pixelai.api.pa.controller; import com.aliyun.core.utils.StringUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.base.annotation.SysLog; +import com.base.annotation.Unsecured; import com.base.helper.BaseController; import com.base.helper.Result; import com.pixelai.api.domain.apy.OrderPayAppService; @@ -100,18 +101,18 @@ public class PaOrderController extends BaseController { @RequestMapping(value = "h5Pay", method = RequestMethod.GET) public Result h5Pay(PaOrder order,HttpServletRequest request) { // 调用业务逻辑获取支付 URL - String h5Url = payAppService.h5Pay(order,request); + PaOrder order1 = payAppService.h5Pay(order,request); // 如果没有获取到支付链接,返回失败的结果 - if (StringUtils.isBlank(h5Url)) { + if (StringUtils.isBlank(order1.getH5Url())) { return new Result<>(false, "支付失败"); } - // 返回成功的结果 - return new Result<>(true, h5Url); + return new Result<>(true, order1); } @ApiOperation(value = "h5回调") - @RequestMapping(value = "payNotify", method = RequestMethod.GET) + @PostMapping(value = "payNotify") + @Unsecured public void payNotify(HttpServletRequest request) { try { payAppService.payNotify(request); @@ -120,6 +121,5 @@ public class PaOrderController extends BaseController { } } - } diff --git a/src/main/java/com/pixelai/api/pa/entity/PaOrder.java b/src/main/java/com/pixelai/api/pa/entity/PaOrder.java index 558d55f..a1ad019 100644 --- a/src/main/java/com/pixelai/api/pa/entity/PaOrder.java +++ b/src/main/java/com/pixelai/api/pa/entity/PaOrder.java @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.annotation.IdType; import java.math.BigDecimal; import java.time.LocalDateTime; + +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import java.io.Serializable; import java.util.Date; @@ -66,4 +68,8 @@ public class PaOrder implements Serializable { @ApiModelProperty(value = "1-5, 2-10, 3-20, 4-30, 5-50, 6-100") private String buyType; + + @TableField(exist = false) + @ApiModelProperty(value = "预下单地址") + private String h5Url; } diff --git a/src/main/java/com/pixelai/api/pa/service/impl/PaOrderServiceImpl.java b/src/main/java/com/pixelai/api/pa/service/impl/PaOrderServiceImpl.java index 76f99ac..c425e09 100644 --- a/src/main/java/com/pixelai/api/pa/service/impl/PaOrderServiceImpl.java +++ b/src/main/java/com/pixelai/api/pa/service/impl/PaOrderServiceImpl.java @@ -43,7 +43,7 @@ public class PaOrderServiceImpl extends ServiceImpl impl @Override public PaOrder getOrderByTradeNo(String outTradeNo) { QueryWrapper queryWrapper = new QueryWrapper<>(); - queryWrapper.eq("out_trade_no", outTradeNo); + queryWrapper.eq("order_num", outTradeNo); queryWrapper.eq("state", "t"); return this.getOne(queryWrapper); } diff --git a/src/main/java/com/pixelai/utils/WeChatUtil.java b/src/main/java/com/pixelai/utils/WeChatUtil.java index ed8e858..91f0c7a 100644 --- a/src/main/java/com/pixelai/utils/WeChatUtil.java +++ b/src/main/java/com/pixelai/utils/WeChatUtil.java @@ -3,6 +3,7 @@ package com.pixelai.utils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; import java.security.PrivateKey; import java.security.SecureRandom; import java.util.Date; @@ -100,7 +101,6 @@ public class WeChatUtil { String signType = request.getHeader("Wechatpay-Signature-Type"); // 构造 RequestParam return new RequestParam.Builder().serialNumber(serial).nonce(nonce).signature(signature).timestamp(timestamp).signType(signType).body(getRequestBody(request)).build(); - } public static String getRequestBody(HttpServletRequest request) throws IOException { @@ -110,7 +110,7 @@ public class WeChatUtil { try { stream = request.getInputStream(); // 获取响应 - reader = new BufferedReader(new InputStreamReader(stream)); + reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); String line; while ((line = reader.readLine()) != null) { sb.append(line); @@ -122,6 +122,8 @@ public class WeChatUtil { reader.close(); } } + System.out.println("返回:"); + System.out.println(sb.toString()); return sb.toString(); } } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 86ee2da..4b5f80f 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -77,3 +77,13 @@ aliyun: volcengine: AccessKeyID: AKLTZWYwOWQ4Y2VlZmViNGU4MWI3YzY5NWQ3NTVkNzFjNWU SecretAccessKey: WVdJeU9XTXlZVE00TXpka05HUmhabUU1TXpjME16RTJPRGsyWkRjM1pUZw== + +wechat: + pay: + merchantId: 1702829541 + privateKeyPath: src/main/resources/wechat/apiclient_key.pem # D:\chromeDown\WXCertUtil\cert\apiclient_key.pem D:\cert\apiclient_key.pem + merchantSerialNumber: 1729D576BA6419FB50FB39436581D6AA98DF931D + apiV3Key: APOsmG7Ry5i2z5264M8d7zfFMs3hY7h1 + appId: wx2a3ff6e1a0e4f093 + addressIp: 1.12.224.227 #120.235.233.15 + notifyUrl: http://www.ylemai.cn/pixelApi/paOrder/payNotify #http://localhost:8081/paOrder/payNotify http://8.138.171.103/pixelApi/paOrder/payNotify \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bc87d5e..0ef7c29 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -97,12 +97,12 @@ ip: "http:\\8.138.171.103\\" wechat: pay: merchantId: 1702829541 - privateKeyPath: D:\chromeDown\WXCertUtil\cert\apiclient_key.pem # D:\chromeDown\WXCertUtil\cert\apiclient_key.pem D:\cert\apiclient_key.pem + privateKeyPath: src/main/resources/wechat/apiclient_key.pem # D:\chromeDown\WXCertUtil\cert\apiclient_key.pem D:\cert\apiclient_key.pem merchantSerialNumber: 1729D576BA6419FB50FB39436581D6AA98DF931D apiV3Key: APOsmG7Ry5i2z5264M8d7zfFMs3hY7h1 appId: wx2a3ff6e1a0e4f093 - addressIp: 8.138.171.103 #120.235.233.15 - notifyUrl: http://localhost:8081/paOrder/payNotify #http://localhost:8081/paOrder/payNotify http://8.138.171.103/pixelApi/paOrder/payNotify + addressIp: 1.12.224.227 #120.235.233.15 8.138.171.103 + notifyUrl: http://1.12.224.227/pixelApi/paOrder/payNotify #http://localhost:8081/paOrder/payNotify http://8.138.171.103/pixelApi/paOrder/payNotify # 静态资源图片路径 picture: fail: "https://guojunjie.oss-cn-hangzhou.aliyuncs.com/fail.jpg" diff --git a/src/main/resources/wechat/apiclient_key.pem b/src/main/resources/wechat/apiclient_key.pem new file mode 100644 index 0000000..0b22c0f --- /dev/null +++ b/src/main/resources/wechat/apiclient_key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCjLt/LFkoVBu5+ +eTM3+Pk3lGDqO/IYmIgsYf1HYwSGWpzaL1qf4MUFGhiOgkXgbI7p62miczj0GHaP +fQnHkKcNHbM+RacL81aU8v7iuB+V6SjyfdHC5wXEkBYqIerV5dInHPMG/R8HmTwT +IfEE0Ef8xqg/C83h6wualat4wK/YQ8huNAaCU/BFVk0PF8F7xQKJ5/rXu0Nkwdib +R9IorNYwdKRTV8am5NOhkZoj5Tg3jSLGz68Fu1DXMuvC0gqWkRHplXFdaTcm7gvP +iNVOtib4nKm1vGt7Zz8T/kxoXtpdZddBiYZHT7Sc5dHyPg+iEUhL9qwHy6yfbIdM +AKmEQdBnAgMBAAECggEAMHBzohdlukQqe4SCvbS8VdFHy4Ar5z0v/uy/gHdWGoO/ +V80Cu76+/Tq322W0VGAlNC7bVouZdmvklcdqJcE8tVoBoRSP964uH1zaaHZ7ecaS +jxjmMVLelXCoA625xfDIpy+ivIpasai8+njy0Jj7JX/a5Ywde1iIQ0T2d4vLJwjO +fnLSDDwPlGU42mWTbjGLDob2RJyWYYcXAIS3rbMxW5xQdpezrcHVpRXU0aD6Pjhi +Q5gETL1p+mzEmY733i4MtzGC4w2g2iA+mngbzWz7JcnIavG2Fq5T+/K2oBM3MQNM +Otqox/pAQZCUtXdWPpFgdoOubD6GxRcOI8dYhL/VIQKBgQDU6sSaq+JcJs8WTtQw +aBfnR8XvN6mAGmCdvQHe+qc8FDnsO5rvwm6hTo7B5DhaiNd7jNex3KUWIKgh2dt7 +QdVuVRBgPG8ZBCaaPthRIkXhBDwzBIODbgZnxiemvpLhBduVhibe5/7rDqYdKYvO +Rab6HMXMBcRWhiLKDd1YY9JVCQKBgQDEM9ttAhQLi+xx11AzrPE6hhZMAYP42OAG +hqLnfSZu/XDobYilcnTV/KQFO/DSbb9ORS07jTuDYWsWd1oT4dPXGGzTlrgct8er +vvlw95tm17QnW9fowfhmhpJsCq1gD15J3MWW/mxx6uECNl1ohjAMjCVcjEslTzDM +p4YjkXFF7wKBgEibitIoHXhJb8NuvGOJi+U+D5zFQZNC64G/K70rgw4044/Qv8RV +bL6reHlcZ29QTRN/8ypfURjbqBprHbLJv4vxjDUVRtmkFbnyBniclHHorNLFDkgq +pBqNc4YkZRhBlCFIb0cCnGbyRumY+mksTYXre/RYXx0WfxSiZ8I1wEtpAoGAEEGT +rqZ7brF7N7t1Q7LSkdzGQCnn+1hMx32kRbXS12NcVYWtyrd/ArPaCyz6ORUqwpts +sgBzq+EIdGYTKo6NdMbrTWSxgH+hpZM/K6L4Vz8MCC7N5tUbdbM0sor37nuXflsy +a95MseuaFQrYFm730DJUbiSZnU/AZVSEArJsRjUCgYB4VrfN8Hzbh8+94E4Q4c3r +dr6vMgG5T6Q+nLa2/9Z6BvDHdhni5C/kR2Azm40Sau1MjJoYGM0ArJyt3ymjIBnh +nme25Nd+b1hr3kOdgxYEXiJfFpQj+PX3zTRPP0Vncp8bgz/x/x6DOkpZ0IMkQfKv +i2v7N6/XC8OmYemwVRKTKA== +-----END PRIVATE KEY-----