支付
This commit is contained in:
parent
80dc442528
commit
bb8826c26e
@ -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());
|
||||
|
@ -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 {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
@ -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"
|
||||
|
28
src/main/resources/wechat/apiclient_key.pem
Normal file
28
src/main/resources/wechat/apiclient_key.pem
Normal 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-----
|
Loading…
Reference in New Issue
Block a user