فهرست منبع

支付宝手机网站支付

jason 3 سال پیش
والد
کامیت
2c60a3aafa
14فایلهای تغییر یافته به همراه204 افزوده شده و 21 حذف شده
  1. 3 1
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/PayOrderCoreService.java
  2. 20 4
      yudao-core-service/src/main/java/cn/iocoder/yudao/coreservice/modules/pay/service/order/impl/PayOrderCoreServiceImpl.java
  3. 7 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/config/PayProperties.java
  4. 2 1
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/PayClient.java
  5. 20 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/NotifyDataDTO.java
  6. 10 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderNotifyRespDTO.java
  7. 3 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/dto/PayOrderUnifiedReqDTO.java
  8. 4 0
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayPayCodeMapping.java
  9. 2 1
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayQrPayClient.java
  10. 33 8
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AlipayWapPayClient.java
  11. 4 3
      yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/wx/WXPubPayClient.java
  12. 28 1
      yudao-user-server/src/main/java/cn/iocoder/yudao/userserver/modules/pay/controller/order/PayOrderController.java
  13. 3 2
      yudao-user-server/src/main/resources/application-local.yaml
  14. 65 0
      yudao-user-server/src/main/resources/static/pay_alipay_wap.html

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

@@ -1,9 +1,11 @@
 package cn.iocoder.yudao.coreservice.modules.pay.service.order;
 
 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 javax.validation.Valid;
 
@@ -46,6 +48,6 @@ public interface PayOrderCoreService {
     * @param channelCode 渠道编码
     * @param notifyData 通知数据
     */
-   void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception;
+   void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception;
 
 }

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

@@ -18,6 +18,7 @@ import cn.iocoder.yudao.coreservice.modules.pay.service.merchant.PayChannelCoreS
 import cn.iocoder.yudao.coreservice.modules.pay.service.notify.PayNotifyCoreService;
 import cn.iocoder.yudao.coreservice.modules.pay.service.notify.dto.PayNotifyTaskCreateReqDTO;
 import cn.iocoder.yudao.coreservice.modules.pay.service.order.PayOrderCoreService;
+
 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;
@@ -26,6 +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.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import lombok.extern.slf4j.Slf4j;
@@ -135,9 +137,11 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
         // 调用三方接口
         PayOrderUnifiedReqDTO unifiedOrderReqDTO = PayOrderCoreConvert.INSTANCE.convert2(reqDTO);
         // 商户相关字段
+        //TODO jason @芋艿 是否加一个属性  如tradeNo 支付订单号, 用这个merchantOrderId让人迷糊
         unifiedOrderReqDTO.setMerchantOrderId(orderExtension.getNo()) // 注意,此处使用的是 PayOrderExtensionDO.no 属性!
                 .setSubject(order.getSubject()).setBody(order.getBody())
-                .setNotifyUrl(genChannelPayNotifyUrl(channel));
+                .setNotifyUrl(genChannelPayNotifyUrl(channel))
+                .setReturnUrl(genChannelReturnUrl(channel));
         // 订单相关字段
         unifiedOrderReqDTO.setAmount(order.getAmount()).setExpireTime(order.getExpireTime());
         CommonResult<?> unifiedOrderResult = client.unifiedOrder(unifiedOrderReqDTO);
@@ -149,6 +153,16 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
                 .setInvokeResponse(unifiedOrderResult.getData());
     }
 
+    /**
+     * 根据支付渠道的编码,生成支付渠道的返回地址
+     * @param channel
+     * @return
+     */
+    private String genChannelReturnUrl(PayChannelDO channel) {
+        return payProperties.getReturnUrl() + "/" + StrUtil.replace(channel.getCode(), "_", "-")
+                + "/" + channel.getId();
+    }
+
     /**
      * 根据支付渠道的编码,生成支付渠道的回调地址
      *
@@ -181,9 +195,9 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
 
     @Override
     @Transactional
-    public void notifyPayOrder(Long channelId, String channelCode, String notifyData) throws Exception {
+    public void notifyPayOrder(Long channelId, String channelCode, NotifyDataDTO notifyData) throws Exception {
         // TODO 芋艿,记录回调日志
-        log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData);
+        log.info("[notifyPayOrder][channelId({}) 回调数据({})]", channelId, notifyData.getOrigData());
 
         // 校验支付渠道是否有效
         PayChannelDO channel = payChannelCoreService.validPayChannel(channelId);
@@ -193,6 +207,7 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
             log.error("[notifyPayOrder][渠道编号({}) 找不到对应的支付客户端]", channel.getId());
             throw exception(PAY_CHANNEL_CLIENT_NOT_FOUND);
         }
+        //TODO @jason 校验 是否支付宝调用。 使用 支付宝publickey 或者payclient 加一个校验方法
         // 解析支付结果
         PayOrderNotifyRespDTO notifyRespDTO = client.parseOrderNotify(notifyData);
 
@@ -207,9 +222,10 @@ public class PayOrderCoreServiceImpl implements PayOrderCoreService {
             throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
         }
         // 1.2 更新 PayOrderExtensionDO
+        //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).build());
+                        .status(PayOrderStatusEnum.SUCCESS.getStatus()).channelNotifyData(notifyData.getOrigData()).build());
         if (updateCounts == 0) { // 校验状态,必须是待支付
             throw exception(PAY_ORDER_EXTENSION_STATUS_IS_NOT_WAITING);
         }

+ 7 - 0
yudao-framework/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/config/PayProperties.java

@@ -29,4 +29,11 @@ public class PayProperties {
     @URL(message = "退款回调地址的格式必须是 URL")
     private String refundNotifyUrl;
 
+
+    /**
+     * 支付完成的返回地址
+     */
+    @URL(message = "支付返回的地址的格式必须是 URL")
+    private String returnUrl;
+
 }

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

