This commit is contained in:
lihongbiao 2025-01-21 17:09:24 +08:00
parent 80dc442528
commit bb8826c26e
8 changed files with 75 additions and 18 deletions

View File

@ -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<String> 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());

View File

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

View File

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

View File

@ -43,7 +43,7 @@ public class PaOrderServiceImpl extends ServiceImpl<PaOrderMapper, PaOrder> impl
@Override
public PaOrder getOrderByTradeNo(String outTradeNo) {
QueryWrapper<PaOrder> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("out_trade_no", outTradeNo);
queryWrapper.eq("order_num", outTradeNo);
queryWrapper.eq("state", "t");
return this.getOne(queryWrapper);
}

View File

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

View File

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

View File

@ -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"

View File

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