From a4922593b98484fc3ab4630eaf8ea6bc0b7765fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B0=A2=E6=AC=A3=E6=82=A6?= <2289014031@qq.com> Date: Sat, 31 Aug 2024 10:58:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9Dapi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../muyu/cloud/market/domin/Operators.java | 1 - .../com/muyu/cloud/market/domin/PayInfo.java | 43 ++++-- cloud-market-server/pom.xml | 9 ++ .../cloud/market/config/AliPayConfig.java | 64 +++++++++ .../market/controller/AliPayController.java | 124 ++++++++++++++++++ .../market/controller/PayController.java | 13 -- .../cloud/market/mapper/OrdersPayMapper.java | 7 - .../cloud/market/mapper/PayInfoMapper.java | 20 +++ .../market/service/OrdersPayService.java | 4 - .../cloud/market/service/PayInfoService.java | 7 + .../service/impl/OrdersPayServiceImpl.java | 8 -- .../service/impl/PayInfoServiceImpl.java | 13 ++ .../src/main/resources/bootstrap.yml | 5 + 13 files changed, 277 insertions(+), 41 deletions(-) create mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/config/AliPayConfig.java create mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/controller/AliPayController.java delete mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/controller/PayController.java delete mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/OrdersPayMapper.java create mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/PayInfoMapper.java delete mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/service/OrdersPayService.java create mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/service/PayInfoService.java delete mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/OrdersPayServiceImpl.java create mode 100644 cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/PayInfoServiceImpl.java diff --git a/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/Operators.java b/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/Operators.java index 743439a..8e7b54e 100644 --- a/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/Operators.java +++ b/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/Operators.java @@ -19,7 +19,6 @@ public class Operators extends BaseEntity { /** * 运营商ID */ - private Long operatorsId; /** diff --git a/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/PayInfo.java b/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/PayInfo.java index 5044785..0d4f68b 100644 --- a/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/PayInfo.java +++ b/cloud-market-common/src/main/java/com/muyu/cloud/market/domin/PayInfo.java @@ -8,6 +8,8 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.math.BigDecimal; + @EqualsAndHashCode(callSuper = true) @Data @AllArgsConstructor @@ -16,6 +18,8 @@ import lombok.experimental.SuperBuilder; @TableName(value = "payinfo",autoResultMap = true) public class PayInfo extends BaseEntity { + private static final long serialVersionUID = 1L; + /** * 订单支付表主键 */ @@ -24,6 +28,10 @@ public class PayInfo extends BaseEntity { * 支付单号 */ private String payInfoNum; + /** + * 支付单状态; 1待支付 2支付中 3支付成功 4支付失败 5支付超时 + */ + private Integer payInfoState; /** * 订单ID(外键) */ @@ -36,26 +44,45 @@ public class PayInfo extends BaseEntity { * 渠道商ID(外鍵) */ private Integer payInfoOperators; - /** - * 支付单状态; 1待支付 2支付中 3支付成功 4支付失败 5支付超时 - */ - private Integer payInfoState; /** * 备注 */ private String payInfoRemark; + //订单模块(要使用外键) /** * 订单ID(外键) */ private Long ordersId; /** - * 客户ID(外鍵) + * 订单编号 */ - private Integer payInfoUser; + private String ordersNum; /** - * 渠道商ID(外鍵) + * 订单金额 */ - private Integer payInfoOperators; + private BigDecimal ordersPrice; + + + //用户模块(要使用外键) + /** + * (关联的用户外键) + */ + private Long userId; + /** + * 用户账号 + */ + private String userName; + + //运营商模块(要使用外键) + /** + * 运营商ID + */ + private Long operatorsId; + /** + * 运营商 + */ + private String operatorsName; + } diff --git a/cloud-market-server/pom.xml b/cloud-market-server/pom.xml index 70b0b31..0e56a35 100644 --- a/cloud-market-server/pom.xml +++ b/cloud-market-server/pom.xml @@ -106,12 +106,21 @@ 2.0.4 + com.alipay.sdk alipay-sdk-java 4.34.0.ALL + + + com.alipay.sdk + alipay-easysdk + 2.2.0 + + + diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/config/AliPayConfig.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/config/AliPayConfig.java new file mode 100644 index 0000000..37bec50 --- /dev/null +++ b/cloud-market-server/src/main/java/com/muyu/cloud/market/config/AliPayConfig.java @@ -0,0 +1,64 @@ +package com.muyu.cloud.market.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 支付宝工具 + */ +@Component +@ConfigurationProperties(prefix = "alipay") +public class AliPayConfig { + + /** + * 支付宝的APPID + */ + private String appId; + /** + * 应用私钥 + */ + private String appPrivateKey; + /** + * 支付宝公钥 + */ + private String alipayPublicKey; + /** + * 支付宝通知本地的接口完整地址 + */ + private String notifyUrl; + + public String getAppId() { + return appId; + } + + public void setAppId(String appId) { + this.appId = appId; + } + + public String getAppPrivateKey() { + return appPrivateKey; + } + + public void setAppPrivateKey(String appPrivateKey) { + this.appPrivateKey = appPrivateKey; + } + + public String getAlipayPublicKey() { + return alipayPublicKey; + } + + public void setAlipayPublicKey(String alipayPublicKey) { + this.alipayPublicKey = alipayPublicKey; + } + + public String getNotifyUrl() { + return notifyUrl; + } + + public void setNotifyUrl(String notifyUrl) { + this.notifyUrl = notifyUrl; + + + } + +} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/AliPayController.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/AliPayController.java new file mode 100644 index 0000000..ac3f9eb --- /dev/null +++ b/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/AliPayController.java @@ -0,0 +1,124 @@ +package com.muyu.cloud.market.controller; + +import cn.hutool.json.JSONObject; +import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; +import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.request.AlipayTradePagePayRequest; +import com.muyu.cloud.market.config.AliPayConfig; +import com.muyu.cloud.market.domin.Orders; +import com.muyu.cloud.market.domin.PayInfo; +import com.muyu.cloud.market.service.PayInfoService; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.log4j.Log4j2; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + + +@RestController +@RequestMapping("/alipay") +@Log4j2 +@Tag(name = "支付接口控制层", description = "进行订单支付管理") +public class AliPayController { + // 支付宝沙箱网关地址 + private static final String GATEWAY_URL = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"; + private static final String FORMAT = "JSON"; + private static final String CHARSET = "UTF-8"; + //签名⽅式 + private static final String SIGN_TYPE = "RSA2"; + + @Resource + private AliPayConfig aliPayConfig; + + @Resource + private PayInfoService payInfoService; + + @GetMapping("/pay") // /alipay/pay?orderNo=xxx + public void pay(String ordersNum, HttpServletResponse httpResponse) throws Exception { + //查询订单信息 + Orders orders = payInfoService.selectByordersNum (ordersNum); + if (orders == null) { + return; + } + // 1.创建Client,通⽤SDK提供的Client,负责调⽤⽀付宝的API + AlipayClient alipayClient = new DefaultAlipayClient( + GATEWAY_URL, + aliPayConfig.getAppId(), + aliPayConfig.getAppPrivateKey(), + FORMAT, CHARSET, + aliPayConfig.getAlipayPublicKey(), + SIGN_TYPE); + + // 2. 创建 Request并设置Request参数 + AlipayTradePagePayRequest request = new AlipayTradePagePayRequest(); // 发送请求的 Request类 + request.setNotifyUrl(aliPayConfig.getNotifyUrl()); + cn.hutool.json.JSONObject bizContent = new JSONObject(); + bizContent.set("orders_num", orders.getOrdersNum()); // 我们自己生成的订单编号,必须唯一不允许重复 + bizContent.set("orders_price", orders.getOrdersPrice()); // 订单的总金额 + bizContent.set("product_name", orders.getProductName()); // 支付的名称 + bizContent.set("product_code", "FAST_INSTANT_TRADE_PAY"); // 固定配置 + request.setBizContent(bizContent.toString()); + request.setReturnUrl("http://localhost:8080/orders"); // 支付完成后自动跳转到本地页面的路径 + + //执⾏请求,拿到响应的结果,返回给浏览器 + String form = ""; + try { + form = alipayClient.pageExecute(request).getBody();//调⽤SDK⽣成表单 + } catch (AlipayApiException e) { + e.printStackTrace(); + } + httpResponse.setContentType("text/html;charset=" + CHARSET); + httpResponse.getWriter().write(form);//直接将完整的表单html 输出到⻚⾯ + httpResponse.getWriter().flush(); + httpResponse.getWriter().close(); + } + + @PostMapping("/notify") // 注意这里必须是POST接口 + public void payNotify(HttpServletRequest request) throws Exception { + 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)); + } + + String sign = params.get("sign"); + String content = AlipaySignature.getSignCheckContentV1(params); + boolean checkSignature = AlipaySignature.rsa256CheckContent(content, sign, aliPayConfig.getAlipayPublicKey(), "UTF-8"); // 验证签名 + // 支付宝验签 + if (checkSignature) { + // 验签通过 + System.out.println("交易名称: " + params.get("subject")); + System.out.println("交易状态: " + params.get("pay_info_state")); + 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")); + + String tradeNo = params.get("out_trade_no"); // 订单编号 + String gmtPayment = params.get("gmt_payment"); // 支付时间 + String alipayTradeNo = params.get("trade_no"); // 支付宝交易编号 + // 更新订单状态为已支付,设置支付信息 +// Orders orders = ordersService.selectByOrderNo(tradeNo); +// orders.setStatus("已支付"); +// orders.setPayTime(gmtPayment); +// orders.setPayNo(alipayTradeNo); +// ordersService.updateById(orders); + + } + } + } + } diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/PayController.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/PayController.java deleted file mode 100644 index 46835ae..0000000 --- a/cloud-market-server/src/main/java/com/muyu/cloud/market/controller/PayController.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.muyu.cloud.market.controller; - -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.log4j.Log4j2; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Log4j2 -@RestController -@RequestMapping("/orders") -@Tag(name = "支付接口控制层", description = "进行订单支付管理") -public class PayController { -} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/OrdersPayMapper.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/OrdersPayMapper.java deleted file mode 100644 index 6443ddf..0000000 --- a/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/OrdersPayMapper.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.muyu.cloud.market.mapper; - -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface OrdersPayMapper { -} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/PayInfoMapper.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/PayInfoMapper.java new file mode 100644 index 0000000..4bcace7 --- /dev/null +++ b/cloud-market-server/src/main/java/com/muyu/cloud/market/mapper/PayInfoMapper.java @@ -0,0 +1,20 @@ +package com.muyu.cloud.market.mapper; + +import com.muyu.cloud.market.domin.PayInfo; +import com.muyu.cloud.market.domin.req.OrdersListReq; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +@Mapper +public interface PayInfoMapper { + + List selectpayinfoList(OrdersListReq req); + + + + + + + +} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/OrdersPayService.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/OrdersPayService.java deleted file mode 100644 index 9ad8e18..0000000 --- a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/OrdersPayService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.muyu.cloud.market.service; - -public interface OrdersPayService { -} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/PayInfoService.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/PayInfoService.java new file mode 100644 index 0000000..f2ab826 --- /dev/null +++ b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/PayInfoService.java @@ -0,0 +1,7 @@ +package com.muyu.cloud.market.service; + +import com.muyu.cloud.market.domin.Orders; + +public interface PayInfoService { + Orders selectByordersNum(String ordersNum); +} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/OrdersPayServiceImpl.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/OrdersPayServiceImpl.java deleted file mode 100644 index c85efc3..0000000 --- a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/OrdersPayServiceImpl.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.muyu.cloud.market.service.impl; - -import com.muyu.cloud.market.service.OrdersPayService; -import org.springframework.stereotype.Service; - -@Service -public class OrdersPayServiceImpl implements OrdersPayService { -} diff --git a/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/PayInfoServiceImpl.java b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/PayInfoServiceImpl.java new file mode 100644 index 0000000..035f9ab --- /dev/null +++ b/cloud-market-server/src/main/java/com/muyu/cloud/market/service/impl/PayInfoServiceImpl.java @@ -0,0 +1,13 @@ +package com.muyu.cloud.market.service.impl; + +import com.muyu.cloud.market.domin.Orders; +import com.muyu.cloud.market.service.PayInfoService; +import org.springframework.stereotype.Service; + +@Service +public class PayInfoServiceImpl implements PayInfoService { + @Override + public Orders selectByordersNum(String ordersNum) { + return null; + } +} diff --git a/cloud-market-server/src/main/resources/bootstrap.yml b/cloud-market-server/src/main/resources/bootstrap.yml index 51311eb..fa2424d 100644 --- a/cloud-market-server/src/main/resources/bootstrap.yml +++ b/cloud-market-server/src/main/resources/bootstrap.yml @@ -52,3 +52,8 @@ spring: # rabbit 配置文件 - application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + alipay: + appId: 9021000140633904 + appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCavSHP47iS43En9+MaR8ussAQmI9AbqhZYfb1yROE1ztMUmV9QJqmNiTdA2Tihn+srBG9AzVeJ/0XCqRlH8mFz5FXdsCG1M2EIPgiBYX58EJ565vAgHKRA/d/kKCA5MVkWYu6YiU/V2Pqw/X8K8/FNxXYvaHpjZwpjDqJCzvy4iK4DtM4QQoZRsVr0cOycYJSiC5A6+1wCpP4ZFNL9JdaQLCkLavAeRiRpwedtdW7B+malQEUomylZMwFaB0XJS+8oPlzqYf5RDyNYret4AZzfw0ke6fm3N7ygk3TTBZ9uKfqUNRHdpJ6/uIcHFE7MO16nyoxWHlM/u9i5vmxzhgKtAgMBAAECggEAdc+z85zUhXmHSL/x96tcBeGJdyRjKPzpwHwThfGtahNLIG7ZY6PcCbfECqqX9G5WVU0uCy+MC7QAgAHRDrcavWrGeV/FejlhEi5wuVjqPTlGABreDgTghd8E3Kg0SHcq9eFi+V3qG830qFaIqGUsfmLt5ZBtRktIXDzjC2yeezvV3IPHAQw5mTHmcbzz3WLJ8kuXV3gbOAPzV6Ig5pyp2NwdTMpg1Pn6Xfhf9reYnpkesW8Jph5c6P6bJZkQngC0TFQOpK3UfmFPq1dGfD5UcHjx1H4z09ny6rgXdRxvohDsgeiNmWY+rulzpQM8/DdUwwdmSACYAKgJSn6anCqzvQKBgQD6r/cEI/ShHZlLcS/vnc1W76KBpXx89luBo1NsbqwITSPKNktXpsocYuoxe4ednhBW69W71GfROQMw9zwiM1Gym9xs81Zys+IWySwd+J+T26Z1FoifPwW5ZA2cZYqzwZjg8Urw964cjZtmEhyBvGdzfRlFwvXi36ZB8b4wuOHsEwKBgQCeBJ/tGrGW15enkbmkCKSjFje7yVpjsB7ineuXd7QU3GVXNX9n35BvEcBkgx221woInEfyGsYnw13z1kwDPg2jh2tjVRSz2hjr7UNqeEXeuc366PHzoyJdl7K4ut7F5newzJhRqNKerLvTG8Ajta1NCnDevDVSYXgpso+Qw6iuPwKBgDWSJvJekKdhgOHLVVgaW8gpO4wDBkBaESH5+hjg6ah4e555zc30WZqJVMywPkHjhlBc43bZJDpkuZbcLqCMYPgPMKKjuaSXZkhCQ0hAWjGprb+1ygpl2F5O0E3MsUBKrdXcGoy2ESIO7Nd6JVdgIKdgY2cyC4OpEYlkFKWqzLS7AoGAQxR5g6D6VKuPAJ63LPBSW705yakPixQf+FnLwlAZjWWGS8A1JrZcTRo/Dywt+AlPhBo73IYLKqQgBTwqppG4HnyFVPSwRi1GuRjOrqsCFivQSjyLQb81/n9AanVBzscodlBUNQ4y4xM25MZ6CW69c+ADzDofdKpV5XWcxnqY5+cCgYEAoguI4wGcq1ULjOnt2BLhj2X4kU5UJZwFQuV8t5GDl9BoxO31qRCvu7cs3XtMsIaMn6Zvrg/bNjPF7sC1f0uXqCn3AlnVVTaG/jlI5QywJJflG33Hfa0K7j3ivGTU+AUL4LZbXOt9YR7vGjmItyAnZosdAogp50mOA1W0Jla+Aaw= + alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA7rRdHzrcyEdSOLPm3ITg+t/C3tGp9+wl739nOgFExrSD1j1C95tTRGUCqNUQtatiYmlAfwOKzkNhr/XEH/Vvpq5Ei8C4ZBWJqOMw7fQfBE6m5erO/FOuS4pyZCtQZyP9C5nhtYOupnGtq0fmgQaGKk657vszYSMEtpuQaZ5/odUYxRbYP3IHbcK+++PQBarfOdnhNcnR/Ry7TVOC3+da0dogmClPEconZQMwCJ81CJ7Hj4TKKyLTe9bz+J2tkUeNr9Mc72g4ljjftX7k0RBpBpi4HSHJ3SmPLhktiuDOeOGOef88pBgBtFV03/+aFpUEHx/imiHhBMBeNT3kqFV03QIDAQAB + notifyUrl: http://8wvpet.natappfree.cc/alipay/notify