@@ -1,5 +1,6 @@
 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.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 
@@ -32,6 +33,6 @@ public interface PayClient {
      * @return 解析结果
      * @throws Exception 解析失败,抛出异常
      */
-    PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception;
+    PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception;
 
 }

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

@@ -0,0 +1,20 @@
+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 NotifyDataDTO {
+
+    private String origData;
+    //1:xml 2:form
+    private int format;
+
+    //form 格式的 data;
+    private Map<String,String> params;
+}

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

@@ -42,4 +42,14 @@ public class PayOrderNotifyRespDTO {
      */
     private String data;
 
+
+    /**
+     * TODO @jason 结合其他的渠道定义成枚举,
+     * alipay
+     * TRADE_CLOSED,未付款交易超时关闭,或支付完成后全额退款。
+     * TRADE_SUCCESS, 交易支付成功
+     * TRADE_FINISHED 	交易结束,不可退款。
+     */
+    private String tradeStatus;
+
 }

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

@@ -50,6 +50,9 @@ public class PayOrderUnifiedReqDTO {
     @URL(message = "支付结果的回调地址必须是 URL 格式")
     private String notifyUrl;
 
+    @URL(message = "支付结果的return 必须是 URL 格式")
+    private String returnUrl;
+
     // ========== 订单相关字段 ==========
 
     /**

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

@@ -18,6 +18,10 @@ public class AlipayPayCodeMapping extends AbstractPayCodeMapping {
         if (Objects.equals(apiCode, "10000")) {
             return GlobalErrorCodeConstants.SUCCESS;
         }
+        // alipay wap  api code 返回为null, 暂时定为-9999
+        if(Objects.equals(apiCode, "-9999")){
+            return GlobalErrorCodeConstants.SUCCESS;
+        }
         return null;
     }
 

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.pay.core.client.impl.alipay;
 
 import cn.hutool.core.bean.BeanUtil;
 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.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -68,7 +69,7 @@ public class AlipayQrPayClient extends AbstractPayClient<AlipayPayClientConfig>
     }
 
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
+    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws Exception {
         // TODO 芋艿:待完成
         return null;
     }

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

@@ -1,7 +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.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -14,6 +16,9 @@ import com.alipay.api.request.AlipayTradeWapPayRequest;
 import com.alipay.api.response.AlipayTradeWapPayResponse;
 import lombok.SneakyThrows;
 
+import java.util.Map;
+import java.util.Objects;
+
 /**
  * 支付宝【手机网站】的 PayClient 实现类
  * 文档:https://opendocs.alipay.com/apis/api_1/alipay.trade.wap.pay
@@ -45,12 +50,15 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
         model.setBody(reqDTO.getBody());
         model.setTotalAmount(calculateAmount(reqDTO.getAmount()).toString());
         model.setProductCode("QUICK_WAP_PAY"); // TODO 芋艿:这里咋整
-        model.setSellerId("2088102147948060"); // TODO 芋艿:这里咋整
-        // TODO 芋艿:userIp + expireTime
+        //TODO 芋艿:这里咋整  jason @芋艿 可以去掉吧,
+        //model.setSellerId("2088102147948060");
+        model.setTimeExpire(DateUtil.format(reqDTO.getExpireTime(),"yyyy-MM-dd HH:mm:ss"));
+        // TODO 芋艿:userIp
         // 构建 AlipayTradeWapPayRequest
         AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
         request.setBizModel(model);
-
+        request.setNotifyUrl(reqDTO.getNotifyUrl());
+        request.setReturnUrl(reqDTO.getReturnUrl());
         // 执行请求
         AlipayTradeWapPayResponse response;
         try {
@@ -58,13 +66,30 @@ public class AlipayWapPayClient extends AbstractPayClient<AlipayPayClientConfig>
         } catch (AlipayApiException e) {
             return PayCommonResult.build(e.getErrCode(), e.getErrMsg(), null, codeMapping);
         }
-//         TODO 芋艿:sub Code
-        return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
+
+        // TODO 芋艿:sub Code
+        if(response.isSuccess() && Objects.isNull(response.getCode()) && Objects.nonNull(response.getBody())){
+            //成功alipay wap 成功 code 为 null , body 为form 表单
+            return PayCommonResult.build("-9999", "Success", response, codeMapping);
+        }else {
+            return PayCommonResult.build(response.getCode(), response.getMsg(), response, codeMapping);
+        }
     }
 
+
+    /**
+     *  //https://opendocs.alipay.com/open/203/105286
+     * @param data 通知结果
+     * @return
+     * @throws Exception
+     */
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(String data) throws Exception {
-        // TODO 芋艿:待完成
-        return null;
+    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO 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();
     }
 }

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

