Browse Source

新增支付

xiaoshushu 4 years ago
parent
commit
6b6977b51a
22 changed files with 1035 additions and 103 deletions
  1. 0 15
      ruoyi-admin/pom.xml
  2. 82 0
      ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/shop/TbOrdersController.java
  3. 0 87
      ruoyi-admin/src/main/java/com/ruoyi/web/util/PushUtil.java
  4. 27 0
      ruoyi-app/pom.xml
  5. 4 0
      ruoyi-app/src/main/java/com/ruoyi/app/config/InterceptorConfig.java
  6. 1 0
      ruoyi-app/src/main/java/com/ruoyi/app/controller/base/AppBaseController.java
  7. 18 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/AbstractAliPayApiController.java
  8. 19 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/AbstractWxPayApiController.java
  9. 111 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayBean.java
  10. 134 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayController.java
  11. 38 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayInterceptor.java
  12. 84 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayBean.java
  13. 151 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayController.java
  14. 37 0
      ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayInterceptor.java
  15. 8 0
      ruoyi-app/src/main/resources/alipay.properties
  16. 6 0
      ruoyi-app/src/main/resources/wxpay.properties
  17. 1 1
      ruoyi-system/src/main/java/com/ruoyi/app/shop/goods/mapper/TbGoodsMapper.java
  18. 112 0
      ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/domain/TbOrders.java
  19. 34 0
      ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/mapper/TbOrdersMapper.java
  20. 34 0
      ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/service/ITbOrdersService.java
  21. 43 0
      ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/service/impl/TbOrdersServiceImpl.java
  22. 91 0
      ruoyi-system/src/main/resources/mapper/app/shop/TbOrdersMapper.xml

+ 0 - 15
ruoyi-admin/pom.xml

@@ -15,14 +15,6 @@
         web服务入口
     </description>
 
-    <!--消息推送(个推)的私服仓库 没有私服仓库下载不了包-->
-    <repositories>
-        <repository>
-            <id>getui-nexus</id>
-            <url>http://mvn.gt.getui.com/nexus/content/repositories/releases/</url>
-        </repository>
-    </repositories>
-
     <dependencies>
 
         <!-- spring-boot-devtools -->
@@ -56,13 +48,6 @@
             <artifactId>ruoyi-generator</artifactId>
         </dependency>
 
-        <!--消息推送(个推)-->
-        <dependency>
-            <groupId>com.gexin.platform</groupId>
-            <artifactId>gexin-rp-sdk-http</artifactId>
-            <version>4.1.1.4</version>
-        </dependency>
-
     </dependencies>
 
     <build>

+ 82 - 0
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/shop/TbOrdersController.java

@@ -0,0 +1,82 @@
+package com.ruoyi.web.controller.api.shop;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+import com.ruoyi.app.shop.orders.service.ITbOrdersService;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.page.TableDataInfo;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.StringUtils;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 订单
+ *
+ * @author lsw
+ * @date 2020-10-13
+ */
+@RequiredArgsConstructor(onConstructor_ = @Autowired)
+@RestController
+@RequestMapping("/system/shop/orders")
+public class TbOrdersController extends BaseController {
+
+    private final ITbOrdersService iTbOrdersService;
+
+    /**
+     * 查询订单列表
+     */
+    @PreAuthorize("@ss.hasPermi('system:orders:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(TbOrders tbOrders) {
+        startPage();
+        List<TbOrders> list = iTbOrdersService.selectTbOrdersList(tbOrders);
+        return getDataTable(list);
+    }
+
+    /**
+     * 获取订单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('system:orders:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id) {
+        return AjaxResult.success(iTbOrdersService.selectTbOrdersById(id));
+    }
+
+    /**
+     * 新增订单
+     */
+    @PreAuthorize("@ss.hasPermi('system:orders:add')")
+    @Log(title = "订单", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody TbOrders tbOrders) {
+        return toAjax(iTbOrdersService.save(tbOrders) ? 1 : 0);
+    }
+
+    /**
+     * 修改订单
+     */
+    @PreAuthorize("@ss.hasPermi('system:orders:edit')")
+    @Log(title = "订单", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody TbOrders tbOrders) {
+        return toAjax(iTbOrdersService.updateById(tbOrders) ? 1 : 0);
+    }
+
+    /**
+     * 删除订单
+     */
+    @PreAuthorize("@ss.hasPermi('system:orders:remove')")
+    @Log(title = "订单", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids) {
+        return toAjax(iTbOrdersService.removeByIds(Arrays.asList(ids)) ? 1 : 0);
+    }
+}

+ 0 - 87
ruoyi-admin/src/main/java/com/ruoyi/web/util/PushUtil.java

