Procházet zdrojové kódy

tina提交支付宝扫码支付

ouyang před 3 roky
rodič
revize
461c6a0007
13 změnil soubory, kde provedl 169 přidání a 46 odebrání
  1. 0 0
      sql/ruoyi-vue-pro.sql
  2. 2 2
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java
  3. 4 4
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java
  4. 25 0
      yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java
  5. 3 2
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java
  6. 0 23
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/NotifyDataDTO.java
  7. 21 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayNotifyDataDTO.java
  8. 13 4
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
  9. 3 3
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
  10. 4 4
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java
  11. 15 4
      yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java
  12. 79 0
      yudao-user-server/src/main/resources/static/pay_alipay_qr.html
  13. 0 0
      yudao-user-server/src/main/resources/static/qrcode.min.js

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
sql/ruoyi-vue-pro.sql


+ 2 - 2
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java

@@ -5,7 +5,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.order.PayOrderDO;
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderCreateReqDTO;
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 
 import javax.validation.Valid;
 
@@ -48,6 +48,6 @@ public interface PayOrderCoreService {
     * @param channelCode 渠道编码
     * @param notifyData 通知数据
     */
-   void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception;
+   void notifyPayOrder(Long channelId, String channelCode, PayNotifyDataDTO notifyData) throws Exception;
 
 }

+ 4 - 4
yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java

@@ -27,7 +27,7 @@ import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
 import cn.iocoder.yudao.framework.pay.config.PayProperties;
 import cn.iocoder.yudao.framework.pay.core.client.PayClient;
 import cn.iocoder.yudao.framework.pay.core.client.PayClientFactory;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import lombok.extern.slf4j.Slf4j;
@@ -195,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
 
     @Override
     @Transactional
-    public void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception {
+    public void notifyPayOrder(Long channelId, String channelCode, PayNotifyDataDTO notifyData) throws Exception {
         // TODO 芋艿,记录回调日志
-        log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getOrigData());
+        log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getBody());
 
         // 校验支付渠道是否有效
         PayChannelDO channel = payChannelCoreService.validPayChannel(channelId);
@@ -225,7 +225,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
         //TODO @jason notifyRespDTO.getTradeStatus() 需要根据不同的状态更新成不同的值 PayOrderStatusEnum
         int updateCounts = payOrderExtensionCoreMapper.updateByIdAndStatus(orderExtension.getId(),
                 PayOrderStatusEnum.WAITING.getStatus(), PayOrderExtensionDO.builder().id(orderExtension.getId())
-                        .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getOrigData()).build());
+                        .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getBody()).build());
         if (updateCounts == 0) { // 校验状态,必须是待支付
             throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
         }

+ 25 - 0
yudao-core-service/src/test-integration/java/cn/iocoder/yudao/coreservice/modules/pay/dal/mysql/merchant/PayChannelCoreMapperTest.java

@@ -4,6 +4,7 @@ import cn.hutool.core.io.IoUtil;
 import cn.iocoder.yudao.coreservice.BaseDbAndRedisIntegrationTest;
 import cn.iocoder.yudao.coreservice.modules.pay.dal.dataobject.merchant.PayChannelDO;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.pay.core.client.impl.alipay.AlipayPayClientConfig;
 import cn.iocoder.yudao.framework.pay.core.client.impl.wx.WXPayClientConfig;
 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
 import org.junit.jupiter.api.Test;
@@ -44,6 +45,30 @@ public class PayChannelCoreMapperTest extends BaseDbAndRedisIntegrationTest {
         payChannelCoreMapper.insert(payChannelDO);
     }
 
