支付
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.http.*;
|
||||||
import com.wechat.pay.java.core.notification.NotificationParser;
|
import com.wechat.pay.java.core.notification.NotificationParser;
|
||||||
import com.wechat.pay.java.core.util.GsonUtil;
|
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.partnerpayments.h5.model.Transaction;
|
||||||
import com.wechat.pay.java.service.payments.h5.H5Service;
|
import com.wechat.pay.java.service.payments.h5.H5Service;
|
||||||
import com.wechat.pay.java.service.payments.h5.model.*;
|
import com.wechat.pay.java.service.payments.h5.model.*;
|
||||||
@ -54,10 +55,10 @@ public class OrderPayAppService {
|
|||||||
@Resource
|
@Resource
|
||||||
private PaConsumptionService paConsumptionService;
|
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"));
|
List<String> buyTypes = new ArrayList<>(Arrays.asList("1","2","3","4","5","6"));
|
||||||
if (order.getBuyType()==null||!buyTypes.contains(order.getBuyType())) {
|
if (order.getBuyType()==null||!buyTypes.contains(order.getBuyType())) {
|
||||||
return "购买类型错误";
|
throw new RuntimeException("购买类型错误");
|
||||||
}
|
}
|
||||||
// request.setXxx(val)设置所需参数,具体参数可见Request定义
|
// request.setXxx(val)设置所需参数,具体参数可见Request定义
|
||||||
PrepayRequest prepayRequest = new PrepayRequest();
|
PrepayRequest prepayRequest = new PrepayRequest();
|
||||||
@ -67,7 +68,7 @@ public class OrderPayAppService {
|
|||||||
prepayRequest.setAppid(weChatConfig.getAppId());
|
prepayRequest.setAppid(weChatConfig.getAppId());
|
||||||
prepayRequest.setMchid(weChatConfig.getMerchantId());
|
prepayRequest.setMchid(weChatConfig.getMerchantId());
|
||||||
prepayRequest.setDescription("钻石购买");
|
prepayRequest.setDescription("钻石购买");
|
||||||
prepayRequest.setNotifyUrl(weChatConfig.getNotifyUrl());
|
prepayRequest.setNotifyUrl(weChatConfig.notifyUrl);
|
||||||
String tradeNo = WeChatUtil.generateTradeNumber();
|
String tradeNo = WeChatUtil.generateTradeNumber();
|
||||||
prepayRequest.setOutTradeNo(tradeNo);
|
prepayRequest.setOutTradeNo(tradeNo);
|
||||||
SceneInfo sceneInfo = new SceneInfo();
|
SceneInfo sceneInfo = new SceneInfo();
|
||||||
@ -85,8 +86,9 @@ public class OrderPayAppService {
|
|||||||
order.setPayStatus(PayState.TO_BE_PAID);
|
order.setPayStatus(PayState.TO_BE_PAID);
|
||||||
order.setCreateTime(new Date());
|
order.setCreateTime(new Date());
|
||||||
order.setState("t");
|
order.setState("t");
|
||||||
|
order.setH5Url(response.getH5Url());
|
||||||
paOrderService.save(order);
|
paOrderService.save(order);
|
||||||
return response.getH5Url();
|
return order;
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
@ -96,22 +98,30 @@ public class OrderPayAppService {
|
|||||||
|
|
||||||
@Transactional
|
@Transactional
|
||||||
public void payNotify(HttpServletRequest request) throws Exception{
|
public void payNotify(HttpServletRequest request) throws Exception{
|
||||||
|
Logger logger = LoggerFactory.getLogger(getClass()); // 获取日志记录器
|
||||||
Transaction transaction;
|
Transaction transaction;
|
||||||
try {
|
try {
|
||||||
|
System.out.println(request);
|
||||||
|
// 打印请求信息,便于调试
|
||||||
|
logger.info("Received payment notification request: {}", request);
|
||||||
transaction = notificationParser.parse(WeChatUtil.handleNodifyRequestParam(request), Transaction.class);
|
transaction = notificationParser.parse(WeChatUtil.handleNodifyRequestParam(request), Transaction.class);
|
||||||
|
logger.info("Parsed transaction: {}", transaction);
|
||||||
if (transaction.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
|
if (transaction.getTradeState() == Transaction.TradeStateEnum.SUCCESS) {
|
||||||
PaOrder order = paOrderService.getOrderByTradeNo(transaction.getOutTradeNo());
|
PaOrder order = paOrderService.getOrderByTradeNo(transaction.getOutTradeNo());
|
||||||
if (Objects.isNull(order)) {
|
if (Objects.isNull(order)) {
|
||||||
|
logger.warn("Order not found for tradeNo: {}", transaction.getOutTradeNo());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//校验订单状态:若订单已支付则直接返回成功
|
//校验订单状态:若订单已支付则直接返回成功
|
||||||
if (Objects.equals(order.getPayStatus(), PayState.HAVE_TO_PAY)) {
|
if (Objects.equals(order.getPayStatus(), PayState.HAVE_TO_PAY)) {
|
||||||
|
logger.info("Order already paid, skipping further processing. Order ID: {}", order.getId());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//支付成功-修改订单状态
|
//支付成功-修改订单状态
|
||||||
order.setPayStatus(PayState.TO_BE_PAID);
|
order.setPayStatus(PayState.HAVE_TO_PAY);
|
||||||
order.setResult(transaction.getTradeStateDesc());
|
order.setResult(transaction.getTradeStateDesc());
|
||||||
paOrderService.updateById(order);
|
paOrderService.updateById(order);
|
||||||
|
logger.info("Order status updated to HAVE_TO_PAY. Order ID: {}", order.getId());
|
||||||
//支付成功-充值钻石
|
//支付成功-充值钻石
|
||||||
PaVipCurrency currency = new PaVipCurrency();
|
PaVipCurrency currency = new PaVipCurrency();
|
||||||
currency.setState("t");
|
currency.setState("t");
|
||||||
@ -128,6 +138,7 @@ public class OrderPayAppService {
|
|||||||
}else if (order.getBuyType().equals("6")){
|
}else if (order.getBuyType().equals("6")){
|
||||||
currency.setNumerical(100);
|
currency.setNumerical(100);
|
||||||
}else {
|
}else {
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
currency.setUserid(order.getMemberId());
|
currency.setUserid(order.getMemberId());
|
||||||
|
@ -3,6 +3,7 @@ package com.pixelai.api.pa.controller;
|
|||||||
import com.aliyun.core.utils.StringUtils;
|
import com.aliyun.core.utils.StringUtils;
|
||||||
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.base.annotation.SysLog;
|
import com.base.annotation.SysLog;
|
||||||
|
import com.base.annotation.Unsecured;
|
||||||
import com.base.helper.BaseController;
|
import com.base.helper.BaseController;
|
||||||
import com.base.helper.Result;
|
import com.base.helper.Result;
|
||||||
import com.pixelai.api.domain.apy.OrderPayAppService;
|
import com.pixelai.api.domain.apy.OrderPayAppService;
|
||||||
@ -100,18 +101,18 @@ public class PaOrderController extends BaseController {
|
|||||||
@RequestMapping(value = "h5Pay", method = RequestMethod.GET)
|
@RequestMapping(value = "h5Pay", method = RequestMethod.GET)
|
||||||
public Result h5Pay(PaOrder order,HttpServletRequest request) {
|
public Result h5Pay(PaOrder order,HttpServletRequest request) {
|
||||||
// 调用业务逻辑获取支付 URL
|
// 调用业务逻辑获取支付 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<>(false, "支付失败");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 返回成功的结果
|
// 返回成功的结果
|
||||||
return new Result<>(true, h5Url);
|
return new Result<>(true, order1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ApiOperation(value = "h5回调")
|
@ApiOperation(value = "h5回调")
|
||||||
@RequestMapping(value = "payNotify", method = RequestMethod.GET)
|
@PostMapping(value = "payNotify")
|
||||||
|
@Unsecured
|
||||||
public void payNotify(HttpServletRequest request) {
|
public void payNotify(HttpServletRequest request) {
|
||||||
try {
|
try {
|
||||||
payAppService.payNotify(request);
|
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.math.BigDecimal;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
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")
|
@ApiModelProperty(value = "1-5, 2-10, 3-20, 4-30, 5-50, 6-100")
|
||||||
private String buyType;
|
private String buyType;
|
||||||
|
|
||||||
|
@TableField(exist = false)
|
||||||
|
@ApiModelProperty(value = "预下单地址")
|
||||||
|
private String h5Url;
|
||||||
}
|
}
|
||||||
|
@ -43,7 +43,7 @@ public class PaOrderServiceImpl extends ServiceImpl<PaOrderMapper, PaOrder> impl
|
|||||||
@Override
|
@Override
|
||||||
public PaOrder getOrderByTradeNo(String outTradeNo) {
|
public PaOrder getOrderByTradeNo(String outTradeNo) {
|
||||||
QueryWrapper<PaOrder> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<PaOrder> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("out_trade_no", outTradeNo);
|
queryWrapper.eq("order_num", outTradeNo);
|
||||||
queryWrapper.eq("state", "t");
|
queryWrapper.eq("state", "t");
|
||||||
return this.getOne(queryWrapper);
|
return this.getOne(queryWrapper);
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package com.pixelai.utils;
|
|||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStreamReader;
|
import java.io.InputStreamReader;
|
||||||
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.security.PrivateKey;
|
import java.security.PrivateKey;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@ -100,7 +101,6 @@ public class WeChatUtil {
|
|||||||
String signType = request.getHeader("Wechatpay-Signature-Type");
|
String signType = request.getHeader("Wechatpay-Signature-Type");
|
||||||
// 构造 RequestParam
|
// 构造 RequestParam
|
||||||
return new RequestParam.Builder().serialNumber(serial).nonce(nonce).signature(signature).timestamp(timestamp).signType(signType).body(getRequestBody(request)).build();
|
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 {
|
public static String getRequestBody(HttpServletRequest request) throws IOException {
|
||||||
@ -110,7 +110,7 @@ public class WeChatUtil {
|
|||||||
try {
|
try {
|
||||||
stream = request.getInputStream();
|
stream = request.getInputStream();
|
||||||
// 获取响应
|
// 获取响应
|
||||||
reader = new BufferedReader(new InputStreamReader(stream));
|
reader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8));
|
||||||
String line;
|
String line;
|
||||||
while ((line = reader.readLine()) != null) {
|
while ((line = reader.readLine()) != null) {
|
||||||
sb.append(line);
|
sb.append(line);
|
||||||
@ -122,6 +122,8 @@ public class WeChatUtil {
|
|||||||
reader.close();
|
reader.close();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
System.out.println("返回:");
|
||||||
|
System.out.println(sb.toString());
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,3 +77,13 @@ aliyun:
|
|||||||
volcengine:
|
volcengine:
|
||||||
AccessKeyID: AKLTZWYwOWQ4Y2VlZmViNGU4MWI3YzY5NWQ3NTVkNzFjNWU
|
AccessKeyID: AKLTZWYwOWQ4Y2VlZmViNGU4MWI3YzY5NWQ3NTVkNzFjNWU
|
||||||
SecretAccessKey: WVdJeU9XTXlZVE00TXpka05HUmhabUU1TXpjME16RTJPRGsyWkRjM1pUZw==
|
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:
|
wechat:
|
||||||
pay:
|
pay:
|
||||||
merchantId: 1702829541
|
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
|
merchantSerialNumber: 1729D576BA6419FB50FB39436581D6AA98DF931D
|
||||||
apiV3Key: APOsmG7Ry5i2z5264M8d7zfFMs3hY7h1
|
apiV3Key: APOsmG7Ry5i2z5264M8d7zfFMs3hY7h1
|
||||||
appId: wx2a3ff6e1a0e4f093
|
appId: wx2a3ff6e1a0e4f093
|
||||||
addressIp: 8.138.171.103 #120.235.233.15
|
addressIp: 1.12.224.227 #120.235.233.15 8.138.171.103
|
||||||
notifyUrl: http://localhost:8081/paOrder/payNotify #http://localhost:8081/paOrder/payNotify http://8.138.171.103/pixelApi/paOrder/payNotify
|
notifyUrl: http://1.12.224.227/pixelApi/paOrder/payNotify #http://localhost:8081/paOrder/payNotify http://8.138.171.103/pixelApi/paOrder/payNotify
|
||||||
# 静态资源图片路径
|
# 静态资源图片路径
|
||||||
picture:
|
picture:
|
||||||
fail: "https://guojunjie.oss-cn-hangzhou.aliyuncs.com/fail.jpg"
|
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