@@ -1,87 +0,0 @@
-package com.ruoyi.web.util;
-
-import com.gexin.rp.sdk.base.IPushResult;
-import com.gexin.rp.sdk.base.impl.SingleMessage;
-import com.gexin.rp.sdk.base.impl.Target;
-import com.gexin.rp.sdk.exceptions.RequestException;
-import com.gexin.rp.sdk.http.IGtPush;
-import com.gexin.rp.sdk.template.NotificationTemplate;
-import com.gexin.rp.sdk.template.style.Style0;
-
-/**
- * 消息推送
- */
-public class PushUtil {
-    private final static String appId = "rlkT6LWklcAc9seQ0Mgmd4";
-    private final static String appKey = "R1DY7xeIYX5Q7SlUUroqk5";
-    private final static String masterSecret = "g734fGD00z8p4jntlq4h5";
-    private final static String host = "http://sdk.open.api.igexin.com/apiex.htm";
-
-
-    /**
-     * @param title     消息标题 例如家族消息
-     * @param text      消息内容 例如余震申请加入陕西凤翔余姓家族
-     * @param client_id 设备标识
-     * @return true|false
-     */
-    public static boolean sendMessage(String title, String text, String client_id) {
-        // 设置后,根据别名推送,会返回每个cid的推送结果
-        IGtPush push = new IGtPush(host, appKey, masterSecret);
-        NotificationTemplate template = getNotificationTemplate(title, text);
-        SingleMessage message = new SingleMessage();
-        message.setOffline(true);
-        // 离线有效时间,单位为毫秒
-        message.setOfflineExpireTime(24 * 3600 * 1000);
-        message.setData(template);
-        // 可选,1为wifi,0为不限制网络环境。根据手机处于的网络情况,决定是否下发
-        message.setPushNetWorkType(0);
-        // 厂商通道下发策略
-        message.setStrategyJson("{\"default\":4,\"ios\":4,\"st\":4}");
-        Target target = new Target();
-        target.setAppId(appId);
-        target.setClientId(client_id);
-        IPushResult ret;
-        try {
-            ret = push.pushMessageToSingle(message, target);
-        } catch (RequestException e) {
-            e.printStackTrace();
-            ret = push.pushMessageToSingle(message, target, e.getRequestId());
-        }
-        if (ret.getResponse().get("result").toString().equals("ok")) {
-            return true;
-        }
-        System.out.println("消息推送:" + ret.getResponse().toString());
-        return false;
-
-    }
-
-    public static void main(String[] args) {
-        boolean s = sendMessage("家族通知", "余震申请加入", "cd3cf4bdf4b535d968455b2441aef0ec");
-        System.out.println("ssss:" + s);
-    }
-
-    private static NotificationTemplate getNotificationTemplate(String title, String text) {
-        NotificationTemplate template = new NotificationTemplate();
-        //设置APPID与APPKEY
-        template.setAppId(appId);
-        template.setAppkey(appKey);
-
-        Style0 style = new Style0();
-        // 设置通知栏标题与内容
-        style.setTitle(title);
-        style.setText(text);
-        // 设置通知是否响铃,震动,或者可清除
-        style.setRing(true);
-        style.setVibrate(true);
-        style.setClearable(true);
-        style.setChannel("通知渠道id");
-        style.setChannelName("通知渠道名称");
-        style.setChannelLevel(3); //设置通知渠道重要性
-        template.setStyle(style);
-
-        template.setTransmissionType(1);  // 透传消息接受方式设置,1:立即启动APP,2:客户端收到消息后需要自行处理
-        template.setTransmissionContent("请输入您要透传的内容");
-
-        return template;
-    }
-}

+ 27 - 0
ruoyi-app/pom.xml

@@ -15,6 +15,14 @@
         app服务入口
     </description>
 
+    <!--消息推送(个推)的私服仓库 没有私服仓库下载不了包-->
+    <repositories>
+        <repository>
+            <id>getui-nexus</id>
+            <url>http://mvn.gt.getui.com/nexus/content/repositories/releases/</url>
+        </repository>
+    </repositories>
+
     <dependencies>
 
         <!-- spring-boot-devtools -->
@@ -65,6 +73,25 @@
             <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
             <version>1.1.0</version>
         </dependency>
+
+        <!--微信支付-->
+        <dependency>
+            <groupId>com.github.javen205</groupId>
+            <artifactId>IJPay-WxPay</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <!--支付宝支付-->
+        <dependency>
+            <groupId>com.github.javen205</groupId>
+            <artifactId>IJPay-AliPay</artifactId>
+            <version>2.7.0</version>
+        </dependency>
+        <!--消息推送(个推)-->
+        <dependency>
+            <groupId>com.gexin.platform</groupId>
+            <artifactId>gexin-rp-sdk-http</artifactId>
+            <version>4.1.1.4</version>
+        </dependency>
     </dependencies>
 
     <build>

+ 4 - 0
ruoyi-app/src/main/java/com/ruoyi/app/config/InterceptorConfig.java

@@ -1,6 +1,8 @@
 package com.ruoyi.app.config;
 
 import com.ruoyi.app.interceptor.AuthenticationInterceptor;
+import com.ruoyi.app.pay.AliPayInterceptor;
+import com.ruoyi.app.pay.WxPayInterceptor;
 import com.ruoyi.app.resolver.LoginAppUserHandlerMethodArgumentResolver;
 import com.ruoyi.common.config.RuoYiConfig;
 import com.ruoyi.common.constant.Constants;