+    /**
+     * 插入支付宝 初始配置
+     */
+    @Test
+    public void testInsertZfb() throws FileNotFoundException {
+        PayChannelDO payChannelDO = new PayChannelDO();
+        payChannelDO.setCode(PayChannelEnum.ALIPAY_QR.getCode());
+        payChannelDO.setStatus(CommonStatusEnum.ENABLE.getStatus());
+        payChannelDO.setFeeRate(1D);
+        payChannelDO.setMerchantId(1L);
+        payChannelDO.setAppId(6L);
+        // 配置
+        AlipayPayClientConfig config = new AlipayPayClientConfig();
+        config.setAppId("2021000118634035");
+        config.setServerUrl(AlipayPayClientConfig.SERVER_URL_SANDBOX);
+        config.setSignType(AlipayPayClientConfig.SIGN_TYPE_DEFAULT);
+        config.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCHsEV1cDupwJv890x84qbppUtRIfhaKSwSVN0thCcsDCaAsGR5MZslDkO8NCT9V4r2SVXjyY7eJUZlZd1M0C8T01Tg4UOx5LUbic0O3A1uJMy6V1n9IyYwbAW3AEZhBd5bSbPgrqvmv3NeWSTQT6Anxnllf+2iDH6zyA2fPl7cYyQtbZoDJQFGqr4F+cGh2R6akzRKNoBkAeMYwoY6es2lX8sJxCVPWUmxNUoL3tScwlSpd7Bxw0q9c/X01jMwuQ0+Va358zgFiGERTE6yD01eu40OBDXOYO3z++y+TAYHlQQ2toMO63trepo88X3xV3R44/1DH+k2pAm2IF5ixiLrAgMBAAECggEAPx3SoXcseaD7rmcGcE0p4SMfbsUDdkUSmBBbtfF0GzwnqNLkWa+mgE0rWt9SmXngTQH97vByAYmLPl1s3G82ht1V7Sk7yQMe74lhFllr8eEyTjeVx3dTK1EEM4TwN+936DTXdFsr4TELJEcJJdD0KaxcCcfBLRDs2wnitEFZ9N+GoZybVmY8w0e0MI7PLObUZ2l0X4RurQnfG9ZxjXjC7PkeMVv7cGGylpNFi3BbvkRhdhLPDC2E6wqnr9e7zk+hiENivAezXrtxtwKovzCtnWJ1r0IO14Rh47H509Ic0wFnj+o5YyUL4LdmpL7yaaH6fM7zcSLFjNZPHvZCKPwYcQKBgQDQFho98QvnL8ex4v6cry4VitGpjSXm1qP3vmMQk4rTsn8iPWtcxPjqGEqOQJjdi4Mi0VZKQOLFwlH0kl95wNrD/isJ4O1yeYfX7YAXApzHqYNINzM79HemO3Yx1qLMW3okRFJ9pPRzbQ9qkTpsaegsmyX316zOBhzGRYjKbutTYwKBgQCm7phr9XdFW5Vh+XR90mVs483nrLmMiDKg7YKxSLJ8amiDjzPejCn7i95Hah08P+2MIZLIPbh2VLacczR6ltRRzN5bg5etFuqSgfkuHyxpoDmpjbe08+Q2h8JBYqcC5Nhv1AKU4iOUhVLHo/FBAQliMcGc/J3eiYTFC7EsNx382QKBgClb20doe7cttgFTXswBvaUmfFm45kmla924B7SpvrQpDD/f+VDtDZRp05fGmxuduSjYdtA3aVtpLiTwWu22OUUvZZqHDGruYOO4Hvdz23mL5b4ayqImCwoNU4bAZIc9v18p/UNf3/55NNE3oGcf/bev9rH2OjCQ4nM+Ktwhg8CFAoGACSgvbkShzUkv0ZcIf9ppu+ZnJh1AdGgINvGwaJ8vQ0nm/8h8NOoFZ4oNoGc+wU5Ubops7dUM6FjPR5e+OjdJ4E7Xp7d5O4J1TaIZlCEbo5OpdhaTDDcQvrkFu+Z4eN0qzj+YAKjDAOOrXc4tbr5q0FsgXscwtcNfaBuzFVTUrUkCgYEAwzPnMNhWG3zOWLUs2QFA2GP4Y+J8cpUYfj6pbKKzeLwyG9qBwF1NJpN8m+q9q7V9P2LY+9Lp9e1mGsGeqt5HMEA3P6vIpcqLJLqE/4PBLLRzfccTcmqb1m71+erxTRhHBRkGS+I7dZEb3olQfnS1Y1tpMBxiwYwR3LW4oXuJwj8=");
+        config.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnq90KnF4dTnlzzmxpujbI05OYqi5WxAS6cL0gnZFv2gK51HExF8v/BaP7P979PhFMgWTqmOOI+Dtno5s+yD09XTY1WkshbLk6i4g2Xlr8fyW9ODnkU88RI2w9UdPhQU4cPPwBNlrsYhKkVK2OxwM3kFqjoBBY0CZoZCsSQ3LDH5WeZqPArlsS6xa2zqJBuuoKjMrdpELl3eXSjP8K54eDJCbeetCZNKWLL3DPahTPB7LZikfYmslb0QUvCgGapD0xkS7eVq70NaL1G57MWABs4tbfWgxike4Daj3EfUrzIVspQxj7w8HEj9WozJPgL88kSJSits0pqD3n5r8HSuseQIDAQAB");
+        // 创建客户端
+        payChannelDO.setConfig(config);
+        // 执行插入
+        payChannelCoreMapper.insert(payChannelDO);
+    }
+
     /**
      * 查询所有支付配置,看看是否都是 ok 的
      */

