This commit is contained in:
777
2025-11-15 13:08:29 +08:00
parent db39c5249e
commit 0c41fdf89d
31 changed files with 1582 additions and 11 deletions

View File

@@ -14,7 +14,6 @@ import com.ijpay.core.kit.HttpKit;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApi;
import com.ijpay.wxpay.model.UnifiedOrderModel;
import com.ruoyi.cai.domain.OrderLogs;
import com.ruoyi.cai.domain.PayConfig;
import com.ruoyi.cai.domain.PayTrdConfig;
import com.ruoyi.cai.dto.app.vo.pay.OrderPayStatusResp;
@@ -24,24 +23,36 @@ import com.ruoyi.cai.pay.*;
import com.ruoyi.cai.service.OrderLogsService;
import com.ruoyi.cai.service.PayTrdConfigService;
import com.ruoyi.cai.trdpay.TrdPayManager;
import com.ruoyi.cai.trdpay.TrdPayProperties;
import com.ruoyi.cai.trdpay.TrdPayTypeEnum;
import com.ruoyi.cai.trdpay.V14Manager;
import com.ruoyi.cai.trdpay.dto.NotifyResp;
import com.ruoyi.cai.trdpay.dto.extend.V14ExtendMapDTO;
import com.ruoyi.cai.trdpay.dto.v14.V14Token;
import com.ruoyi.cai.trdpay.dto.v14.wechatJSAPI.WechatJSAPIResponse;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.helper.LoginHelper;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.sun.org.apache.bcel.internal.generic.RETURN;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
@@ -126,6 +137,82 @@ public class PayController {
}
}
@Autowired
private V14Manager v14Manager;
@PostMapping(value = "/efps/wx")
@Operation(summary = "微信支付efps")
@Log(title = "微信支付efps", businessType = BusinessType.OTHER, isSaveDb = true)
@SaIgnore
public R<WechatJSAPIResponse> efpsWx(HttpServletRequest request, @RequestBody V14PayDTO payDTO){
String efpsToken = request.getHeader("Efps-Token");
if(StringUtils.isBlank(efpsToken)){
return R.fail(600,"支付失败,鉴权失败或者未找到订单");
}
V14Token v14Token = v14Manager.checkToken(efpsToken);
if(v14Token == null){
return R.fail(600,"支付失败,鉴权失败或者未找到订单");
}
PayTrdConfig payTrdConfig = payTrdConfigService.getById(v14Token.getPayTrdConfigId());
if(payTrdConfig == null){
return R.fail(600,"支付失败,未找到支付通道信息");
}
PayOrderInfoDTO payOrderInfo = payManager.getOrderInfo(v14Token.getOrderNo());
if(payOrderInfo == null){
return R.fail(600,"支付失败,未找到订单");
}
try {
V14ExtendMapDTO extendMap = JSON.parseObject(payTrdConfig.getExtendData(), V14ExtendMapDTO.class);
String openId = getOpenIdByCode(payDTO.getWx_code(), extendMap.getMinAppId(), extendMap.getMinSecret());
payOrderInfo.setOpenId(openId);
} catch (IOException e) {
log.error("获取openid失败",e);
return R.fail(600,"微信登录失败");
}
WechatJSAPIResponse pay = v14Manager.pay(payOrderInfo, payTrdConfig);
return R.ok(pay);
}
public String getOpenIdByCode(String code,String appId,String secret) throws IOException {
String url = "https://api.weixin.qq.com/sns/jscode2session";
url += "?appid="+appId;//自己的appid
url += "&secret="+secret;//自己的appSecret
url += "&js_code=" + code;
url += "&grant_type=authorization_code";
url += "&connect_redirect=1";
String res = null;
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
// DefaultHttpClient();
HttpGet httpget = new HttpGet(url); //GET方式
CloseableHttpResponse response = null;
// 配置信息
RequestConfig requestConfig = RequestConfig.custom() // 设置连接超时时间(单位毫秒)
.setConnectTimeout(5000) // 设置请求超时时间(单位毫秒)
.setConnectionRequestTimeout(5000) // socket读写超时时间(单位毫秒)
.setSocketTimeout(5000) // 设置是否允许重定向(默认为true)
.setRedirectsEnabled(false).build(); // 将上面的配置信息 运用到这个Get请求里
httpget.setConfig(requestConfig); // 由客户端执行(发送)Get请求
response = httpClient.execute(httpget); // 从响应模型中获取响应实体
HttpEntity responseEntity = response.getEntity();
log.info("获取openId 响应状态为: {}", response.getStatusLine());
if (responseEntity != null) {
res = EntityUtils.toString(responseEntity);
log.info("获取openId url:{}, res:{}", url,res);
}
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
JSONObject jo = JSON.parseObject(res);
return jo.getString("openid");
}
@PostMapping(value = "/merge/ali")
@Operation(summary = "支付宝聚合支付")
@Log(title = "支付宝聚合支付", businessType = BusinessType.OTHER, isSaveDb = true)
@@ -348,7 +435,7 @@ public class PayController {
@Operation(hidden = true)
@Log(title = "第三方微信支付回调", businessType = BusinessType.OTHER, isSaveDb = false)
@SaIgnore
public String trdWxNotifyUrl(HttpServletRequest request,@PathVariable("type") String type) {
public String trdWxNotifyUrl(HttpServletRequest request, HttpServletResponse response, @PathVariable("type") String type) {
try {
if(type == null){
log.error("收到第三方微信支付回调,支付类型为空");
@@ -359,6 +446,22 @@ public class PayController {
log.error("收到第三方微信支付回调,未找到支付类型 type={}",type);
return "failure";
}
if(trdPayTypeEnum == TrdPayTypeEnum.V14){
try {
JSONObject jsonObject = v14Manager.notifyDeal(request);
PrintWriter writer = response.getWriter();
writer.print(jsonObject.toJSONString());
writer.close();
}catch (Exception e){
log.error("v14微信支付回调异常",e);
JSONObject jsonObject = new JSONObject();
jsonObject.put("returnCode", "0001");
PrintWriter writer = response.getWriter();
writer.print(jsonObject.toJSONString());
writer.close();
}
return null;
}
Map<String, String> params = AliPayApi.toMap(request);
log.info("收到第三方微信支付回调 {}:{}",trdPayTypeEnum.name(), JSON.toJSONString(params));
NotifyResp notifyResp = trdPayManager.getNotifyResp(params, trdPayTypeEnum);

View File

@@ -20,7 +20,7 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://124.222.254.188:4306/cai_wanyan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
url: jdbc:mysql://124.222.254.188:4306/cai_v6?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
username: root
password: tyYrk487R4y7FENM
# 从库数据源

View File

@@ -0,0 +1,25 @@
-----BEGIN CERTIFICATE-----
MIIEIjCCAwqgAwIBAgIUJciVbai01yHdyTuMJ3UAOf6uWPQwDQYJKoZIhvcNAQEL
BQAwgZYxCzAJBgNVBAYTAkNOMTkwNwYDVQQKDDDljJfkuqzlpKnlqIHor5rkv6Hn
lLXlrZDllYbliqHmnI3liqHmnInpmZDlhazlj7gxFTATBgNVBAsMDOS8geS4muiv
geS5pjE1MDMGA1UEAwws5aSp5aiB6K+a5L+h5pWw5a2X6K6k6K+B5Lit5b+D5LyB
5Lia6K+B5LmmQ0EwHhcNMTgwMTExMDgwNjE4WhcNMTkwMTExMDgwNjE4WjCBjDE5
MDcGA1UECgww5YyX5Lqs5aSp5aiB6K+a5L+h55S15a2Q5ZWG5Yqh5pyN5Yqh5pyJ
6ZmQ5YWs5Y+4MRgwFgYDVQQLDA/ov5Dnu7TmlK/mjIHpg6gxNTAzBgNVBAMMLOaY
k+elqOiBlOaUr+S7mOaciemZkOWFrOWPuC1FRlBT5ZWG5oi36Zeo5oi3MIIBIjAN
BgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAptTghT1nY9twX4VKrvJigGB/klcs
P8tH+9aV5TofKskh8PQg8neTSprPMmEsidFGMJ26a4x/E88nJ6wMHAZqeWP0x64/
GLtIff8r+WZjqBYP9WNiW71NcAsoJEBrlLlLrc5W/9mC+3z0oWYiz+LB9E+uMeCV
3ocHP42Z6oGeCV6jSe1Sx2UBsCEROYh1nTnZQ13pHIghqO1Fc5MZTcTW5k3zviuF
L7IJYUW79AIzh9SttcMbUZqGWkf808Ux3BhZzgUTL0g76fpCRjPilmlCJ/NdyGJ4
8E0IfMXHeTq3uiEjnO2nzsEV4zvhNoii0F2iH+fgMXBDwGd9O3mLv23gIQIDAQAB
o3AwbjAJBgNVHRMEAjAAMAsGA1UdDwQEAwIFoDBUBgNVHR8ETTBLMEmgR6BFhkNo
dHRwOi8vdG9wY2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0kIAoK
JENBX1NFUklBTE5VTUJFUiQkMA0GCSqGSIb3DQEBCwUAA4IBAQCUEFIx+vOeOQi2
ZWR8TnADKYYTNsqv52e9WBz8VKfjbzIDA/hXqJUvtylyyEL4pBn82xG0WMk9UaAE
EGrkpdA0figlbUInyXZE8WZYcE/7Nlr4aupH+JETp1OqvAsS0l5M2mH4OdVMDA/K
pdwTMBa0it7f3QA8k2lXalHlifi35jrKj2q3DFKvy2n9pcwblPX2jpC7pZ1Y66tq
7SapaGyCo12Q6o0vSCgGodFkZsczYmGdp4ZbphUbACVQ3Lhw/moqB3PadT6V0jB6
4BDDHnkDkaoUI5XUr1BMmTAyy+chBLHzk83Dx9ioNHdF0rHpEyUD73GfV11R7BIy
zl5g8FpF
-----END CERTIFICATE-----

Binary file not shown.