@@ -43,6 +45,8 @@ public class InterceptorConfig implements WebMvcConfigurer {
     public void addInterceptors(InterceptorRegistry registry) {
         registry.addInterceptor(authenticationInterceptor()).addPathPatterns("/**")
                 .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**","/druid/**");
+        registry.addInterceptor(new WxPayInterceptor());
+        registry.addInterceptor(new AliPayInterceptor());
     }
     @Bean
     public AuthenticationInterceptor authenticationInterceptor() {

+ 1 - 0
ruoyi-app/src/main/java/com/ruoyi/app/controller/base/AppBaseController.java

@@ -71,6 +71,7 @@ public class AppBaseController {
         rspData.setMsg("查询成功");
         rspData.setRows(list);
         rspData.setTotal(new PageInfo(list).getTotal());
+        rspData.setPages(new PageInfo(list).getPages());
         return rspData;
     }
 

+ 18 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/AbstractAliPayApiController.java

@@ -0,0 +1,18 @@
+package com.ruoyi.app.pay;
+
+import com.alipay.api.AlipayApiException;
+import com.ijpay.alipay.AliPayApiConfig;
+import com.ruoyi.common.core.controller.BaseController;
+
+/**
+ * @author Javen
+ */
+public abstract class AbstractAliPayApiController extends BaseController {
+    /**
+     * 获取支付宝配置
+     *
+     * @return {@link AliPayApiConfig} 支付宝配置
+     * @throws AlipayApiException 支付宝 Api 异常
+     */
+    public abstract AliPayApiConfig getApiConfig() throws AlipayApiException;
+}

+ 19 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/AbstractWxPayApiController.java

@@ -0,0 +1,19 @@
+package com.ruoyi.app.pay;
+
+
+import com.ijpay.wxpay.WxPayApiConfig;
+import com.ruoyi.common.core.controller.BaseController;
+
+/**
+ * @author Javen
+ */
+public abstract class AbstractWxPayApiController extends BaseController {
+    /**
+     * 获取微信支付配置
+     *
+     * @return {@link WxPayApiConfig} 微信支付配置
+     */
+    public abstract WxPayApiConfig getApiConfig();
+
+
+}

+ 111 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayBean.java

@@ -0,0 +1,111 @@
+package com.ruoyi.app.pay;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
+ *
+ * <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
+ *
+ * <p>IJPay 交流群: 723992875</p>
+ *
+ * <p>Node.js 版: https://gitee.com/javen205/TNWX</p>
+ *
+ * <p>支付宝配置 Bean</p>
+ *
+ * @author Javen
+ */
+@Component
+@PropertySource("classpath:/alipay.properties")
+@ConfigurationProperties(prefix = "alipay")
+public class AliPayBean {
+    private String appId;
+    private String privateKey;
+    private String publicKey;
+    private String appCertPath;
+    private String aliPayCertPath;
+    private String aliPayRootCertPath;
+    private String serverUrl;
+    private String domain;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getPrivateKey() {
+        return privateKey;
+    }
+
+    public void setPrivateKey(String privateKey) {
+        this.privateKey = privateKey;
+    }
+
+    public String getPublicKey() {
+        return publicKey;
+    }
+
+    public void setPublicKey(String publicKey) {
+        this.publicKey = publicKey;
+    }
+
+    public String getAppCertPath() {
+        return appCertPath;
+    }
+
+    public void setAppCertPath(String appCertPath) {
+        this.appCertPath = appCertPath;
+    }
+
+    public String getAliPayCertPath() {
+        return aliPayCertPath;
+    }
+
+    public void setAliPayCertPath(String aliPayCertPath) {
+        this.aliPayCertPath = aliPayCertPath;
+    }
+
+    public String getAliPayRootCertPath() {
+        return aliPayRootCertPath;
+    }
+
+    public void setAliPayRootCertPath(String aliPayRootCertPath) {
+        this.aliPayRootCertPath = aliPayRootCertPath;
+    }
+
+    public String getServerUrl() {
+        return serverUrl;
+    }
+
+    public void setServerUrl(String serverUrl) {
+        this.serverUrl = serverUrl;
+    }
+
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    @Override
+    public String toString() {
+        return "AliPayBean{" +
+                "appId='" + appId + '\'' +
+                ", privateKey='" + privateKey + '\'' +
+                ", publicKey='" + publicKey + '\'' +
+                ", appCertPath='" + appCertPath + '\'' +
+                ", aliPayCertPath='" + aliPayCertPath + '\'' +
+                ", aliPayRootCertPath='" + aliPayRootCertPath + '\'' +
+                ", serverUrl='" + serverUrl + '\'' +
+                ", domain='" + domain + '\'' +
+                '}';
+    }
+}

+ 134 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayController.java

@@ -0,0 +1,134 @@
+package com.ruoyi.app.pay;
+
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.domain.AlipayTradeAppPayModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.ijpay.alipay.AliPayApi;
+import com.ijpay.alipay.AliPayApiConfig;
+import com.ijpay.alipay.AliPayApiConfigKit;
+import com.ijpay.core.kit.WxPayKit;
+import com.ruoyi.app.annotation.PassToken;
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+import com.ruoyi.app.shop.orders.service.ITbOrdersService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 支付宝支付
+ */
+@RestController
+@RequestMapping("/app/aliPay")
+public class AliPayController extends AbstractAliPayApiController {
+
+    @Autowired
+    private AliPayBean aliPayBean;
+
+    @Autowired
+    ITbOrdersService service;
+    /**
+     * 普通公钥模式
+     */
+    private final static String NOTIFY_URL = "app/aliPay/notify_url";
+
+    @Override
+    public AliPayApiConfig getApiConfig() {
+        AliPayApiConfig aliPayApiConfig;
+        try {
+            aliPayApiConfig = AliPayApiConfigKit.getApiConfig(aliPayBean.getAppId());
+        } catch (Exception e) {
+            aliPayApiConfig = AliPayApiConfig.builder()
+                    .setAppId(aliPayBean.getAppId())
+                    .setAliPayPublicKey(aliPayBean.getPublicKey())
+                    .setAppCertPath(aliPayBean.getAppCertPath())
+                    .setAliPayCertPath(aliPayBean.getAliPayCertPath())
+                    .setAliPayRootCertPath(aliPayBean.getAliPayRootCertPath())
+                    .setCharset("UTF-8")
+                    .setPrivateKey(aliPayBean.getPrivateKey())
+                    .setServiceUrl(aliPayBean.getServerUrl())
+                    .setSignType("RSA2")
+                    // 普通公钥方式
+                    .build();
+
+        }
+        return aliPayApiConfig;
+    }
+
+    /**
+     * app支付
+     */
+    @PostMapping(value = "/appPay")
+    public AjaxResult appPay(@RequestBody TbOrders order) {
+        if (order == null) {
+            return AjaxResult.error("订单无效");
+        }
+        //用户第一次未支付成功,去我的订单支付,验证订单的有效性
+        TbOrders check = service.selectTbOrdersByOrderNum(order.getOrderNum());
+        if (check == null) {
+            order.setPayType(1);
+            order.setOrderNum(WxPayKit.generateStr());
+        } else {
+            order = check;
+        }
+        try {
+            AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
+            model.setBody(order.getTitle());
+            model.setSubject(order.getTitle());
+            model.setOutTradeNo(order.getOrderNum());
+            model.setTimeoutExpress("30m");
+            model.setTotalAmount("0.01");
+            model.setPassbackParams("callback params");
+            model.setProductCode("QUICK_MSECURITY_PAY");
+            String orderInfo = AliPayApi.appPayToResponse(model, aliPayBean.getDomain() + NOTIFY_URL).getBody();
+
+            // 保存订单信息*********************************************
+            if (check == null) {
+                order.setCreateTime(new Date());
+                boolean flag = service.save(order);
+                if (!flag) {
+                    return AjaxResult.error("订单异常");
+                }
+            }
+            return AjaxResult.success(orderInfo);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            return AjaxResult.error(e.getMessage());
+        }
+    }
+
+    @PassToken
+    @RequestMapping(value = "/notify_url")
+    @ResponseBody
+    public String notifyUrl(HttpServletRequest request) {
+        try {
+            // 获取支付宝POST过来反馈信息
+            Map<String, String> params = AliPayApi.toMap(request);
+            String out_trade_no = params.get("out_trade_no");
+            boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayBean.getPublicKey(), "UTF-8", "RSA2");
+            if (verifyResult) {
+                // TODO 请在这里加上商户的业务逻辑程序代码 异步通知可能出现订单重复通知 需要做去重处理
+                // 更新订单信息*********************************************
+                TbOrders order = service.selectTbOrdersByOrderNum(out_trade_no);
+                if (order != null && order.getState() == 0) {
+                    order.setTransactionId(params.get("trade_no"));
+                    order.setOpenId(params.get("buyer_logon_id"));
+                    order.setState(1);
+                    order.setPaySuccessTime(new Date());
+                    service.updateById(order);
+                }
+                // 更新订单信息*********************************************
+                return "success";
+            } else {
+                return "failure";
+            }
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            return "failure";
+        }
+    }
+
+}

+ 38 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/AliPayInterceptor.java

@@ -0,0 +1,38 @@
+package com.ruoyi.app.pay;
+
+import com.alipay.api.AlipayApiException;
+import com.ijpay.alipay.AliPayApiConfigKit;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
+ *
+ * <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
+ *
+ * <p>IJPay 交流群: 723992875</p>
+ *
+ * <p>Node.js 版: https://gitee.com/javen205/TNWX</p>
+ *
+ * <p>支付宝支付拦截器</p>
+ *
+ * @author Javen
+ */
+public class AliPayInterceptor implements HandlerInterceptor {
+
+    @Override
+    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws AlipayApiException {
+        if (httpServletRequest.getRequestURI().contains("/app/aliPay/")) {
+            HandlerMethod method = (HandlerMethod) handler;
+            Object controller = method.getBean();
+            if (!(controller instanceof AbstractAliPayApiController)) {
+                throw new RuntimeException("控制器需要继承 AbstractAliPayApiController");
+            }
+            AliPayApiConfigKit.setThreadLocalAliPayApiConfig(((AbstractAliPayApiController) controller).getApiConfig());
+        }
+        return true;
+    }
+}

+ 84 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayBean.java

@@ -0,0 +1,84 @@
+package com.ruoyi.app.pay;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+/**
+ * <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
+ *
+ * <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
+ *
+ * <p>IJPay 交流群: 723992875</p>
+ *
+ * <p>Node.js 版: https://gitee.com/javen205/TNWX</p>
+ *
+ * <p>微信配置 Bean</p>
+ *
+ * @author Javen
+ */
+@Component
+@PropertySource("classpath:/wxpay.properties")
+@ConfigurationProperties(prefix = "wxpay")
+public class WxPayBean {
+    private String appId;
+    private String appSecret;
+    private String mchId;
+    private String partnerKey;
+    private String certPath;
+    private String domain;
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
+
+    public String getAppSecret() {
+        return appSecret;
+    }
+
+    public void setAppSecret(String appSecret) {
+        this.appSecret = appSecret;
+    }
+
+    public String getMchId() {
+        return mchId;
+    }
+
+    public void setMchId(String mchId) {
+        this.mchId = mchId;
+    }
+
+    public String getPartnerKey() {
+        return partnerKey;
+    }
+
+    public void setPartnerKey(String partnerKey) {
+        this.partnerKey = partnerKey;
+    }
+
+    public String getCertPath() {
+        return certPath;
+    }
+
+    public void setCertPath(String certPath) {
+        this.certPath = certPath;
+    }
+
+    public String getDomain() {
+        return domain;
+    }
+
+    public void setDomain(String domain) {
+        this.domain = domain;
+    }
+
+    @Override
+    public String toString() {
+        return "WxPayBean [appId=" + appId + ", appSecret=" + appSecret + ", mchId=" + mchId + ", partnerKey="
+                + partnerKey + ", certPath=" + certPath + ", domain=" + domain + "]";
+    }
+}

+ 151 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayController.java

@@ -0,0 +1,151 @@
+package com.ruoyi.app.pay;
+
+import com.ijpay.core.enums.SignType;
+import com.ijpay.core.enums.TradeType;
+import com.ijpay.core.kit.HttpKit;
+import com.ijpay.core.kit.WxPayKit;
+import com.ijpay.wxpay.WxPayApi;
+import com.ijpay.wxpay.WxPayApiConfig;
+import com.ijpay.wxpay.WxPayApiConfigKit;
+import com.ijpay.wxpay.model.UnifiedOrderModel;
+import com.ruoyi.app.annotation.PassToken;
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+import com.ruoyi.app.shop.orders.service.ITbOrdersService;
+import com.ruoyi.common.core.domain.AjaxResult;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 微信支付
+ */
+@RestController
+@RequestMapping("/app/wxPay")
+public class WxPayController extends AbstractWxPayApiController {
+
+    @Autowired
+    WxPayBean wxPayBean;
+
+    @Autowired
+    ITbOrdersService service;
+
+    private String notifyUrl; //支付通知
+
+
+    @Override
+    public WxPayApiConfig getApiConfig() {
+        WxPayApiConfig apiConfig;
+        try {
+            apiConfig = WxPayApiConfigKit.getApiConfig(wxPayBean.getAppId());
+        } catch (Exception e) {
+            apiConfig = WxPayApiConfig.builder()
+                    .appId(wxPayBean.getAppId())
+                    .mchId(wxPayBean.getMchId())
+                    .partnerKey(wxPayBean.getPartnerKey())
+                    .certPath(wxPayBean.getCertPath())
+                    .domain(wxPayBean.getDomain())
+                    .build();
+        }
+        notifyUrl = apiConfig.getDomain().concat("app/wxPay/notifyUrl");
+        return apiConfig;
+    }
+
+    /**
+     * 微信APP支付
+     */
+    @PostMapping(value = "/appPay")
+    public AjaxResult appPay(@RequestBody TbOrders order) {
+        if (order == null) {
+            return AjaxResult.error("订单无效");
+        }
+        //用户第一次未支付成功,去我的订单支付,验证订单的有效性
+        TbOrders check = service.selectTbOrdersByOrderNum(order.getOrderNum());
+        if (check == null) {
+            order.setPayType(0);
+            order.setOrderNum(WxPayKit.generateStr());
+        } else {
+            order = check;
+        }
+        WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getWxPayApiConfig();
+        Map<String, String> params = UnifiedOrderModel
+                .builder()
+                .appid(wxPayApiConfig.getAppId())
+                .mch_id(wxPayApiConfig.getMchId())
+                .nonce_str(WxPayKit.generateStr())
+                .body(order.getTitle())
+                .attach(order.getTitle())
+                .out_trade_no(order.getOrderNum())
+                .total_fee("1")
+                .spbill_create_ip("127.0.0.1")
+                .notify_url(notifyUrl)
+                .trade_type(TradeType.APP.getTradeType())
+                .build()
+                .createSign(wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+
+        String xmlResult = WxPayApi.pushOrder(false, params);
+        Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
+
+        String returnCode = result.get("return_code");
+        String returnMsg = result.get("return_msg");
+        if (!WxPayKit.codeIsOk(returnCode)) {
+            return AjaxResult.error(returnMsg);
+        }
+        String resultCode = result.get("result_code");
+        if (!WxPayKit.codeIsOk(resultCode)) {
+            return AjaxResult.error(returnMsg);
+        }
+        // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
+        String prepayId = result.get("prepay_id");
+        Map<String, String> packageParams = WxPayKit.appPrepayIdCreateSign(wxPayApiConfig.getAppId(), wxPayApiConfig.getMchId(), prepayId, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256);
+        // 保存订单信息*********************************************
+        if (check == null) {
+            order.setPrepayId(prepayId);
+            order.setCreateTime(new Date());
+            boolean flag = service.save(order);
+            if (!flag) {
+                return AjaxResult.error("订单异常");
+            }
+        }
+        return AjaxResult.success(packageParams);
+    }
+
+    /**
+     * 祭品订单异步通知
+     */
+    @PassToken
+    @RequestMapping(value = "/notifyUrl", method = {RequestMethod.POST, RequestMethod.GET})
+    @ResponseBody
+    public String notifyUrl(HttpServletRequest request) {
+        String xmlMsg = HttpKit.readData(request);
+        Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
+        String returnCode = params.get("return_code");
+        String out_trade_no = params.get("out_trade_no");
+        // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
+        // 注意此处签名方式需与统一下单的签名类型一致
+        if (WxPayKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey(), SignType.HMACSHA256)) {
+            if (WxPayKit.codeIsOk(returnCode)) {
+                System.out.println("订单编号out_trade_no:" + params);
+                // 更新订单信息*********************************************
+                TbOrders order = service.selectTbOrdersByOrderNum(out_trade_no);
+                if (order != null && order.getState() == 0) {
+                    order.setTransactionId(params.get("transaction_id"));
+                    order.setOpenId(params.get("openid"));
+                    order.setState(1);
+                    order.setPaySuccessTime(new Date());
+                    service.updateById(order);
+                }
+                // 更新订单信息*********************************************
+                Map<String, String> xml = new HashMap<String, String>(2);
+                xml.put("return_code", "SUCCESS");
+                xml.put("return_msg", "OK");
+                return WxPayKit.toXml(xml);
+            }
+        }
+        return null;
+    }
+
+}

+ 37 - 0
ruoyi-app/src/main/java/com/ruoyi/app/pay/WxPayInterceptor.java

@@ -0,0 +1,37 @@
+package com.ruoyi.app.pay;
+
+import com.ijpay.wxpay.WxPayApiConfigKit;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
+ *
+ * <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
+ *
+ * <p>IJPay 交流群: 723992875</p>
+ *
+ * <p>Node.js 版: https://gitee.com/javen205/TNWX</p>
+ *
+ * <p>微信支付拦截器</p>
+ *
+ * @author Javen
+ */
+public class WxPayInterceptor implements HandlerInterceptor {
+
+    @Override
+    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) {
+        if (httpServletRequest.getRequestURI().contains("/app/wxPay/")) {
+            HandlerMethod method = (HandlerMethod) handler;
+            Object controller = method.getBean();
+            if (!(controller instanceof AbstractWxPayApiController)) {
+                throw new RuntimeException("控制器需要继承 AbstractWxPayApiController");
+            }
+            WxPayApiConfigKit.setThreadLocalWxPayApiConfig(((AbstractWxPayApiController) controller).getApiConfig());
+        }
+        return true;
+    }
+}