+ 3 - 2
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.framework.pay.core.client;
 
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 
@@ -33,6 +34,6 @@ public interface PayClient {
      * @return 解析结果
      * @throws Exception 解析失败,抛出异常
      */
-    PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception;
+    PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception;
 
 }

+ 0 - 23
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/NotifyDataDTO.java

@@ -1,23 +0,0 @@
-package cn.iocoder.yudao.framework.pay.core.client.dto;
-
-import lombok.Builder;
-import lombok.Data;
-import lombok.ToString;
-
-import java.util.Map;
-
-// TODO @jason:NotifyDataDTO=》PayNotifyDataDTO。另外注释记得加起来哈
-@Data
-@ToString
-@Builder
-public class NotifyDataDTO {
-
-    // TODO @jason:这个字段,改成 body
-    private String origData;
-    // TODO @jason:这个字段如果暂时没用,可以去掉。
-    //1:xml 2:form
-    private int format;
-
-    //form 格式的 data;
-    private Map<String,String> params;
-}

+ 21 - 0
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayNotifyDataDTO.java

@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.framework.pay.core.client.dto;
+
+import lombok.Builder;
+import lombok.Data;
+import lombok.ToString;
+
+import java.util.Map;
+
+
+@Data
+@ToString
+@Builder
+public class PayNotifyDataDTO {
+
+    //返回的所有参数
+    private String body;
+
+
+    //form 格式的 data;
+    private Map<String,String> params;
+}

+ 13 - 4
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java

@@ -1,8 +1,9 @@
 package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -16,6 +17,8 @@ import com.alipay.api.response.AlipayTradePrecreateResponse;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 
+import java.util.Map;
+
 import static cn.iocoder.yudao.framework.common.util.json.JsonUtils.toJsonString;
 
 /**
@@ -69,8 +72,14 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig>
     }
 
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
-        // TODO 芋艿:待完成
-        return null;
+    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception {
+        //结果转换
+        Map<String, String> params = data.getParams();
+        return  PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no"))
+                .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id"))
+                .tradeStatus(params.get("trade_status"))
+                .successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss"))
+                .data(data.getBody()).build();
+
     }
 }

+ 3 - 3
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.date.DateUtil;
 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -85,13 +85,13 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
      * @throws Exception
      */
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
+    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws Exception {
         Map<String, String> params = data.getParams();
         return  PayOrderNotifyRespDTO.builder().orderExtensionNo(params.get("out_trade_no"))
                 .channelOrderNo(params.get("trade_no")).channelUserId(params.get("seller_id"))
                 .tradeStatus(params.get("trade_status"))
                 .successTime(DateUtil.parse(params.get("notify_time"), "yyyy-MM-dd HH:mm:ss"))
-                .data(data.getOrigData()).build();
+                .data(data.getBody()).build();
     }
 
 }

+ 4 - 4
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java

@@ -8,7 +8,7 @@ import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.util.io.FileUtils;
 import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
 import cn.iocoder.yudao.framework.pay.core.client.PayCommonResult;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -132,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
     }
 
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException {
-        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData());
+    public PayOrderNotifyRespDTO parseOrderNotify(PayNotifyDataDTO data) throws WxPayException {
+        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getBody());
         Assert.isTrue(Objects.equals(notifyResult.getResultCode(), "SUCCESS"), "支付结果非 SUCCESS");
         // 转换结果
         return PayOrderNotifyRespDTO.builder().orderExtensionNo(notifyResult.getOutTradeNo())
                 .channelOrderNo(notifyResult.getTransactionId()).channelUserId(notifyResult.getOpenid())
                 .successTime(DateUtil.parse(notifyResult.getTimeEnd(), "yyyyMMddHHmmss"))
-                .data(data.getOrigData()).build();
+                .data(data.getBody()).build();
     }
 
 }

+ 15 - 4
yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java

@@ -6,7 +6,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreServic
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitReqDTO;
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.dto.PayOrderSubmitRespDTO;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.pay.core.client.dto.NotifyDataDTO;
+import cn.iocoder.yudao.framework.pay.core.client.dto.PayNotifyDataDTO;
 import cn.iocoder.yudao.framework.pay.core.enums.PayChannelEnum;
 import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO;
 import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO;