@@ -8,6 +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.PayOrderNotifyRespDTO;
 import cn.iocoder.yudao.framework.pay.core.client.dto.PayOrderUnifiedReqDTO;
 import cn.iocoder.yudao.framework.pay.core.client.impl.AbstractPayClient;
@@ -131,14 +132,14 @@ public class WXPubPayClient extends AbstractPayClient<WXPayClientConfig> {
     }
 
     @Override
-    public PayOrderNotifyRespDTO parseOrderNotify(String data) throws WxPayException {
-        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data);
+    public PayOrderNotifyRespDTO parseOrderNotify(NotifyDataDTO data) throws WxPayException {
+        WxPayOrderNotifyResult notifyResult = client.parseOrderNotifyResult(data.getOrigData());
         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).build();
+                .data(data.getOrigData()).build();
     }
 
 }

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

@@ -6,17 +6,21 @@ 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.enums.PayChannelEnum;
 import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitReqVO;
 import cn.iocoder.yudao.userserver.modules.pay.controller.order.vo.PayOrderSubmitRespVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 
+import java.util.Map;
+
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.common.util.servlet.ServletUtils.getClientIP;
 
@@ -54,7 +58,7 @@ public class PayOrderController {
     @ApiOperation("通知微信公众号支付的结果")
     public String notifyWxPayOrder(@PathVariable("channelId") Long channelId,
                                    @RequestBody String xmlData) throws Exception {
-        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), xmlData);
+        payOrderCoreService.notifyPayOrder(channelId, PayChannelEnum.WX_PUB.getCode(), NotifyDataDTO.builder().origData(xmlData).build());
         return "success";
     }
 
@@ -72,4 +76,27 @@ public class PayOrderController {
         return "success";
     }
 
+    @PostMapping(value = "/notify/alipay-wap/{channelId}", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
+    @ApiOperation("支付宝wap页面回调")
+    public String notifyAliPayWapPayOrder(@PathVariable("channelId") Long channelId,
+                                          @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());
+        return "success";
+    }
+
+    /**
+     * https://opendocs.alipay.com/open/203/105285#%E5%89%8D%E5%8F%B0%E5%9B%9E%E8%B7%B3%E5%8F%82%E6%95%B0%E8%AF%B4%E6%98%8E
+     * @param channelId
+     * @return
+     * @throws Exception
+     */
+    @GetMapping(value = "/return/alipay-wap/{channelId}")
+    @ApiOperation("支付宝wap页面回跳")
+    public String returnAliPayWapPayOrder(@PathVariable("channelId") Long channelId){
+        //TODO @jason 校验 是否支付宝调用。 支付宝publickey 可以根据 appId 跳转不同的页面
+        return "支付成功";
+    }
+
 }

+ 3 - 2
yudao-user-server/src/main/resources/application-local.yaml

@@ -153,5 +153,6 @@ yudao:
       - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
   demo: false # 关闭演示模式
   pay:
-    pay-notify-url: http://niubi.natapp1.cc/api/pay/order/notify
-    refund-notify-url: http://niubi.natapp1.cc/api/pay/refund/notify
+    pay-notify-url: http://jg6rde.natappfree.cc/api/pay/order/notify
+    refund-notify-url: http://jg6rde.natappfree.cc/api/pay/refund/notify
+    return-url: http://jg6rde.natappfree.cc/api/pay/order/return

+ 65 - 0
yudao-user-server/src/main/resources/static/pay_alipay_wap.html

@@ -0,0 +1,65 @@
+<!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>
+</head>
+<body>
+<div>点击如下按钮,发起支付的测试</div>
+<div>
+    <button id="alipay_wap">支付宝h5</button>
+</div>
+<div id="dynamic_form"></div>
+</body>
+<script>
+    let shopOrderId = undefined;
+    let payOrderId = undefined;
+     let server = 'http://127.0.0.1:28080';
+    //let server = 'http://niubi.natapp1.cc';
+    // TODO openid
+    //let openid = "ockUAwIZ-0OeMZl9ogcZ4ILrGba0";
+    $(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_wap'
+            }),
+            success: function( result ) {
+                if (result.code !== 0) {
+                    alert('提交支付订单失败,原因:' + result.msg)
+                    return;
+                }
+                alert('点击确定,开始支付');
+                // 开始调用微信支付
+                let data = result.data.invokeResponse;
+                $("#dynamic_form").html(data.body);
+            }
+        })
+    });
+</script>
+</html>