+ 8 - 0
ruoyi-app/src/main/resources/alipay.properties

@@ -0,0 +1,8 @@
+alipay.appId=2021001199608152
+alipay.privateKey=MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCdJ0+MbBs/cQ1nuLN0V7mPxDtBpQAcRiamvXUYfBPlkK0O8C6iXdD8pbX5Ha0enShUj7xobS3iG89H5lA7Ubg9NqIHT/MTVX+6yeJ2F7qrV0IHDQUNf+Rxtkg/cd9azRY90Xe1RuVWseHtYcIIt9lTx7XEzpZCC8asy0mxmjx71bJhTjysshisy7KqK47IVQqQz9GryuT+6AEZtn+zGsFIZmkZndUHXiWj84KsQYlqSFv6Q+nBjZiQ+YmhLuJxbIxv+35/e988MwGg7F93oLf8AhWkEvbFqIPVukqGXdxwY1eFx2q8z+V6tCqeG3o2onM57qWU5EKwWmspcoE2WqepAgMBAAECggEBAJw9bPTqtdxJBU7NbnyIis/IBDGrXYS+qca0LSp+kTl2sNddKr/6DcBg754QRwFcta/8hxA7G5bklxugeru+7zDMlCI49i2On0KRXDiUNt4KDnb8Fr3pHLGAzCtnhuu7YhVrn1v2dCPRDhD3U/Ve8w48SxazXOek1Y0NPuL3uJJTvwGekGyu/EhBF8BTSyEi3f2fHAHJnplh9emCoSCFiLofD3U7qcmTkALx7nplKQBDtaSY7od5miP06fF6k3ewkRpR7cd+tt+ER4kLUn8XiJPOn4ar3I7aEuAPpcdGDWzo6a909VjjgGOCNufxIpDBVy7YtAIb8dlUVCDZTTvhKVECgYEA12GWBSydN9JcuyfHmqiRoZ37AN3x6y8UDcb8ZOI4u790w+5lXArkn2TZGaIeotWiiCcs9wuWor+yWaNT7Ocd4zRecxyc6ZyuNJ1eHIc2Kp5ZyFSQhWAgAvFdrMPUBxXrubx6OTQaA1dLuufVmk/pJ3C7LodIIk41NJYNL1cj9GcCgYEAusqLt2avxc8MsaE+tWI0CP/rJFDp5ow7DRF4sxfElJWgr2oivbU+cPT+diE9jsDavHQXXDIjJcrutsOD10ce5Yo+u0qOX6KmS65AyGQYO4DNRNmoHhcpijQMYNEnsvx9yFgahYOFVMqV/Om2MBvkT7LSXA651IRBq1uRBKdpeW8CgYB9GAC6IJ9vvI5/ZStZeG6dH9SZPE81+bH8DoapUXsCEMEQy3Wzb+A5c6lkafTBPrOXwKktE136SLyds28bOWDyhYgV85hvVsEXbg8rIp0jQ7WB1RvbW2k8TFPL9DFBrEmtJvsWHly9dAZYGC7H4YHZlnAhJhGPWz0rvbsKs+H+IQKBgFLtqan7BP6lNdWG6PhOaRu1wweUhMO+blkW8KdSXgw5geVfEZ134gj0PCTmDRZbuMECKXzdJY2Z0vGBS/8/rA/smH0+VIdRBtOCwXA2QCvquzdeCq2RSvf4s6YoNZ/ZSV6w/tVX1tIWPxDSEfi56VsY4RvNzeLz9NPHC1MtoD4xAoGBAIn6JoOkXT69MpTg8TsfFsSkKbXCDwNtGJp4qCr46CWVDPl11z11Adz/15sZmvAsTyHcn6JmbdR+2druSxn4VSNVHMs/MEEdaZmuCJFT6sHcyjyhB554p55PzQ4CdxbRaKtjqynhuewn2MX+m96v5AtIbUJ51Lqw/eYAKHLARzK6
+alipay.publicKey=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAikfwYneba9lcz9QhSf3Qq0qwMzj+zDwIrXjkRa+093aGsw+DRNIiCnGGhAlMEAzzNVtag6XLqk2IuN3Ju+en4HYs7rJwvwPEiVMKvJ41uLHDNLe7YTt2iblo5cU40aANtsJ+p2OOhiq7iDomasZEBxMjsbrslbkar3VHlTPXv96ftwLYYXIoIp/fAyAgaIW8URigbnyd3D0as8/H2trm4ngQiDdCrCBCZDWghMIcVADeLDCwZUOggd7qjPadoWYfFLEMJNBEKX3YsA9zmuVRtIJigwf9An+s3EM6jqEvrFhQpnM6UFCu5ilK+xZqb1nMJIn4qvbxJ/BwXaZtBsMPWwIDAQAB
+alipay.appCertPath=\u5E94\u7528\u516C\u94A5\u8BC1\u4E66
+alipay.aliPayCertPath=\u652F\u4ED8\u5B9D\u516C\u94A5\u8BC1\u4E66
+alipay.aliPayRootCertPath=\u652F\u4ED8\u5B9D\u6839\u8BC1\u4E66
+alipay.serverUrl=https://openapi.alipay.com/gateway.do
+alipay.domain=http://15s255o329.iask.in/

+ 6 - 0
ruoyi-app/src/main/resources/wxpay.properties

@@ -0,0 +1,6 @@
+wxpay.appId=wxf2768775e3811ae6
+wxpay.appSecret=afae4e36aec1e5ba04302716ef8f1a59
+wxpay.mchId=1602298908
+wxpay.partnerKey=058856f561c64c0fa13b79b48a22ccfc
+wxpay.certPath=D:/1602298908_20200909_cert/apiclient_cert.p12
+wxpay.domain=http://15s255o329.iask.in/

+ 1 - 1
ruoyi-system/src/main/java/com/ruoyi/app/shop/goods/mapper/TbGoodsMapper.java

@@ -12,5 +12,5 @@ import java.util.List;
  * @date 2020-10-02
  */
 public interface TbGoodsMapper extends BaseMapper<TbGoods> {
-    List<TbGoods> selectTbGoodsList(TbGoods tbGoods);
+    public List<TbGoods> selectTbGoodsList(TbGoods tbGoods);
 }

+ 112 - 0
ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/domain/TbOrders.java

@@ -0,0 +1,112 @@
+package com.ruoyi.app.shop.orders.domain;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ruoyi.app.domain.TbAppUser;
+import com.ruoyi.app.shop.goods.domain.TbGoods;
+import com.ruoyi.app.shop.type.domain.TbGoodsType;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 订单
+ *
+ * @author lsw
+ * @date 2020-10-13
+ */
+@Data
+@ApiModel(value = "订单")
+@ToString
+@EqualsAndHashCode
+@NoArgsConstructor
+@Accessors(chain = true)
+@TableName("tb_orders")
+public class TbOrders extends BaseEntity {
+
+    private static final long serialVersionUID = 1L;
+
+
+    @ApiModelProperty(value = "id")
+    @TableId(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "用户id")
+    @Excel(name = "用户id")
+    private Long appUserId;
+
+    @ApiModelProperty(value = "商品id")
+    @Excel(name = "商品id")
+    private Long goodsId;
+
+    @ApiModelProperty(value = "商品标题")
+    @Excel(name = "商品标题")
+    private String title;
+
+    @ApiModelProperty(value = "支付金额")
+    @Excel(name = "支付金额")
+    private BigDecimal money;
+
+    @ApiModelProperty(value = "购买数量")
+    @Excel(name = "购买数量")
+    private Long nums;
+
+    @ApiModelProperty(value = "订单编号")
+    @Excel(name = "订单编号")
+    private String orderNum;
+
+    @ApiModelProperty(value = "交易单号")
+    @Excel(name = "交易单号")
+    private String transactionId;
+
+    @ApiModelProperty(value = "微信openid")
+    @Excel(name = "微信openid")
+    private String openId;
+
+    @Excel(name = "调起支付Id")
+    private String prepayId;
+
+    @ApiModelProperty(value = "用户付款时间")
+    @Excel(name = "用户付款时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date paySuccessTime;
+
+    @ApiModelProperty(value = "取消订单时间")
+    @Excel(name = "取消订单时间", width = 30, dateFormat = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date payCancelTime;
+
+    @ApiModelProperty(value = "状态(-1 订单取消,0 创建订单,1 支付成功)")
+    @Excel(name = "状态", readConverterExp = "状态(-1 订单取消,0 创建订单,1 支付成功)")
+    private Integer state;
+
+    @ApiModelProperty(value = "支付类型(0,微信支付,1,支付宝支付)")
+    @Excel(name = "支付类型", readConverterExp = "支付类型(0,微信支付,1,支付宝支付)")
+    private Integer payType;
+
+    @Excel(name = "备注")
+    private String notes;
+
+    @ApiModelProperty(hidden = true)
+    @TableField(exist = false)
+    private TbGoods tbGoods;
+
+    @ApiModelProperty(hidden = true)
+    @TableField(exist = false)
+    private TbAppUser tbAppUser;
+
+    @ApiModelProperty(hidden = true)
+    @TableField(exist = false)
+    private String mobile;
+}

+ 34 - 0
ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/mapper/TbOrdersMapper.java

@@ -0,0 +1,34 @@
+package com.ruoyi.app.shop.orders.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+
+import java.util.List;
+
+/**
+ * 订单
+ *
+ * @author lsw
+ * @date 2020-10-13
+ */
+public interface TbOrdersMapper extends BaseMapper<TbOrders> {
+    public List<TbOrders> selectTbOrdersList(TbOrders orders);
+
+    /**
+     * 查询用户订单
+     *
+     * @param orders
+     * @return
+     */
+    public List<TbOrders> selectTbOrdersListByUser(TbOrders orders);
+
+    /**
+     * 通过订单号查询订单
+     *
+     * @param orderNum
+     * @return
+     */
+    public TbOrders selectTbOrdersByOrderNum(String orderNum);
+
+    public TbOrders selectTbOrdersById(Long id);
+}

+ 34 - 0
ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/service/ITbOrdersService.java

@@ -0,0 +1,34 @@
+package com.ruoyi.app.shop.orders.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+
+import java.util.List;
+
+/**
+ * 订单
+ *
+ * @author lsw
+ * @date 2020-10-13
+ */
+public interface ITbOrdersService extends IService<TbOrders> {
+    public List<TbOrders> selectTbOrdersList(TbOrders orders);
+
+    /**
+     * 查询用户订单
+     *
+     * @param orders
+     * @return
+     */
+    public List<TbOrders> selectTbOrdersListByUser(TbOrders orders);
+
+    /**
+     * 通过订单号查询订单
+     *
+     * @param orderNum
+     * @return
+     */
+    public TbOrders selectTbOrdersByOrderNum(String orderNum);
+
+    public TbOrders selectTbOrdersById(Long id);
+}

+ 43 - 0
ruoyi-system/src/main/java/com/ruoyi/app/shop/orders/service/impl/TbOrdersServiceImpl.java

@@ -0,0 +1,43 @@
+package com.ruoyi.app.shop.orders.service.impl;
+
+import com.ruoyi.app.shop.orders.domain.TbOrders;
+import com.ruoyi.app.shop.orders.mapper.TbOrdersMapper;
+import com.ruoyi.app.shop.orders.service.ITbOrdersService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import java.util.List;
+
+/**
+ * 订单
+ *
+ * @author lsw
+ * @date 2020-10-13
+ */
+@Service
+public class TbOrdersServiceImpl extends ServiceImpl<TbOrdersMapper, TbOrders> implements ITbOrdersService {
+
+    @Autowired
+    TbOrdersMapper mapper;
+
+    @Override
+    public List<TbOrders> selectTbOrdersList(TbOrders orders) {
+        return mapper.selectTbOrdersList(orders);
+    }
+
+    @Override
+    public List<TbOrders> selectTbOrdersListByUser(TbOrders orders) {
+        return mapper.selectTbOrdersListByUser(orders);
+    }
+
+    @Override
+    public TbOrders selectTbOrdersByOrderNum(String orderNum) {
+        return mapper.selectTbOrdersByOrderNum(orderNum);
+    }
+
+    @Override
+    public TbOrders selectTbOrdersById(Long id) {
+        return mapper.selectTbOrdersById(id);
+    }
+}

+ 91 - 0
ruoyi-system/src/main/resources/mapper/app/shop/TbOrdersMapper.xml

@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.app.shop.orders.mapper.TbOrdersMapper">
+
+    <resultMap type="TbOrders" id="TbOrdersResult">
+        <result property="id" column="id"/>
+        <result property="appUserId" column="app_user_id"/>
+        <result property="goodsId" column="goods_id"/>
+        <result property="title" column="title"/>
+        <result property="money" column="money"/>
+        <result property="nums" column="nums"/>
+        <result property="orderNum" column="order_num"/>
+        <result property="transactionId" column="transaction_id"/>
+        <result property="openId" column="open_id"/>
+        <result property="prepayId" column="prepay_id"/>
+        <result property="paySuccessTime" column="pay_success_time"/>
+        <result property="payCancelTime" column="pay_cancel_time"/>
+        <result property="state" column="state"/>
+        <result property="payType" column="pay_type"/>
+        <result property="notes" column="notes"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="createBy" column="create_by"/>
+        <result property="updateBy" column="update_by"/>
+        <result property="remark" column="remark"/>
+        <association property="tbGoods" column="goods_id" javaType="TbGoods" resultMap="TbGoodsResult"></association>
+        <association property="tbAppUser" column="app_user_id" javaType="TbAppUser"
+                     resultMap="TbAppUserResult"></association>
+    </resultMap>
+    <resultMap type="TbGoods" id="TbGoodsResult">
+        <result property="id" column="goods_id"/>
+        <result property="title" column="title"/>
+        <result property="pic" column="pic"/>
+        <association property="tbGoodsType" column="type_id" javaType="TbGoodsType"
+                     resultMap="TbGoodsTypeResult"></association>
+    </resultMap>
+    <resultMap type="TbGoodsType" id="TbGoodsTypeResult">
+        <result property="id" column="type_id"/>
+        <result property="name" column="name"/>
+    </resultMap>
+    <resultMap type="TbAppUser" id="TbAppUserResult">
+        <result property="id" column="app_user_id"/>
+        <result property="nickName" column="nick_name"/>
+        <result property="mobile" column="mobile"/>
+    </resultMap>
+    <sql id="selectTbOrdersVo">
+         SELECT
+	       o.*, u.avatar,
+	       u.nick_name,
+	       u.mobile,
+	       g.pic,
+	       g.price,
+	       g.id,
+	       g.title,
+	       t.name
+         FROM
+	       tb_orders o
+         LEFT JOIN tb_app_user u ON o.app_user_id = u.id
+         LEFT JOIN tb_goods g ON o.goods_id = g.id
+         LEFT JOIN tb_goods_type t ON g.type_id=t.id
+    </sql>
+    <select id="selectTbOrdersList" parameterType="TbOrders" resultMap="TbOrdersResult">
+        <include refid="selectTbOrdersVo"/>
+        <where>
+            <if test="orderNum != null  and orderNum != ''"> and o.order_num like concat('%', #{orderNum}, '%')</if>
+            <if test="mobile != null and mobile != '' ">and u.mobile like concat('%', #{mobile}, '%')</if>
+            <if test="beginTime != null and beginTime != '' and endTime != null and endTime != ''">and o.create_time between #{beginTime} and #{endTime}</if>
+        </where>
+    </select>
+
+    <!--通过orderNum查询订单状态-->
+    <select id="selectTbOrdersByOrderNum" parameterType="String" resultMap="TbOrdersResult">
+        SELECT * FROM tb_orders WHERE order_num=#{orderNum}
+    </select>
+
+    <!--查询用户订单-->
+    <select id="selectTbOrdersListByUser" parameterType="TbOrders" resultMap="TbOrdersResult">
+        <include refid="selectTbOrdersVo"/>
+        WHERE o.app_user_id=#{appUserId}
+        <if test="state != null and state != ''">and o.state=#{state}</if>
+        and o.state!=-1
+    </select>
+
+    <select id="selectTbOrdersById" parameterType="TbOrders" resultMap="TbOrdersResult">
+        <include refid="selectTbOrdersVo"/>
+        WHERE o.id=#{id}
+    </select>
+
+</mapper>