@@ -58,14 +58,17 @@ public class PayOrderController {
     @ApiOperation("通知微信公众号支付的结果")
     public String notifyWxPayOrder(@PathVariable("channelId") Long channelId,
                                    @RequestBody String xmlData) throws Exception {
-        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), NotifyDataDTO.builder().origData(xmlData).build());
+        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), PayNotifyDataDTO.builder().body(xmlData).build());
         return "success";
     }
 
     @PostMapping("/notify/alipay-qr/{channelId}")
     @ApiOperation("通知支付宝扫码支付的结果")
     public String notifyAlipayQrPayOrder(@PathVariable("channelId") Long channelId,
-                                         @RequestBody String data) {
+                                         @RequestParam Map<String, String> params,
+                                         @RequestBody String originData) throws Exception{
+        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_QR.getCode(),
+                PayNotifyDataDTO.builder().params(params).body(originData).build());
         return "success";
     }
 
@@ -82,7 +85,7 @@ public class PayOrderController {
                                           @RequestParam Map<String, String> params,
                                           @RequestBody String originData) throws Exception {
         //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey payclient 或许加一个校验方法
-        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), NotifyDataDTO.builder().params(params).origData(originData).build());
+        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.ALIPAY_WAP.getCode(), PayNotifyDataDTO.builder().params(params).body(originData).build());
         return "success";
     }
 
@@ -100,4 +103,12 @@ public class PayOrderController {
         return "支付成功";
     }
 
+
+    @GetMapping(value = "/return/alipay-qr/{channelId}")
+    @ApiOperation("支付宝wap页面回跳")
+    public String returnAliPayQrPayOrder(@PathVariable("channelId") Long channelId){
+        //TODO @jason 校验 是否支付宝调用。 支付宝publickey 可以根据 appId 跳转不同的页面
+        System.out.println("支付成功");
+        return "支付成功";
+    }
 }

+ 79 - 0
yudao-user-server/src/main/resources/static/pay_alipay_qr.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="UTF-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"/>
+    <title>支付测试页</title>
+    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.0/jquery.js"></script>
+    <script src="qrcode.min.js" type="text/javascript"></script>
+
+</head>
+<body>
+<div>点击如下按钮,发起支付宝扫码支付的测试</div>
+<div>
+    <button id="alipay_wap">支付宝扫码支付</button>
+</div>
+<div  id="qrcode"></div>
+</body>
+<style>
+    #qrcode{
+        padding-left: 20px;
+        padding-top: 20px;
+    }
+</style>
+<script>
+    let shopOrderId = undefined;
+    let payOrderId = undefined;
+     let server = 'http://127.0.0.1:28080';
+    $(function() {
+        // 自动发起商城订单编号
+        $.ajax({
+            url: server + "/api/shop/order/create",
+            method: 'POST',
+            success: function( result ) {
+                if (result.code !== 0) {
+                    alert('创建商城订单失败,原因:' + result.msg)
+                    return;
+                }
+                shopOrderId = result.data.id;
+                payOrderId = result.data.payOrderId;
+                console.log("商城订单:" + shopOrderId)
+                console.log("支付订单:" + payOrderId)
+            }
+        })
+    });
+    // 支付宝扫码支付
+    $( "#alipay_wap").on( "click", function() {
+        // 提交支付
+        $.ajax({
+            url: server + "/api/pay/order/submit",
+            method: 'POST',
+            dataType: "json",
+            contentType: "application/json",
+            data: JSON.stringify({
+                "id": payOrderId,
+                "channelCode": 'alipay_qr'
+            }),
+            success: function( result ) {
+                if (result.code !== 0) {
+                    alert('提交支付订单失败,原因:' + result.msg)
+                    return;
+                }
+                //提交支付后返回的参数
+                let data = result.data.invokeResponse;
+                new QRCode($("#qrcode")[0],{
+                    text: data.qrCode, //内容
+                    width:98, //宽度
+                    height:98, //高度
+                    correctLevel: 3,//二维码纠错级别
+                    background: "#ffffff",//背景颜色
+                    foreground: "#000000"//二维码颜色
+                });
+
+                console.log("data.qrCode===",data.qrCode)
+
+            }
+        })
+    });
+</script>
+</html>

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 0 - 0
yudao-user-server/src/main/resources/static/qrcode.min.js


Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů