diff --git a/doc/支付流程图.drawio b/doc/支付流程图.drawio new file mode 100644 index 0000000..184cb9f --- /dev/null +++ b/doc/支付流程图.drawio @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/controller/AliPayController.java b/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/controller/AliPayController.java index 3371fad..91f6fd2 100644 --- a/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/controller/AliPayController.java +++ b/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/controller/AliPayController.java @@ -5,6 +5,7 @@ import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -14,7 +15,9 @@ import org.springframework.web.bind.annotation.RestController; import com.alipay.easysdk.factory.Factory; import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse; import com.ruoyi.common.annotation.Anonymous; +import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.pay.alipay.service.IAliPayService; import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.service.IPayOrderService; @@ -28,21 +31,24 @@ import jakarta.servlet.http.HttpServletRequest; * @author zlh */ @RestController -@RequestMapping("/alipay") +@RequestMapping("/pay/alipay") @ConditionalOnProperty(prefix = "pay.alipay", name = "enabled", havingValue = "true") @Tag(name = "【支付宝】管理") -public class AliPayController { +public class AliPayController extends BaseController { @Autowired private IPayOrderService payOrderService; + @Autowired(required = false) + private IAliPayService aliPayService; + @Anonymous @Operation(summary = "支付宝支付") @Parameters({ @Parameter(name = "orderId", description = "订单号", required = true) }) @GetMapping("/pay/{orderNumber}") - public AjaxResult pay(@PathVariable String orderNumber) { + public AjaxResult pay(@PathVariable(name = "orderNumber") String orderNumber) { AlipayTradePagePayResponse response; PayOrder aliPay = payOrderService.selectPayOrderByOrderNumber(orderNumber); try { @@ -53,15 +59,15 @@ public class AliPayController { aliPay.getActualAmount(), ""); } catch (Exception e) { - System.err.println("调用遭遇异常,原因:" + e.getMessage()); - throw new RuntimeException(e.getMessage(), e); + return error(e.getMessage()); } - return AjaxResult.success(response.getBody()); + return success(response.getBody()); } @Anonymous @Operation(summary = "支付宝支付回调") - @PostMapping("/notify") // 注意这里必须是POST接口 + @Transactional + @PostMapping("/notify") public AjaxResult payNotify(HttpServletRequest request) throws Exception { if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { System.out.println("=========支付宝异步回调========"); @@ -87,8 +93,11 @@ public class AliPayController { // // 更新订单未已支付 payOrderService.updateStatus(orderNumber, "已支付"); + if (aliPayService != null) { + aliPayService.callback(params); + } } } - return AjaxResult.success("success"); + return success("success"); } } diff --git a/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/service/IAliPayService.java b/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/service/IAliPayService.java new file mode 100644 index 0000000..fd747a8 --- /dev/null +++ b/ruoyi-pay/ruoyi-pay-alipay/src/main/java/com/ruoyi/pay/alipay/service/IAliPayService.java @@ -0,0 +1,7 @@ +package com.ruoyi.pay.alipay.service; + +import java.util.Map; + +public interface IAliPayService { + public void callback(Map params); +} diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java index 275cfd3..9631233 100644 --- a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/controller/SQBController.java @@ -1,20 +1,24 @@ package com.ruoyi.pay.sqb.controller; +import java.io.IOException; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.annotation.Anonymous; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.service.IPayOrderService; +import com.ruoyi.pay.sqb.service.ISqbPayService; import com.ruoyi.pay.sqb.service.Impl.SQBServiceImpl; import io.swagger.v3.oas.annotations.Operation; @@ -24,7 +28,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; @Tag(name = "sqb支付") @RestController -@RequestMapping("/pay/sql") +@RequestMapping("/pay/sqb") @ConditionalOnProperty(prefix = "pay.sqb", name = "enabled", havingValue = "true") public class SQBController extends BaseController { @Autowired @@ -32,13 +36,16 @@ public class SQBController extends BaseController { @Autowired private IPayOrderService payOrderServicer; + @Autowired(required = false) + private ISqbPayService sqbPayService; + @Operation(summary = "获取支付url") @Parameters(value = { @Parameter(name = "orderNumber", description = "订单号", required = true) }) - @PostMapping("/payUrl") + @PostMapping("/url/{orderNumber}") @Anonymous - public R payUrl(@RequestParam("orderNumber") String orderNumber) throws Exception { + public R payUrl(@PathVariable(name = "orderNumber") String orderNumber) throws Exception { PayOrder payOrder = payOrderServicer.selectPayOrderByOrderNumber(orderNumber); String url = sqbServiceImpl.payUrl(payOrder); return R.ok(url); @@ -48,8 +55,8 @@ public class SQBController extends BaseController { @Parameters(value = { @Parameter(name = "orderNumber", description = "订单号", required = true) }) - @PostMapping("/query") - public AjaxResult query(@RequestParam("orderNumber") String orderNumber) throws Exception { + @PostMapping("/query/{orderNumber}") + public AjaxResult query(@PathVariable(name = "orderNumber") String orderNumber) throws Exception { PayOrder payOrder = payOrderServicer.selectPayOrderByOrderNumber(orderNumber); return success(sqbServiceImpl.query(payOrder)); } @@ -63,4 +70,18 @@ public class SQBController extends BaseController { Object parse = JSON.parse(refund); return success(parse); } + + @PostMapping("/notify") + @Anonymous + @Operation(summary = "支付回调") + public AjaxResult payNotify(@RequestBody JSONObject jsonObject) throws IOException { + // 验签 + // 修改订单状态 + // 用户自定义行为 + if (sqbPayService != null) { + sqbPayService.callback(jsonObject); + } + return AjaxResult.success(); + } + } diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/ISqbPayService.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/ISqbPayService.java new file mode 100644 index 0000000..4b0c548 --- /dev/null +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/ISqbPayService.java @@ -0,0 +1,7 @@ +package com.ruoyi.pay.sqb.service; + +import com.alibaba.fastjson2.JSONObject; + +public interface ISqbPayService { + public void callback(JSONObject param); +} diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java index e9fb5ae..484a728 100644 --- a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/service/Impl/SQBServiceImpl.java @@ -4,22 +4,31 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.common.utils.ServletUtils; import com.ruoyi.common.utils.sign.Md5Utils; import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.sqb.config.SqbConfig; import com.ruoyi.pay.sqb.utils.HttpUtil; @Service -@ConditionalOnProperty(prefix = "pay.sqb", name = "enabled", havingValue = "true") public class SQBServiceImpl { @Autowired - private SqbConfig sqbConstant; + private SqbConfig sqbConfig; + + @Value("${pay.sqb.notifyUrl}") + private String defaultNotifyUrl; + + @Value("${pay.sqb.notifyBaseUrl}") + private String defaultNotifyBaseUrl; + + @Value("${pay.sqb.proxy}") + private String proxyPath; /** * 计算字符串的MD5值 @@ -44,17 +53,16 @@ public class SQBServiceImpl { * @return {terminal_sn:"$终端号",terminal_key:"$终端密钥"} */ public JSONObject activate(String code, String deviceId, String clientSn, String name) { - String url = sqbConstant.getApiDomain() + "/terminal/activate"; + String url = sqbConfig.getApiDomain() + "/terminal/activate"; JSONObject params = new JSONObject(); try { - params.put("app_id", sqbConstant.getAppId()); // app_id,必填 + params.put("app_id", sqbConfig.getAppId()); // app_id,必填 params.put("code", code); // 激活码,必填 params.put("device_id", deviceId); // 客户方收银终端序列号,需保证同一app_id下唯一,必填。为方便识别,建议格式为“品牌名+门店编号+‘POS’+POS编号“ params.put("client_sn", clientSn); // 客户方终端编号,一般客户方或系统给收银终端的编号,必填 params.put("name", name); // 客户方终端名称,必填 - - String sign = getSign(params.toString() + sqbConstant.getVendorKey()); - String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConstant.getVendorSn()); + String sign = getSign(params.toString() + sqbConfig.getVendorKey()); + String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConfig.getVendorSn()); JSONObject retObj = JSON.parseObject(result); String resCode = retObj.get("result_code").toString(); if (!resCode.equals("200")) @@ -75,15 +83,15 @@ public class SQBServiceImpl { * @return {terminal_sn:"$终端号",terminal_key:"$终端密钥"} */ public JSONObject checkin() { - String url = sqbConstant.getApiDomain() + "/terminal/checkin"; + String url = sqbConfig.getApiDomain() + "/terminal/checkin"; JSONObject params = new JSONObject(); try { - params.put("terminal_sn", sqbConstant.getTerminalSn()); + params.put("terminal_sn", sqbConfig.getTerminalSn()); params.put("device_id", "HUISUAN001POS01"); params.put("os_info", "Mac OS"); params.put("sdk_version", "Java SDK v1.0"); - String sign = getSign(params.toString() + sqbConstant.getTerminalKey()); - String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConstant.getTerminalSn()); + String sign = getSign(params.toString() + sqbConfig.getTerminalKey()); + String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConfig.getTerminalSn()); JSONObject retObj = JSON.parseObject(result); String resCode = retObj.get("result_code").toString(); if (!resCode.equals("200")) @@ -104,17 +112,17 @@ public class SQBServiceImpl { * @return */ public String refund(PayOrder payOrder) { - String url = sqbConstant.getApiDomain() + "/upay/v2/refund"; + String url = sqbConfig.getApiDomain() + "/upay/v2/refund"; JSONObject params = new JSONObject(); try { - params.put("terminal_sn", sqbConstant.getTerminalSn()); // 收钱吧终端ID + params.put("terminal_sn", sqbConfig.getTerminalSn()); // 收钱吧终端ID params.put("client_sn", payOrder.getOrderNumber()); // 商户系统订单号,必须在商户系统内唯一;且长度不超过64字节 - params.put("refund_amount", payOrder.getActualAmount()); // 退款金额 + params.put("refund_amount", payOrder.getTotalAmount()); // 退款金额 params.put("refund_request_no", "1"); // 商户退款所需序列号,表明是第几次退款 params.put("operator", "kay"); // 门店操作员 - String sign = getSign(params.toString() + sqbConstant.getTerminalKey()); - String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConstant.getTerminalSn()); + String sign = getSign(params.toString() + sqbConfig.getTerminalKey()); + String result = HttpUtil.httpPost(url, params, sign, sqbConfig.getTerminalSn()); return result; } catch (Exception e) { @@ -129,14 +137,14 @@ public class SQBServiceImpl { */ public JSONObject query(PayOrder payOrder) { - String url = sqbConstant.getApiDomain() + "/upay/v2/query"; + String url = sqbConfig.getApiDomain() + "/upay/v2/query"; JSONObject params = new JSONObject(); try { - params.put("terminal_sn", sqbConstant.getTerminalSn()); // 终端号 + params.put("terminal_sn", sqbConfig.getTerminalSn()); // 终端号 params.put("client_sn", payOrder.getOrderNumber()); // 商户系统订单号,必须在商户系统内唯一;且长度不超过64字节 - System.out.println(params.toString() + sqbConstant.getTerminalKey()); - String sign = getSign(params.toString() + sqbConstant.getTerminalKey()); - String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConstant.getTerminalSn()); + System.out.println(params.toString() + sqbConfig.getTerminalKey()); + String sign = getSign(params.toString() + sqbConfig.getTerminalKey()); + String result = HttpUtil.httpPost(url, params, sign, sqbConfig.getTerminalSn()); JSONObject retObj = JSON.parseObject(result); String resCode = retObj.get("result_code").toString(); if (!resCode.equals("200")) @@ -149,24 +157,43 @@ public class SQBServiceImpl { } public String payUrl(PayOrder payOrder) throws UnsupportedEncodingException { + return payUrl(payOrder, null); + } + + public String payUrl(PayOrder payOrder, String notifyBaseUrl) throws UnsupportedEncodingException { if (payOrder.getRemark() == null) { payOrder.setRemark("支付"); } + String orderNotifyUrl; + if (notifyBaseUrl != null && !notifyBaseUrl.trim().equals("")) { + orderNotifyUrl = notifyBaseUrl + defaultNotifyUrl; + } else { + if (defaultNotifyBaseUrl != null && !defaultNotifyBaseUrl.trim().equals("")) { + orderNotifyUrl = defaultNotifyBaseUrl + proxyPath + defaultNotifyUrl; + } else { + orderNotifyUrl = "http://" + ServletUtils.getRequest().getServerName() + proxyPath + defaultNotifyUrl; + } + } + System.out.println(orderNotifyUrl); String param = "" + "client_sn=" + payOrder.getOrderNumber() + - "&operator=" + "admin" + + "¬ify_url=" + orderNotifyUrl + + "&operator=" + payOrder.getCreateBy() + "&return_url=" + "https://www.shouqianba.com/" + "&subject=" + payOrder.getRemark() + - "&terminal_sn=" + sqbConstant.getTerminalSn() + - "&total_amount=" + payOrder.getActualAmount(); + "&terminal_sn=" + sqbConfig.getTerminalSn() + + "&total_amount=" + Long.valueOf(payOrder.getTotalAmount().toString()); String urlParam = "" + "client_sn=" + payOrder.getOrderNumber() + - "&operator=" + URLEncoder.encode("admin", "UTF-8") + + "¬ify_url=" + URLEncoder.encode(orderNotifyUrl, "UTF-8") + + "&operator=" + URLEncoder.encode(payOrder.getCreateBy(), "UTF-8") + "&return_url=" + "https://www.shouqianba.com/" + "&subject=" + URLEncoder.encode(payOrder.getRemark(), "UTF-8") + - "&terminal_sn=" + sqbConstant.getTerminalSn() + - "&total_amount=" + payOrder.getActualAmount(); - String sign = getSign(param + "&key=" + sqbConstant.getTerminalKey()); + "&terminal_sn=" + sqbConfig.getTerminalSn() + + "&total_amount=" + Long.valueOf(payOrder.getTotalAmount().toString()); + System.out.println(param); + System.out.println(orderNotifyUrl); + String sign = getSign(param + "&key=" + sqbConfig.getTerminalKey()); return "https://qr.shouqianba.com/gateway?" + urlParam + "&sign=" + sign.toUpperCase(); } @@ -176,18 +203,18 @@ public class SQBServiceImpl { * @return */ public String precreate(PayOrder payOrder, String sn, String payway) { - String url = sqbConstant.getApiDomain() + "/upay/v2/precreate"; + String url = sqbConfig.getApiDomain() + "/upay/v2/precreate"; JSONObject params = new JSONObject(); try { - params.put("terminal_sn", sqbConstant.getTerminalSn()); // 收钱吧终端ID + params.put("terminal_sn", sqbConfig.getTerminalSn()); // 收钱吧终端ID params.put("client_sn", payOrder.getOrderNumber()); // 商户系统订单号,必须在商户系统内唯一;且长度不超过32字节 - params.put("total_amount", payOrder.getActualAmount()); // 交易总金额 + params.put("total_amount", payOrder.getTotalAmount()); // 交易总金额 // params.put("payway", payway); // 支付方式 params.put("subject", "无简介"); // 交易简介 params.put("operator", SecurityUtils.getUsername()); // 门店操作员 - String sign = getSign(params.toString() + sqbConstant.getTerminalKey()); - String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConstant.getTerminalSn()); + String sign = getSign(params.toString() + sqbConfig.getTerminalKey()); + String result = HttpUtil.httpPost(url, params.toString(), sign, sqbConfig.getTerminalSn()); return result; } catch (Exception e) { return null; @@ -202,7 +229,7 @@ public class SQBServiceImpl { * @return */ public String cancel(String terminal_sn, String terminal_key) { - String url = sqbConstant.getApiDomain() + "/upay/v2/cancel"; + String url = sqbConfig.getApiDomain() + "/upay/v2/cancel"; JSONObject params = new JSONObject(); try { params.put("terminal_sn", terminal_sn); // 终端号 diff --git a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/utils/HttpUtil.java b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/utils/HttpUtil.java index cbf4485..6ca9882 100644 --- a/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/utils/HttpUtil.java +++ b/ruoyi-pay/ruoyi-pay-sqb/src/main/java/com/ruoyi/pay/sqb/utils/HttpUtil.java @@ -7,6 +7,8 @@ import java.security.NoSuchAlgorithmException; import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Map; import javax.net.ssl.SSLContext; @@ -15,15 +17,15 @@ import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.conn.ssl.TrustStrategy; -import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; import org.apache.http.util.EntityUtils; +import com.ruoyi.common.utils.http.HttpClientUtil; + public class HttpUtil { public static String httpPostWithoutException(String url, String string, String sign, String sn) { String xmlRes = "{}"; @@ -50,27 +52,33 @@ public class HttpUtil { * @param sn: 序列号 * @return */ - public static String httpPost(String url, String body, String sign, String sn) + public static String httpPost(String url, Object body, String sign, String sn) throws UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, KeyManagementException { String xmlRes = "{}"; - HttpClient client = createSSLClientDefault(); - HttpPost httpost = new HttpPost(url); + // HttpClient client = createSSLClientDefault(); + // HttpPost httpost = new HttpPost(url); try { - // 所有请求的body都需采用UTF-8编码 - StringEntity entity = new StringEntity(body, "UTF-8");// - entity.setContentType("application/json"); - httpost.setEntity(entity); - // 支付平台所有的API仅支持JSON格式的请求调用,HTTP请求头Content-Type设为application/json - httpost.addHeader("Content-Type", "application/json"); - // 支付平台所有的API调用都需要签名验证,签名首部: Authorization: sn + " " + sign - httpost.addHeader("Authorization", sn + " " + sign); - HttpResponse response = client.execute(httpost); - // 所有响应也采用UTF-8编码 - xmlRes = EntityUtils.toString(response.getEntity(), "UTF-8"); - } catch (ClientProtocolException e) { + Map header = new HashMap<>(); + header.put("Authorization", sn + " " + sign); + xmlRes = HttpClientUtil.sendHttpPost(url, body, header); + // System.out.println("Request string: " + body); + // // 所有请求的body都需采用UTF-8编码 + // StringEntity entity = new StringEntity(body, "UTF-8");// + // entity.setContentType("application/json"); + // httpost.setEntity(entity); - } catch (IOException e) { + // // 支付平台所有的API仅支持JSON格式的请求调用,HTTP请求头Content-Type设为application/json + // httpost.addHeader("Content-Type", "application/json"); + // // 支付平台所有的API调用都需要签名验证,签名首部: Authorization: sn + " " + sign + // httpost.addHeader("Authorization", sn + " " + sign); + // System.out.println("Authorization" + sn + " " + sign); + // HttpResponse response = client.execute(httpost); + + // // 所有响应也采用UTF-8编码 + // xmlRes = EntityUtils.toString(response.getEntity(), "UTF-8"); + // System.out.println("Response string: " + xmlRes); + } catch (Exception e) { } return xmlRes; } @@ -97,7 +105,7 @@ public class HttpUtil { } public static String doGet(String url, String parameter) { - String uriAPI = url + "?" + parameter; // "http://XX?str=I+am+get+String"; + String uriAPI = url + "?" + parameter; // "http://XXXXX?str=I+am+get+String"; String result = ""; HttpClient client = createSSLClientDefault(); HttpGet httpRequst = new HttpGet(uriAPI); diff --git a/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/controller/WxPayController.java b/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/controller/WxPayController.java index 1660501..461eee9 100644 --- a/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/controller/WxPayController.java +++ b/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/controller/WxPayController.java @@ -18,6 +18,7 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.pay.domain.PayOrder; import com.ruoyi.pay.service.IPayOrderService; import com.ruoyi.pay.wx.config.WxPayConfig; +import com.ruoyi.pay.wx.service.IWxPayService; import com.wechat.pay.java.core.exception.ValidationException; import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.RequestParam; @@ -32,18 +33,20 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; /** * @author zlh */ -@Slf4j @RestController @ConditionalOnProperty(prefix = "pay.wechat", name = "enabled", havingValue = "true") -@RequestMapping("/wxPay") +@RequestMapping("/pay/wechat") public class WxPayController extends BaseController { @Autowired private WxPayConfig wxPayAppConfig; + + @Autowired(required = false) + private IWxPayService wxPayService; + @Autowired private IPayOrderService payOrderService; @@ -56,8 +59,8 @@ public class WxPayController extends BaseController { @Parameters({ @Parameter(name = "orderNumber", description = "订单号", required = true) }) - @GetMapping("/pay/{orderNumber}") - public AjaxResult pay(@PathVariable String orderNumber) throws Exception { + @GetMapping("/url/{orderNumber}") + public AjaxResult pay(@PathVariable(name = "orderNumber") String orderNumber) throws Exception { PayOrder aliPay = payOrderService.selectPayOrderByOrderNumber(orderNumber); String amountStr = aliPay.getActualAmount(); double amountDouble = Double.parseDouble(amountStr); @@ -72,7 +75,7 @@ public class WxPayController extends BaseController { request.setNotifyUrl(wxPayAppConfig.getNotifyUrl()); request.setOutTradeNo(aliPay.getOrderNumber()); PrepayResponse response = nativePayService.prepay(request); - return AjaxResult.success(response.getCodeUrl()); + return success(response.getCodeUrl()); } @Anonymous @@ -80,8 +83,6 @@ public class WxPayController extends BaseController { @PostMapping("/notify") public AjaxResult WxPayList(HttpServletRequest servletRequest, HttpServletResponse response) throws Exception { - log.info("=========微信异步回调========"); - String timeStamp = servletRequest.getHeader("Wechatpay-Timestamp"); String nonce = servletRequest.getHeader("Wechatpay-Nonce"); String signature = servletRequest.getHeader("Wechatpay-Signature"); @@ -99,15 +100,15 @@ public class WxPayController extends BaseController { try { Transaction transaction = notificationParser.parse(requestParam, Transaction.class); - String orderNumber = transaction.getOutTradeNo(); - payOrderService.updateStatus(orderNumber, "已支付"); + if (wxPayService != null) { + wxPayService.callback(transaction); + } return success(); } catch (ValidationException e) { return error(); } } catch (IOException e) { - log.error("Error reading request body", e); - throw new RuntimeException("Error reading request body", e); + return error(e.getMessage()); } } diff --git a/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/service/IWxPayService.java b/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/service/IWxPayService.java new file mode 100644 index 0000000..0d61777 --- /dev/null +++ b/ruoyi-pay/ruoyi-pay-wx/src/main/java/com/ruoyi/pay/wx/service/IWxPayService.java @@ -0,0 +1,7 @@ +package com.ruoyi.pay.wx.service; + +import com.wechat.pay.java.service.wexinpayscoreparking.model.Transaction; + +public interface IWxPayService { + public void callback(Transaction transaction); +}