From 6cba0a69febad6e960e1cacda44d99306727ac66 Mon Sep 17 00:00:00 2001 From: Diyu0904 <1819728964@qq.com> Date: Mon, 6 Jan 2025 15:27:41 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E6=89=AB=E7=A0=81=E6=94=AF=E4=BB=98=E5=9B=9E=E8=B0=83=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=20=E6=96=B0=E5=A2=9E=E6=A0=B9=E6=8D=AE=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=8F=B7=E6=9F=A5=E8=AF=A2=E6=94=AF=E4=BB=98=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/pay/AliPayIntegration.java | 15 +- .../controller/pay/OrderTradeController.java | 80 +++++++++- .../mcwl/memberCenter/MemberCenterTest.java | 142 +++++++++--------- mcwl-common/pom.xml | 3 + .../main/java/com/mcwl/common/JSONUtils.java | 22 +++ .../mcwl/framework/config/SecurityConfig.java | 2 +- 6 files changed, 178 insertions(+), 86 deletions(-) create mode 100644 mcwl-common/src/main/java/com/mcwl/common/JSONUtils.java diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPayIntegration.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPayIntegration.java index 3215220..dbdab88 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPayIntegration.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/AliPayIntegration.java @@ -1,12 +1,13 @@ package com.mcwl.web.controller.pay; -import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; import com.alibaba.fastjson.JSONObject; import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse; import com.mcwl.pay.domain.OrderTrade; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import com.alipay.easysdk.kernel.Config; + /** * 支付宝支付 @@ -27,11 +28,11 @@ public class AliPayIntegration { public String pay(OrderTrade tradeEntity) throws Exception { Factory.setOptions(config); //调用支付宝的接口 -// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() -// .preCreate(tradeEntity.getUserName(), -// tradeEntity.getCode(), -// tradeEntity.getPaymentAmount().toString()); - AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); + AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace() + .preCreate(tradeEntity.getUserName(), + tradeEntity.getCode(), + tradeEntity.getPaymentAmount().toString()); +// AlipayTradePrecreateResponse payResponse = Factory.Payment.FaceToFace().preCreate("订单主题:Mac笔记本", "LS123qwe123", "19999"); //参照官方文档响应示例,解析返回结果 String httpBodyStr = payResponse.getHttpBody(); JSONObject jsonObject = JSONObject.parseObject(httpBodyStr); diff --git a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/OrderTradeController.java b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/OrderTradeController.java index 00cfb8d..125a6af 100644 --- a/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/OrderTradeController.java +++ b/mcwl-admin/src/main/java/com/mcwl/web/controller/pay/OrderTradeController.java @@ -1,25 +1,28 @@ package com.mcwl.web.controller.pay; import cn.hutool.extra.qrcode.QrCodeUtil; +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse; +import com.mcwl.common.JSONUtils; +import com.mcwl.common.annotation.Anonymous; import com.mcwl.common.core.controller.BaseController; import com.mcwl.common.core.domain.AjaxResult; import com.mcwl.common.core.page.TableDataInfo; import com.mcwl.common.domain.IdsParam; -import com.mcwl.common.interfaces.NoLogin; import com.mcwl.common.utils.SecurityUtils; import com.mcwl.pay.domain.OrderTrade; import com.mcwl.pay.service.OrderTradeService; -import com.mcwl.resource.domain.MallProduct; +import lombok.extern.slf4j.Slf4j; +import com.alipay.easysdk.kernel.Config; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.CollectionUtils; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; import java.util.List; -import java.util.Objects; - -import static com.mcwl.common.utils.PageUtils.startPage; +import java.util.Map; /** * @Author:ChenYan @@ -30,11 +33,15 @@ import static com.mcwl.common.utils.PageUtils.startPage; * @Date:2025/1/3 14:46 */ +@Slf4j @RestController @RequestMapping("/web/pay") @Validated public class OrderTradeController extends BaseController { + @Autowired + private Config config; + @Autowired private OrderTradeService orderTradeService; @@ -102,7 +109,7 @@ public class OrderTradeController extends BaseController { * @param response 响应 * @throws Exception */ - @NoLogin + @Anonymous @PostMapping("/doPay") public void doPay(@RequestBody OrderTrade tradeEntity, HttpServletResponse response) throws Exception { String qrUrl = aliPayIntegration.pay(tradeEntity); @@ -110,4 +117,63 @@ public class OrderTradeController extends BaseController { } + @GetMapping("/queryTradeStatus") + public Object queryTradeStatus(@RequestParam String outTradeNo) throws Exception { + Factory.setOptions(config); + AlipayTradeQueryResponse query = Factory.Payment.Common().query(outTradeNo); + Map map = JSONUtils.jsonToMap(query.getHttpBody()); + + // 返回交易结果, 是否交易成功需要根据该对象中的 trade_status 来确定 + // trade_status 的枚举值如下, 请见 https://opendocs.alipay.com/apis/api_1/alipay.trade.query + // WAIT_BUYER_PAY(交易创建,等待买家付款) + // TRADE_CLOSED(未付款交易超时关闭,或支付完成后全额退款) + // TRADE_SUCCESS(交易支付成功) + // TRADE_FINISHED(交易结束,不可退款) + // 当 trade_status 等于 TRADE_SUCCESS 或 TRADE_FINISHED 时, 表示支付成功 + return map.get("alipay_trade_query_response"); + } + + + /** + * 支付回调接口 + * @param request + * @return + * @throws Exception + */ + @Anonymous + @PostMapping("/notify") // 注意这里必须是POST接口 + public String payNotify(HttpServletRequest request) throws Exception { + + log.info("已经进入回调接口"); + if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { + System.out.println("=========支付宝异步回调========"); + + Map params = new HashMap<>(); + Map requestParams = request.getParameterMap(); + for (String name : requestParams.keySet()) { + params.put(name, request.getParameter(name)); + // System.out.println(name + " = " + request.getParameter(name)); + } + + String tradeNo = params.get("out_trade_no"); + String gmtPayment = params.get("gmt_payment"); + String alipayTradeNo = params.get("trade_no"); + // 支付宝验签 + if (Factory.Payment.Common().verifyNotify(params)) { + // 验签通过 + System.out.println("交易名称: " + params.get("subject")); + System.out.println("交易状态: " + params.get("trade_status")); + System.out.println("支付宝交易凭证号: " + params.get("trade_no")); + System.out.println("商户订单号: " + params.get("out_trade_no")); + System.out.println("交易金额: " + params.get("total_amount")); + System.out.println("买家在支付宝唯一id: " + params.get("buyer_id")); + System.out.println("买家付款时间: " + params.get("gmt_payment")); + System.out.println("买家付款金额: " + params.get("buyer_pay_amount")); + // 更新订单状态 + } + } + return "success"; + } + + } diff --git a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java index fb6dc69..44cda14 100644 --- a/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java +++ b/mcwl-admin/src/test/java/com/mcwl/memberCenter/MemberCenterTest.java @@ -1,71 +1,71 @@ -package com.mcwl.memberCenter; - -import com.mcwl.McWlApplication; -import com.mcwl.common.core.domain.AjaxResult; -import com.mcwl.memberCenter.consumer.EmptyPointsRemindConsumer; -import com.mcwl.memberCenter.service.MemberLevelService; -import com.mcwl.memberCenter.service.MemberService; -import com.mcwl.memberCenter.task.UserMemberTask; -import com.mcwl.web.controller.memberCenter.MemberController; -import com.mcwl.web.controller.memberCenter.MemberLevelController; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = McWlApplication.class) -public class MemberCenterTest { - - - @Autowired - private MemberLevelService memberLevelService; - - @Autowired - private MemberController memberController; - - @Autowired - private MemberService memberService; - - @Autowired - private UserMemberTask userMemberTask; - - @Autowired - private MemberLevelController memberLevelController; - - @Autowired - private EmptyPointsRemindConsumer emptyPointsRemindConsumer; - @Test - public void createUserMember() { - System.out.println(memberService.createUserMember(1L, 1013L, "wechat",1L)); - } - - @Test - public void emptyPointsTaskTest() { - userMemberTask.emptyPointsTsk(); - } - - @Test - public void updateSubscriptionStatusTaskTest() { - userMemberTask.updateSubscriptionStatusTask(); - } - - - @Test - public void memberServiceTest() { - System.out.println(memberLevelService.list()); - } - - @Test - public void getPointsTest() { - AjaxResult points = memberController.getPoints(); - System.out.println("points = " + points); - } - - @Test - public void getMemberLevelListTest() { - System.out.println("memberLevelController.getMemberBenefitList() = " + memberLevelController.getMemberBenefitList()); - } - -} +//package com.mcwl.memberCenter; +// +//import com.mcwl.McWlApplication; +//import com.mcwl.common.core.domain.AjaxResult; +//import com.mcwl.memberCenter.consumer.EmptyPointsRemindConsumer; +//import com.mcwl.memberCenter.service.MemberLevelService; +//import com.mcwl.memberCenter.service.MemberService; +//import com.mcwl.memberCenter.task.UserMemberTask; +//import com.mcwl.web.controller.memberCenter.MemberController; +//import com.mcwl.web.controller.memberCenter.MemberLevelController; +//import org.junit.Test; +//import org.junit.runner.RunWith; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.junit4.SpringRunner; +// +//@RunWith(SpringRunner.class) +//@SpringBootTest(classes = McWlApplication.class) +//public class MemberCenterTest { +// +// +// @Autowired +// private MemberLevelService memberLevelService; +// +// @Autowired +// private MemberController memberController; +// +// @Autowired +// private MemberService memberService; +// +// @Autowired +// private UserMemberTask userMemberTask; +// +// @Autowired +// private MemberLevelController memberLevelController; +// +// @Autowired +// private EmptyPointsRemindConsumer emptyPointsRemindConsumer; +// @Test +// public void createUserMember() { +// System.out.println(memberService.createUserMember(1L, 1013L, "wechat",1L)); +// } +// +// @Test +// public void emptyPointsTaskTest() { +// userMemberTask.emptyPointsTsk(); +// } +// +// @Test +// public void updateSubscriptionStatusTaskTest() { +// userMemberTask.updateSubscriptionStatusTask(); +// } +// +// +// @Test +// public void memberServiceTest() { +// System.out.println(memberLevelService.list()); +// } +// +// @Test +// public void getPointsTest() { +// AjaxResult points = memberController.getPoints(); +// System.out.println("points = " + points); +// } +// +// @Test +// public void getMemberLevelListTest() { +// System.out.println("memberLevelController.getMemberBenefitList() = " + memberLevelController.getMemberBenefitList()); +// } +// +//} diff --git a/mcwl-common/pom.xml b/mcwl-common/pom.xml index 1ba0f49..84f00c1 100644 --- a/mcwl-common/pom.xml +++ b/mcwl-common/pom.xml @@ -341,6 +341,9 @@ 3.5.0 + + + diff --git a/mcwl-common/src/main/java/com/mcwl/common/JSONUtils.java b/mcwl-common/src/main/java/com/mcwl/common/JSONUtils.java new file mode 100644 index 0000000..fc75a44 --- /dev/null +++ b/mcwl-common/src/main/java/com/mcwl/common/JSONUtils.java @@ -0,0 +1,22 @@ +package com.mcwl.common; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.util.Map; + +/** + * @author DaiZibo + * @date 2025/1/6 + * @apiNote + */ + +public class JSONUtils { + + private static final ObjectMapper mapper = new ObjectMapper(); + + public static Map jsonToMap(String jsonStr) throws JsonProcessingException { + Map map = mapper.readValue(jsonStr, Map.class); + return map; + } +} + diff --git a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java index e8b8e25..f1c53fe 100644 --- a/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java +++ b/mcwl-framework/src/main/java/com/mcwl/framework/config/SecurityConfig.java @@ -129,7 +129,7 @@ public class SecurityConfig .authorizeHttpRequests((requests) -> { permitAllUrl.getUrls().forEach(url -> requests.antMatchers(url).permitAll()); // 对于登录login 注册register 验证码captchaImage 允许匿名访问 - requests.antMatchers("/login", "/register", "/captchaImage").permitAll() + requests.antMatchers("/login", "/register", "/captchaImage","/web/pay/doPay","/web/pay/notify").permitAll() // 静态资源,可匿名访问 .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll() .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()