ソースを参照

会员模块:修改验证码储存逻辑

tangxiangan 2 年 前
コミット
33d1b27f27
22 ファイル変更956 行追加314 行削除
  1. 54 0
      backend-common/src/main/java/utils/CommonUtils.java
  2. 11 0
      backend-core/pom.xml
  3. 2 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/constant/AuthConstant.java
  4. 2 2
      backend-core/src/main/java/cn/kdan/pdf/backend/core/controller/AuthController.java
  5. 43 5
      backend-core/src/main/java/cn/kdan/pdf/backend/core/controller/TestControllerTest.java
  6. 37 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/enums/OrdersStatusEnum.java
  7. 5 14
      backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OrdersMapper.java
  8. 73 1
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Orders.java
  9. 300 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersExample.java
  10. 0 131
      backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersWithBLOBs.java
  11. 35 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/WxPayUtils.java
  12. 4 4
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/AuthService.java
  13. 12 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/OrderService.java
  14. 7 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/PricingService.java
  15. 5 5
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/AuthServiceImpl.java
  16. 103 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/OrderServiceImpl.java
  17. 6 1
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/PricingServiceImpl.java
  18. 6 5
      backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/SubscriptionServiceImpl.java
  19. 162 0
      backend-core/src/main/java/cn/kdan/pdf/backend/core/utils/Wxpay/HttpClient.java
  20. 7 0
      backend-core/src/main/resources/application-local.yml
  21. 15 11
      backend-core/src/main/resources/generatorConfig.xml
  22. 67 135
      backend-core/src/main/resources/sqlmap/OrdersMapper.xml

+ 54 - 0
backend-common/src/main/java/utils/CommonUtils.java

@@ -10,6 +10,9 @@ import org.springframework.util.StringUtils;
 
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.security.MessageDigest;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
@@ -290,4 +293,55 @@ public class CommonUtils {
         return true;
     }
 
+    public static String getIpAddr(HttpServletRequest request) {
+        String ipAddress = null;
+        try {
+            ipAddress = request.getHeader("x-forwarded-for");
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
+                ipAddress = request.getRemoteAddr();
+                if (ipAddress.equals("127.0.0.1")) {
+                    // 根据网卡取本机配置的IP
+                    InetAddress inet = null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (UnknownHostException e) {
+                        e.printStackTrace();
+                    }
+                    ipAddress = inet.getHostAddress();
+                }
+            }
+            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
+            if (ipAddress != null && ipAddress.length() > 15) {
+                // "***.***.***.***".length()
+                // = 15
+                if (ipAddress.indexOf(",") > 0) {
+                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
+                }
+            }
+        } catch (Exception e) {
+            ipAddress = "";
+        }
+        return ipAddress;
+    }
+
+    public static String MD5(String data) {
+        try {
+            java.security.MessageDigest md = MessageDigest.getInstance("MD5");
+            byte[] array = md.digest(data.getBytes("UTF-8"));
+            StringBuilder sb = new StringBuilder();
+            for (byte item : array) {
+                sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
+            }
+            return sb.toString().toUpperCase();
+        } catch (Exception exception) {
+        }
+        return null;
+    }
+
 }

+ 11 - 0
backend-core/pom.xml

@@ -14,6 +14,17 @@
     <url>http://maven.apache.org</url>
 
     <dependencies>
+
+        <dependency>
+            <groupId>cn.springboot</groupId>
+            <artifactId>best-pay-sdk</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.wxpay</groupId>
+            <artifactId>wxpay-sdk</artifactId>
+            <version>0.0.3</version>
+        </dependency>
         <dependency>
             <groupId>cn.kdan.17pdf</groupId>
             <artifactId>backend-common</artifactId>

+ 2 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/constant/AuthConstant.java

@@ -85,6 +85,8 @@ public interface AuthConstant {
     String LOCK_TIMES = "lock_times";
     String LOCK_MINUTES = "lock_minutes";
     String SESSION_ = "session_";
+    String IMAGE_CODE = "image_code";
+
     String PASSWORD_ERROR_ = "password_error_";
 
     String MOBILE_REGEX = "[1][3456789]\\d{9}";

+ 2 - 2
backend-core/src/main/java/cn/kdan/pdf/backend/core/controller/AuthController.java

@@ -81,8 +81,8 @@ public class AuthController {
      * @return Boolean
      */
     @PostMapping("/checkExist")
-    public ResultMap<Boolean> checkExist(HttpSession session,@RequestParam String code,@RequestParam @NotBlank(message = "手机号/邮箱 不能为空")String account) {
-        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,authService.checkExist(session,code,account));
+    public ResultMap<Boolean> checkExist(@RequestParam String key,@RequestParam String code,@RequestParam @NotBlank(message = "手机号/邮箱 不能为空")String account) {
+        return new ResultMap<>(CommonConstant.SUCCESS, CommonConstant.RESULT_SUCCESS,authService.checkExist(key,account,code));
     }
 
 

+ 43 - 5
backend-core/src/main/java/cn/kdan/pdf/backend/core/controller/TestControllerTest.java

@@ -1,13 +1,14 @@
 package cn.kdan.pdf.backend.core.controller;
 
+import cn.kdan.pdf.backend.core.properties.WxPayUtils;
+import cn.kdan.pdf.backend.core.utils.Wxpay.*;
+import com.github.wxpay.sdk.WXPayUtil;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Profile;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
-import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-import org.springframework.test.context.junit4.SpringRunner;
-
-import static org.junit.jupiter.api.Assertions.*;
+import org.springframework.ui.Model;
+import java.util.*;
 
 @SpringBootTest
 class TestControllerTest {
@@ -23,4 +24,41 @@ class TestControllerTest {
         System.out.println(b);
         System.out.println(encoder.encode("123456"));
     }
+
+    @Test
+    public void createPayQRcode() throws Exception{
+
+        String price = "0.01";
+        String no = "txatest01";
+        Map m = new HashMap();
+        m.put("appid", WxPayUtils.WX_PAY_APP_ID);
+        m.put("mch_id", WxPayUtils.WX_PAY_PARTNER);
+        m.put("nonce_str", WXPayUtil.generateNonceStr());
+        m.put("body","微信支付测试"); //主体信息
+        m.put("out_trade_no", no); //订单唯一标识
+        m.put("total_fee", "1");//金额
+        m.put("spbill_create_ip", "127.0.0.1");//项目的域名
+        m.put("notify_url", WxPayUtils.WX_OPEN_NOTIFY_URL);//回调地址
+        m.put("trade_type", "NATIVE");//生成二维码的类型
+
+        //3 发送httpclient请求,传递参数xml格式,微信支付提供的固定的地址
+        HttpClient client = new HttpClient("https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder");
+        //设置xml格式的参数
+        //把xml格式的数据加密
+        client.setXmlParam(WXPayUtil.generateSignedXml(m, WxPayUtils.WX_PAY_PARTNER_KEY));
+        client.setHttps(true);
+        //执行post请求发送
+        client.post();
+        //4 得到发送请求返回结果
+        //返回内容,是使用xml格式返回
+        String xml = client.getContent();
+        //把xml格式转换map集合,把map集合返回
+        Map<String,String> resultMap = WXPayUtil.xmlToMap(xml);
+        //最终返回数据 的封装
+        Map map = new HashMap();
+        map.put("no", no);
+        map.put("price", price);
+        map.put("result_code", resultMap.get("result_code"));
+        map.put("code_url", resultMap.get("code_url"));
+    }
 }

+ 37 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/enums/OrdersStatusEnum.java

@@ -0,0 +1,37 @@
+package cn.kdan.pdf.backend.core.enums;
+
+/**
+ * 有效状态(是否可用)
+ * CD101100
+ *
+ * @author tangxiangan
+ */
+public enum OrdersStatusEnum {
+
+    /**
+     * 未支付 { unpayed: 0, closed: 1, success: 2, finish: 3 }
+     */
+    UNPAYED(0),
+    /**
+     * 已关闭
+     */
+    CLOSED(1),
+    /**
+     * 成功
+     */
+    SUCCESS(2),
+    /**
+     * 完成
+     */
+    FINISH(3);
+
+
+    private final Integer value;
+
+    OrdersStatusEnum(Integer value) {
+        this.value = value;
+    }
+    public Integer value() {
+        return value;
+    }
+}

+ 5 - 14
backend-core/src/main/java/cn/kdan/pdf/backend/core/mapper/OrdersMapper.java

@@ -2,7 +2,6 @@ package cn.kdan.pdf.backend.core.mapper;
 
 import cn.kdan.pdf.backend.core.model.Orders;
 import cn.kdan.pdf.backend.core.model.OrdersExample;
-import cn.kdan.pdf.backend.core.model.OrdersWithBLOBs;
 import java.util.List;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.session.RowBounds;
@@ -14,29 +13,21 @@ public interface OrdersMapper {
 
     int deleteByPrimaryKey(String id);
 
-    int insert(OrdersWithBLOBs record);
+    int insert(Orders record);
 
-    int insertSelective(OrdersWithBLOBs record);
-
-    List<OrdersWithBLOBs> selectByExampleWithBLOBsWithRowbounds(OrdersExample example, RowBounds rowBounds);
-
-    List<OrdersWithBLOBs> selectByExampleWithBLOBs(OrdersExample example);
+    int insertSelective(Orders record);
 
     List<Orders> selectByExampleWithRowbounds(OrdersExample example, RowBounds rowBounds);
 
     List<Orders> selectByExample(OrdersExample example);
 
-    OrdersWithBLOBs selectByPrimaryKey(String id);
+    Orders selectByPrimaryKey(String id);
 
-    int updateByExampleSelective(@Param("record") OrdersWithBLOBs record, @Param("example") OrdersExample example);
-
-    int updateByExampleWithBLOBs(@Param("record") OrdersWithBLOBs record, @Param("example") OrdersExample example);
+    int updateByExampleSelective(@Param("record") Orders record, @Param("example") OrdersExample example);
 
     int updateByExample(@Param("record") Orders record, @Param("example") OrdersExample example);
 
-    int updateByPrimaryKeySelective(OrdersWithBLOBs record);
-
-    int updateByPrimaryKeyWithBLOBs(OrdersWithBLOBs record);
+    int updateByPrimaryKeySelective(Orders record);
 
     int updateByPrimaryKey(Orders record);
 }

+ 73 - 1
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/Orders.java

@@ -13,18 +13,26 @@ public class Orders implements Serializable {
 
     private Integer payment;
 
+    private String pagePayUrl;
+
     private String qrcodeUrl;
 
     private Integer status;
 
+    private String result;
+
     private Date createdAt;
 
     private Date updatedAt;
 
     private BigDecimal tradeNo;
 
+    private String androidSign;
+
     private Float price;
 
+    private String androidSign2;
+
     private static final long serialVersionUID = 1L;
 
     public String getId() {
@@ -79,6 +87,19 @@ public class Orders implements Serializable {
         this.payment = payment;
     }
 
+    public String getPagePayUrl() {
+        return pagePayUrl;
+    }
+
+    public Orders withPagePayUrl(String pagePayUrl) {
+        this.setPagePayUrl(pagePayUrl);
+        return this;
+    }
+
+    public void setPagePayUrl(String pagePayUrl) {
+        this.pagePayUrl = pagePayUrl;
+    }
+
     public String getQrcodeUrl() {
         return qrcodeUrl;
     }
@@ -105,6 +126,19 @@ public class Orders implements Serializable {
         this.status = status;
     }
 
+    public String getResult() {
+        return result;
+    }
+
+    public Orders withResult(String result) {
+        this.setResult(result);
+        return this;
+    }
+
+    public void setResult(String result) {
+        this.result = result;
+    }
+
     public Date getCreatedAt() {
         return createdAt;
     }
@@ -144,6 +178,19 @@ public class Orders implements Serializable {
         this.tradeNo = tradeNo;
     }
 
+    public String getAndroidSign() {
+        return androidSign;
+    }
+
+    public Orders withAndroidSign(String androidSign) {
+        this.setAndroidSign(androidSign);
+        return this;
+    }
+
+    public void setAndroidSign(String androidSign) {
+        this.androidSign = androidSign;
+    }
+
     public Float getPrice() {
         return price;
     }
@@ -157,6 +204,19 @@ public class Orders implements Serializable {
         this.price = price;
     }
 
+    public String getAndroidSign2() {
+        return androidSign2;
+    }
+
+    public Orders withAndroidSign2(String androidSign2) {
+        this.setAndroidSign2(androidSign2);
+        return this;
+    }
+
+    public void setAndroidSign2(String androidSign2) {
+        this.androidSign2 = androidSign2;
+    }
+
     @Override
     public boolean equals(Object that) {
         if (this == that) {
@@ -173,12 +233,16 @@ public class Orders implements Serializable {
             && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
             && (this.getSubscriptionId() == null ? other.getSubscriptionId() == null : this.getSubscriptionId().equals(other.getSubscriptionId()))
             && (this.getPayment() == null ? other.getPayment() == null : this.getPayment().equals(other.getPayment()))
+            && (this.getPagePayUrl() == null ? other.getPagePayUrl() == null : this.getPagePayUrl().equals(other.getPagePayUrl()))
             && (this.getQrcodeUrl() == null ? other.getQrcodeUrl() == null : this.getQrcodeUrl().equals(other.getQrcodeUrl()))
             && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
+            && (this.getResult() == null ? other.getResult() == null : this.getResult().equals(other.getResult()))
             && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
             && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
             && (this.getTradeNo() == null ? other.getTradeNo() == null : this.getTradeNo().equals(other.getTradeNo()))
-            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()));
+            && (this.getAndroidSign() == null ? other.getAndroidSign() == null : this.getAndroidSign().equals(other.getAndroidSign()))
+            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
+            && (this.getAndroidSign2() == null ? other.getAndroidSign2() == null : this.getAndroidSign2().equals(other.getAndroidSign2()));
     }
 
     @Override
@@ -189,12 +253,16 @@ public class Orders implements Serializable {
         result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
         result = prime * result + ((getSubscriptionId() == null) ? 0 : getSubscriptionId().hashCode());
         result = prime * result + ((getPayment() == null) ? 0 : getPayment().hashCode());
+        result = prime * result + ((getPagePayUrl() == null) ? 0 : getPagePayUrl().hashCode());
         result = prime * result + ((getQrcodeUrl() == null) ? 0 : getQrcodeUrl().hashCode());
         result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
+        result = prime * result + ((getResult() == null) ? 0 : getResult().hashCode());
         result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
         result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
         result = prime * result + ((getTradeNo() == null) ? 0 : getTradeNo().hashCode());
+        result = prime * result + ((getAndroidSign() == null) ? 0 : getAndroidSign().hashCode());
         result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
+        result = prime * result + ((getAndroidSign2() == null) ? 0 : getAndroidSign2().hashCode());
         return result;
     }
 
@@ -208,12 +276,16 @@ public class Orders implements Serializable {
         sb.append(", memberId=").append(memberId);
         sb.append(", subscriptionId=").append(subscriptionId);
         sb.append(", payment=").append(payment);
+        sb.append(", pagePayUrl=").append(pagePayUrl);
         sb.append(", qrcodeUrl=").append(qrcodeUrl);
         sb.append(", status=").append(status);
+        sb.append(", result=").append(result);
         sb.append(", createdAt=").append(createdAt);
         sb.append(", updatedAt=").append(updatedAt);
         sb.append(", tradeNo=").append(tradeNo);
+        sb.append(", androidSign=").append(androidSign);
         sb.append(", price=").append(price);
+        sb.append(", androidSign2=").append(androidSign2);
         sb.append(", serialVersionUID=").append(serialVersionUID);
         sb.append("]");
         return sb.toString();

+ 300 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersExample.java

@@ -376,6 +376,76 @@ public class OrdersExample {
             return (Criteria) this;
         }
 
+        public Criteria andPagePayUrlIsNull() {
+            addCriterion("page_pay_url is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlIsNotNull() {
+            addCriterion("page_pay_url is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlEqualTo(String value) {
+            addCriterion("page_pay_url =", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlNotEqualTo(String value) {
+            addCriterion("page_pay_url <>", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlGreaterThan(String value) {
+            addCriterion("page_pay_url >", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlGreaterThanOrEqualTo(String value) {
+            addCriterion("page_pay_url >=", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlLessThan(String value) {
+            addCriterion("page_pay_url <", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlLessThanOrEqualTo(String value) {
+            addCriterion("page_pay_url <=", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlLike(String value) {
+            addCriterion("page_pay_url like", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlNotLike(String value) {
+            addCriterion("page_pay_url not like", value, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlIn(List<String> values) {
+            addCriterion("page_pay_url in", values, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlNotIn(List<String> values) {
+            addCriterion("page_pay_url not in", values, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlBetween(String value1, String value2) {
+            addCriterion("page_pay_url between", value1, value2, "pagePayUrl");
+            return (Criteria) this;
+        }
+
+        public Criteria andPagePayUrlNotBetween(String value1, String value2) {
+            addCriterion("page_pay_url not between", value1, value2, "pagePayUrl");
+            return (Criteria) this;
+        }
+
         public Criteria andQrcodeUrlIsNull() {
             addCriterion("qrcode_url is null");
             return (Criteria) this;
@@ -506,6 +576,76 @@ public class OrdersExample {
             return (Criteria) this;
         }
 
+        public Criteria andResultIsNull() {
+            addCriterion("`result` is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultIsNotNull() {
+            addCriterion("`result` is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultEqualTo(String value) {
+            addCriterion("`result` =", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultNotEqualTo(String value) {
+            addCriterion("`result` <>", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultGreaterThan(String value) {
+            addCriterion("`result` >", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultGreaterThanOrEqualTo(String value) {
+            addCriterion("`result` >=", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultLessThan(String value) {
+            addCriterion("`result` <", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultLessThanOrEqualTo(String value) {
+            addCriterion("`result` <=", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultLike(String value) {
+            addCriterion("`result` like", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultNotLike(String value) {
+            addCriterion("`result` not like", value, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultIn(List<String> values) {
+            addCriterion("`result` in", values, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultNotIn(List<String> values) {
+            addCriterion("`result` not in", values, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultBetween(String value1, String value2) {
+            addCriterion("`result` between", value1, value2, "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andResultNotBetween(String value1, String value2) {
+            addCriterion("`result` not between", value1, value2, "result");
+            return (Criteria) this;
+        }
+
         public Criteria andCreatedAtIsNull() {
             addCriterion("created_at is null");
             return (Criteria) this;
@@ -686,6 +826,76 @@ public class OrdersExample {
             return (Criteria) this;
         }
 
+        public Criteria andAndroidSignIsNull() {
+            addCriterion("android_sign is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignIsNotNull() {
+            addCriterion("android_sign is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignEqualTo(String value) {
+            addCriterion("android_sign =", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignNotEqualTo(String value) {
+            addCriterion("android_sign <>", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignGreaterThan(String value) {
+            addCriterion("android_sign >", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignGreaterThanOrEqualTo(String value) {
+            addCriterion("android_sign >=", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignLessThan(String value) {
+            addCriterion("android_sign <", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignLessThanOrEqualTo(String value) {
+            addCriterion("android_sign <=", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignLike(String value) {
+            addCriterion("android_sign like", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignNotLike(String value) {
+            addCriterion("android_sign not like", value, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignIn(List<String> values) {
+            addCriterion("android_sign in", values, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignNotIn(List<String> values) {
+            addCriterion("android_sign not in", values, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignBetween(String value1, String value2) {
+            addCriterion("android_sign between", value1, value2, "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignNotBetween(String value1, String value2) {
+            addCriterion("android_sign not between", value1, value2, "androidSign");
+            return (Criteria) this;
+        }
+
         public Criteria andPriceIsNull() {
             addCriterion("price is null");
             return (Criteria) this;
@@ -746,6 +956,76 @@ public class OrdersExample {
             return (Criteria) this;
         }
 
+        public Criteria andAndroidSign2IsNull() {
+            addCriterion("android_sign2 is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2IsNotNull() {
+            addCriterion("android_sign2 is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2EqualTo(String value) {
+            addCriterion("android_sign2 =", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2NotEqualTo(String value) {
+            addCriterion("android_sign2 <>", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2GreaterThan(String value) {
+            addCriterion("android_sign2 >", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2GreaterThanOrEqualTo(String value) {
+            addCriterion("android_sign2 >=", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2LessThan(String value) {
+            addCriterion("android_sign2 <", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2LessThanOrEqualTo(String value) {
+            addCriterion("android_sign2 <=", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2Like(String value) {
+            addCriterion("android_sign2 like", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2NotLike(String value) {
+            addCriterion("android_sign2 not like", value, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2In(List<String> values) {
+            addCriterion("android_sign2 in", values, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2NotIn(List<String> values) {
+            addCriterion("android_sign2 not in", values, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2Between(String value1, String value2) {
+            addCriterion("android_sign2 between", value1, value2, "androidSign2");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2NotBetween(String value1, String value2) {
+            addCriterion("android_sign2 not between", value1, value2, "androidSign2");
+            return (Criteria) this;
+        }
+
         public Criteria andIdLikeInsensitive(String value) {
             addCriterion("upper(id) like", value.toUpperCase(), "id");
             return (Criteria) this;
@@ -761,10 +1041,30 @@ public class OrdersExample {
             return (Criteria) this;
         }
 
+        public Criteria andPagePayUrlLikeInsensitive(String value) {
+            addCriterion("upper(page_pay_url) like", value.toUpperCase(), "pagePayUrl");
+            return (Criteria) this;
+        }
+
         public Criteria andQrcodeUrlLikeInsensitive(String value) {
             addCriterion("upper(qrcode_url) like", value.toUpperCase(), "qrcodeUrl");
             return (Criteria) this;
         }
+
+        public Criteria andResultLikeInsensitive(String value) {
+            addCriterion("upper(`result`) like", value.toUpperCase(), "result");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSignLikeInsensitive(String value) {
+            addCriterion("upper(android_sign) like", value.toUpperCase(), "androidSign");
+            return (Criteria) this;
+        }
+
+        public Criteria andAndroidSign2LikeInsensitive(String value) {
+            addCriterion("upper(android_sign2) like", value.toUpperCase(), "androidSign2");
+            return (Criteria) this;
+        }
     }
 
     public static class Criteria extends GeneratedCriteria {

+ 0 - 131
backend-core/src/main/java/cn/kdan/pdf/backend/core/model/OrdersWithBLOBs.java

@@ -1,131 +0,0 @@
-package cn.kdan.pdf.backend.core.model;
-
-import java.io.Serializable;
-
-public class OrdersWithBLOBs extends Orders implements Serializable {
-    private String pagePayUrl;
-
-    private String result;
-
-    private String androidSign;
-
-    private String androidSign2;
-
-    private static final long serialVersionUID = 1L;
-
-    public String getPagePayUrl() {
-        return pagePayUrl;
-    }
-
-    public OrdersWithBLOBs withPagePayUrl(String pagePayUrl) {
-        this.setPagePayUrl(pagePayUrl);
-        return this;
-    }
-
-    public void setPagePayUrl(String pagePayUrl) {
-        this.pagePayUrl = pagePayUrl;
-    }
-
-    public String getResult() {
-        return result;
-    }
-
-    public OrdersWithBLOBs withResult(String result) {
-        this.setResult(result);
-        return this;
-    }
-
-    public void setResult(String result) {
-        this.result = result;
-    }
-
-    public String getAndroidSign() {
-        return androidSign;
-    }
-
-    public OrdersWithBLOBs withAndroidSign(String androidSign) {
-        this.setAndroidSign(androidSign);
-        return this;
-    }
-
-    public void setAndroidSign(String androidSign) {
-        this.androidSign = androidSign;
-    }
-
-    public String getAndroidSign2() {
-        return androidSign2;
-    }
-
-    public OrdersWithBLOBs withAndroidSign2(String androidSign2) {
-        this.setAndroidSign2(androidSign2);
-        return this;
-    }
-
-    public void setAndroidSign2(String androidSign2) {
-        this.androidSign2 = androidSign2;
-    }
-
-    @Override
-    public boolean equals(Object that) {
-        if (this == that) {
-            return true;
-        }
-        if (that == null) {
-            return false;
-        }
-        if (getClass() != that.getClass()) {
-            return false;
-        }
-        OrdersWithBLOBs other = (OrdersWithBLOBs) that;
-        return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId()))
-            && (this.getMemberId() == null ? other.getMemberId() == null : this.getMemberId().equals(other.getMemberId()))
-            && (this.getSubscriptionId() == null ? other.getSubscriptionId() == null : this.getSubscriptionId().equals(other.getSubscriptionId()))
-            && (this.getPayment() == null ? other.getPayment() == null : this.getPayment().equals(other.getPayment()))
-            && (this.getQrcodeUrl() == null ? other.getQrcodeUrl() == null : this.getQrcodeUrl().equals(other.getQrcodeUrl()))
-            && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus()))
-            && (this.getCreatedAt() == null ? other.getCreatedAt() == null : this.getCreatedAt().equals(other.getCreatedAt()))
-            && (this.getUpdatedAt() == null ? other.getUpdatedAt() == null : this.getUpdatedAt().equals(other.getUpdatedAt()))
-            && (this.getTradeNo() == null ? other.getTradeNo() == null : this.getTradeNo().equals(other.getTradeNo()))
-            && (this.getPrice() == null ? other.getPrice() == null : this.getPrice().equals(other.getPrice()))
-            && (this.getPagePayUrl() == null ? other.getPagePayUrl() == null : this.getPagePayUrl().equals(other.getPagePayUrl()))
-            && (this.getResult() == null ? other.getResult() == null : this.getResult().equals(other.getResult()))
-            && (this.getAndroidSign() == null ? other.getAndroidSign() == null : this.getAndroidSign().equals(other.getAndroidSign()))
-            && (this.getAndroidSign2() == null ? other.getAndroidSign2() == null : this.getAndroidSign2().equals(other.getAndroidSign2()));
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
-        result = prime * result + ((getMemberId() == null) ? 0 : getMemberId().hashCode());
-        result = prime * result + ((getSubscriptionId() == null) ? 0 : getSubscriptionId().hashCode());
-        result = prime * result + ((getPayment() == null) ? 0 : getPayment().hashCode());
-        result = prime * result + ((getQrcodeUrl() == null) ? 0 : getQrcodeUrl().hashCode());
-        result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode());
-        result = prime * result + ((getCreatedAt() == null) ? 0 : getCreatedAt().hashCode());
-        result = prime * result + ((getUpdatedAt() == null) ? 0 : getUpdatedAt().hashCode());
-        result = prime * result + ((getTradeNo() == null) ? 0 : getTradeNo().hashCode());
-        result = prime * result + ((getPrice() == null) ? 0 : getPrice().hashCode());
-        result = prime * result + ((getPagePayUrl() == null) ? 0 : getPagePayUrl().hashCode());
-        result = prime * result + ((getResult() == null) ? 0 : getResult().hashCode());
-        result = prime * result + ((getAndroidSign() == null) ? 0 : getAndroidSign().hashCode());
-        result = prime * result + ((getAndroidSign2() == null) ? 0 : getAndroidSign2().hashCode());
-        return result;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append(getClass().getSimpleName());
-        sb.append(" [");
-        sb.append("Hash = ").append(hashCode());
-        sb.append(", pagePayUrl=").append(pagePayUrl);
-        sb.append(", result=").append(result);
-        sb.append(", androidSign=").append(androidSign);
-        sb.append(", androidSign2=").append(androidSign2);
-        sb.append(", serialVersionUID=").append(serialVersionUID);
-        sb.append("]");
-        return sb.toString();
-    }
-}

+ 35 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/properties/WxPayUtils.java

@@ -0,0 +1,35 @@
+package cn.kdan.pdf.backend.core.properties;
+
+import lombok.Data;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+public class WxPayUtils implements InitializingBean {
+    @Value("${wx.pay.app_id}")
+    private String appId;
+
+    @Value("${wx.pay.partner}")
+    private String partner;
+
+    @Value("${wx.pay.partnerkey}")
+    private String partnerKey;
+    @Value("${wx.pay.notifyurl}")
+    private String notifyUrl;
+
+
+    public static String WX_PAY_APP_ID;
+    public static String WX_PAY_PARTNER;
+    public static String WX_PAY_PARTNER_KEY;
+    public static String WX_OPEN_NOTIFY_URL;
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        WX_PAY_APP_ID = appId;
+        WX_PAY_PARTNER = partner;
+        WX_PAY_PARTNER_KEY = partnerKey;
+        WX_OPEN_NOTIFY_URL = notifyUrl;
+    }
+}

+ 4 - 4
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/AuthService.java

@@ -62,12 +62,12 @@ public interface AuthService {
 
     /**
      * 判断图片验证码
-     * @param session session
+     * @param key session
      * @param type 验证码类型(登录或者忘记秘密)
      * @param code 验证码
      * @return boolean
      */
-    boolean isImageCodeValid(HttpSession session, ImageCodeTypeEnum type, String code);
+    boolean isImageCodeValid(String key, ImageCodeTypeEnum type, String code);
 
     /**
      * 获取验证码(发送短信,或者邮件)
@@ -81,12 +81,12 @@ public interface AuthService {
 
     /**
      * 判断账户是否存在
-     * @param session session
+     * @param key session
      * @param account 手机号或者邮箱
      * @param code 验证码
      * @return boolean
      */
-    boolean checkExist(HttpSession session, String account, String code);
+    boolean checkExist(String key, String account, String code);
 
     /**
      * 检查验证码

+ 12 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/OrderService.java

@@ -0,0 +1,12 @@
+package cn.kdan.pdf.backend.core.service;
+
+
+/**
+ * @author tangxiangan
+ */
+public interface OrderService {
+
+
+
+
+}

+ 7 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/PricingService.java

@@ -1,5 +1,6 @@
 package cn.kdan.pdf.backend.core.service;
 
+import cn.kdan.pdf.backend.core.model.Pricings;
 import cn.kdan.pdf.backend.core.model.pricing.QueryPricingReq;
 import cn.kdan.pdf.backend.core.model.pricing.QueryPricingResp;
 
@@ -8,4 +9,10 @@ public interface PricingService {
     /** 查询券服务列表 */
     QueryPricingResp getPricingList(QueryPricingReq req);
 
+    /**
+     * 根据id查询
+     * @param id id
+     * @return Pricings
+     */
+    Pricings getById(Integer id);
 }

+ 5 - 5
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/AuthServiceImpl.java

@@ -115,9 +115,9 @@ public class AuthServiceImpl implements AuthService {
     }
 
     @Override
-    public boolean isImageCodeValid(HttpSession session, ImageCodeTypeEnum type, String code) {
-        String redisCode = redisUtils.hget(AuthConstant.SESSION_ + session.getId(), type.value());
-        redisUtils.hdel(AuthConstant.SESSION_ + session.getId(), type.value());
+    public boolean isImageCodeValid(String key,ImageCodeTypeEnum type, String code) {
+        String redisCode = redisUtils.hget(AuthConstant.SESSION_ + key, type.value());
+        redisUtils.hdel(AuthConstant.SESSION_ + key, type.value());
         return !StringUtils.isEmpty(code) && code.equalsIgnoreCase(redisCode);
     }
 
@@ -158,8 +158,8 @@ public class AuthServiceImpl implements AuthService {
 
 
     @Override
-    public boolean checkExist(HttpSession session,String account,String code) {
-        if (!isImageCodeValid(session, ImageCodeTypeEnum.FORGET_PASSWORD, code)) {
+    public boolean checkExist(String key,String account,String code) {
+        if (!isImageCodeValid(key, ImageCodeTypeEnum.FORGET_PASSWORD, code)) {
             throw new BackendRuntimeException(AuthConstant.EXCEPTION_MSG_IMAGE_CODE_ERROR);
         }
         if(ObjectUtils.isEmpty(userService.getByAccount(account))){

+ 103 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/OrderServiceImpl.java

@@ -0,0 +1,103 @@
+package cn.kdan.pdf.backend.core.service.impl;
+
+import cn.kdan.pdf.backend.core.enums.OrdersStatusEnum;
+import cn.kdan.pdf.backend.core.enums.PaymentEnum;
+import cn.kdan.pdf.backend.core.mapper.OrdersMapper;
+import cn.kdan.pdf.backend.core.model.*;
+import cn.kdan.pdf.backend.core.service.OrderService;
+import cn.kdan.pdf.backend.core.service.PricingService;
+import cn.kdan.pdf.backend.core.service.SetPricingService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.catalina.util.Strftime;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+import utils.CommonUtils;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+
+
+/**
+ * @author tangxiangan
+ */
+@Slf4j
+@Service
+public class OrderServiceImpl implements OrderService {
+
+    @Autowired
+    private OrdersMapper ordersMapper;
+    @Autowired
+    private SetPricingService setPricingService;
+    @Autowired
+    private PricingService pricingService;
+
+
+    public void findMemberUnPayedOrders(String memberId,Subscriptions subscription){
+        OrdersExample example = new OrdersExample();
+        example.createCriteria().andMemberIdEqualTo(memberId).andStatusEqualTo(OrdersStatusEnum.UNPAYED.value()).andSubscriptionIdEqualTo(subscription.getId());
+        List<Orders> list  = ordersMapper.selectByExample(example);
+        //订单如果不存在则插入,存在则返回
+        if(CollectionUtils.isEmpty(list)) {
+            Orders order = new Orders();
+            order.setId(CommonUtils.generateId());
+            order.setMemberId(memberId);
+            order.setSubscriptionId(subscription.getId());
+            order.setPayment(subscription.getPayment());
+            if(PaymentEnum.WXPAY.value().equals(subscription.getPayment())){
+                order.setQrcodeUrl("11");
+            }
+            order.setStatus(OrdersStatusEnum.UNPAYED.value());
+            order.setCreatedAt(new Date());
+            order.setPrice(subscription.getPrice());
+            if ("SetPricing".equals(subscription.getTargetType())) {
+                SetPricings setPricing = setPricingService.getById(subscription.getTargetId());
+                order.setTradeNo(new BigDecimal(autoTradeNo(subscription.getTargetType(),setPricing.getMode().toString())));
+            } else {
+                Pricings pricing = pricingService.getById(subscription.getTargetId());
+                order.setTradeNo(new BigDecimal(autoTradeNo(subscription.getTargetType(),pricing.getMode().toString())));;
+
+            }
+            //插入
+            ordersMapper.insert(order);
+        }
+
+    }
+
+    /**
+     * 获取订单编号
+     */
+    private String autoTradeNo (String targetType, String targetMode) {
+        Strftime strftime = new Strftime( "%Y%m%d%H%M", Locale.CHINESE );
+        return strftime.format(new Date()) + getOrderTypeNo(targetType,targetMode) + (System.currentTimeMillis()+"").substring(9) ;
+    }
+
+
+    /**
+     * 根据订单的类型和状态获取自动的订单号
+     */
+    private  String getOrderTypeNo (String targetType,String targetMode) {
+        String orderTypeNo = "00";
+        switch (targetType) {
+            case "Pricing":
+                orderTypeNo  = "01";
+                break;
+            case "SetPricing":
+                if("yearly_base".equals(targetMode)){
+                    orderTypeNo  =  "03";
+                } else if ("monthly_base".equals(targetMode)) {
+                    orderTypeNo  =  "04";
+                } else if ("yearly_business".equals(targetMode)) {
+                    orderTypeNo  =  "05";
+                } else if ("monthly_business".equals(targetMode)) {
+                    orderTypeNo  =  "06";
+                }
+                break;
+            default:  orderTypeNo  = "00";
+                break;
+        }
+        return  orderTypeNo;
+    }
+}

+ 6 - 1
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/PricingServiceImpl.java

@@ -13,7 +13,6 @@ import cn.kdan.pdf.backend.core.service.PricingDiscountService;
 import cn.kdan.pdf.backend.core.service.PricingService;
 import cn.kdan.pdf.backend.core.service.SubscriptionService;
 import enums.CommonEnum;
-import enums.ValidStatusEnum;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -206,4 +205,10 @@ public class PricingServiceImpl implements PricingService {
         return item.getProductCode().contains("17pdf");
     }
 
+
+    @Override
+    public Pricings getById(Integer id) {
+        return pricingsMapper.selectByPrimaryKey(id);
+    }
+
 }

+ 6 - 5
backend-core/src/main/java/cn/kdan/pdf/backend/core/service/impl/SubscriptionServiceImpl.java

@@ -46,7 +46,7 @@ public class SubscriptionServiceImpl implements SubscriptionService {
         return subscriptionsMapper.countByExample(example);
     }
 
-    public void create(String client, Integer payment, String targetType, String targetId,Float price) {
+    public void create(String client, Integer payment, String targetType, String targetId) {
         //判断平台类型
         client = StringUtils.isEmpty(client) ? ClientEnum.APP.value() : client;
         if(!PaymentEnum.checkEnumByValue(payment)){
@@ -59,11 +59,12 @@ public class SubscriptionServiceImpl implements SubscriptionService {
             }
             Members members = memberService.getCurrentUser();
             //查找用户未支付状态的会员服务 没有则插入
-            findMemberUnPayedSubscription(members, targetType, Integer.parseInt(targetId) ,payment,client);
+            Subscriptions subscription = findMemberUnPayedSubscription(members, targetType, Integer.parseInt(targetId) ,payment,client);
+            //查找用户有没有没有支付的微信订单,没有则插入
         }
     }
 
-    public void findMemberUnPayedSubscription(Members member, String targetType, Integer targetId,Integer payment,String client) {
+    public Subscriptions findMemberUnPayedSubscription(Members member, String targetType, Integer targetId,Integer payment,String client) {
         SubscriptionsExample example = new SubscriptionsExample();
         example.createCriteria().andMemberIdEqualTo(member.getId()).andTargetIdEqualTo(targetId).andTargetTypeEqualTo(targetType).andStatusEqualTo(SubscriptionStatusEnum.UNPAYED.value());
         List<Subscriptions> subscriptionsList = subscriptionsMapper.selectByExample(example);
@@ -82,8 +83,8 @@ public class SubscriptionServiceImpl implements SubscriptionService {
                 renewInfo(true,client,subscriptions,member,setPricings);
                 subscriptionsMapper.insert(subscriptions);
             }
-
         }
+        return subscriptionsList.get(0);
     }
 
     private void updateAttributes () {
@@ -99,7 +100,7 @@ public class SubscriptionServiceImpl implements SubscriptionService {
             subscriptions.setStartDate(new Date());
             //开始时间加上结束时间
             subscriptions.setEndDate(!StringUtils.isEmpty(subscription.getTotalPeriod())? PeriodUtils.countDate(subscriptions.getStartDate(),subscriptions.getTotalPeriod()) : subscriptions.getStartDate());
-        }else {
+        } else {
             Subscriptions lastSubs = null;
 
 //            options[:start_date] = if id != last_subs.id && last_subs.end_date.present?

+ 162 - 0
backend-core/src/main/java/cn/kdan/pdf/backend/core/utils/Wxpay/HttpClient.java

@@ -0,0 +1,162 @@
+package cn.kdan.pdf.backend.core.utils.Wxpay;
+
+import org.apache.http.Consts;
+import org.apache.http.HttpEntity;
+import org.apache.http.NameValuePair;
+import org.apache.http.ParseException;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.*;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.conn.ssl.TrustStrategy;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.ssl.SSLContextBuilder;
+import org.apache.http.util.EntityUtils;
+
+import javax.net.ssl.SSLContext;
+import javax.security.cert.CertificateException;
+import javax.security.cert.X509Certificate;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+public class HttpClient {
+    private String url;
+    private Map<String, String> param;
+    private int statusCode;
+    private String content;
+    private String xmlParam;
+    private boolean isHttps;
+
+    public boolean isHttps() {
+        return isHttps;
+    }
+
+    public void setHttps(boolean isHttps) {
+        this.isHttps = isHttps;
+    }
+
+    public String getXmlParam() {
+        return xmlParam;
+    }
+
+    public void setXmlParam(String xmlParam) {
+        this.xmlParam = xmlParam;
+    }
+
+    public HttpClient(String url, Map<String, String> param) {
+        this.url = url;
+        this.param = param;
+    }
+
+    public HttpClient(String url) {
+        this.url = url;
+    }
+
+    public void setParameter(Map<String, String> map) {
+        param = map;
+    }
+
+    public void addParameter(String key, String value) {
+        if (param == null)
+            param = new HashMap<String, String>();
+        param.put(key, value);
+    }
+
+    public void post() throws ClientProtocolException, IOException {
+        HttpPost http = new HttpPost(url);
+        setEntity(http);
+        execute(http);
+    }
+
+    public void put() throws ClientProtocolException, IOException {
+        HttpPut http = new HttpPut(url);
+        setEntity(http);
+        execute(http);
+    }
+
+    public void get() throws ClientProtocolException, IOException {
+        if (param != null) {
+            StringBuilder url = new StringBuilder(this.url);
+            boolean isFirst = true;
+            for (String key : param.keySet()) {
+                if (isFirst) {
+                    url.append("?");
+                } else {
+                    url.append("&");
+                }
+                url.append(key).append("=").append(param.get(key));
+            }
+            this.url = url.toString();
+        }
+        HttpGet http = new HttpGet(url);
+        execute(http);
+    }
+
+    /**
+     * set http post,put param
+     */
+    private void setEntity(HttpEntityEnclosingRequestBase http) {
+        if (param != null) {
+            List<NameValuePair> nvps = new LinkedList<NameValuePair>();
+            for (String key : param.keySet())
+                nvps.add(new BasicNameValuePair(key, param.get(key))); // 参数
+            http.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8)); // 设置参数
+        }
+        if (xmlParam != null) {
+            http.setEntity(new StringEntity(xmlParam, Consts.UTF_8));
+        }
+    }
+
+    private void execute(HttpUriRequest http) throws ClientProtocolException,
+            IOException {
+        CloseableHttpClient httpClient = null;
+        try {
+            if (isHttps) {
+                SSLContext sslContext = new SSLContextBuilder()
+                        .loadTrustMaterial(null, new TrustStrategy() {
+                            // 信任所有
+                            @Override
+                            public boolean isTrusted(java.security.cert.X509Certificate[] x509Certificates, String authType) throws java.security.cert.CertificateException {
+                                return true;
+                            }
+                        }).build();
+                SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
+                        sslContext);
+                httpClient = HttpClients.custom().setSSLSocketFactory(sslsf)
+                        .build();
+            } else {
+                httpClient = HttpClients.createDefault();
+            }
+            CloseableHttpResponse response = httpClient.execute(http);
+            try {
+                if (response != null) {
+                    if (response.getStatusLine() != null)
+                        statusCode = response.getStatusLine().getStatusCode();
+                    HttpEntity entity = response.getEntity();
+                    // 响应内容
+                    content = EntityUtils.toString(entity, Consts.UTF_8);
+                }
+            } finally {
+                response.close();
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            httpClient.close();
+        }
+    }
+
+    public int getStatusCode() {
+        return statusCode;
+    }
+
+    public String getContent() throws ParseException, IOException {
+        return content;
+    }
+}

+ 7 - 0
backend-core/src/main/resources/application-local.yml

@@ -39,3 +39,10 @@ mob:
 
 web:
   url: http://localhost/
+
+wx:
+  pay:
+    app_id : wx65c8fde4990db757
+    partner : 1510572871
+    partnerkey : a3d45dca15b42197505a3a82ec27df13
+    notifyurl :

+ 15 - 11
backend-core/src/main/resources/generatorConfig.xml

@@ -20,7 +20,10 @@
 
         <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                         connectionURL="jdbc:mysql://81.68.234.235:33056/17pdf_backend_dev"
-                        userId="root" password="root123"/>
+                        userId="root" password="root123"
+        >
+            <property name="nullCatalogMeansCurrent" value="true" />
+        </jdbcConnection>
 
         <javaModelGenerator targetPackage="cn.kdan.pdf.backend.core.model"
                             targetProject="src/main/java">
@@ -33,16 +36,17 @@
                              targetPackage="cn.kdan.pdf.backend.core.mapper" targetProject="src/main/java">
             <property name="enableSubPackages" value="true"/>
         </javaClientGenerator>
-        <table tableName="convert_types"/>
-        <table tableName="members"/>
-        <table tableName="mission_files"/>
-        <table tableName="missions"/>
-        <table tableName="oauth_client_details"/>
+<!--        <table tableName="convert_types"/>-->
+<!--        <table tableName="members"/>-->
+<!--        <table tableName="mission_files"/>-->
+<!--        <table tableName="missions"/>-->
+<!--        <table tableName="oauth_client_details"/>-->
+<!--        <table tableName="orders"/>-->
+<!--        <table tableName="output_files"/>-->
+<!--        <table tableName="pricing_discounts"/>-->
+<!--        <table tableName="pricings"/>-->
+<!--        <table tableName="set_pricings"/>-->
+<!--        <table tableName="subscriptions"/>-->
         <table tableName="orders"/>
-        <table tableName="output_files"/>
-        <table tableName="pricing_discounts"/>
-        <table tableName="pricings"/>
-        <table tableName="set_pricings"/>
-        <table tableName="subscriptions"/>
     </context>
 </generatorConfiguration>

+ 67 - 135
backend-core/src/main/resources/sqlmap/OrdersMapper.xml

@@ -6,18 +6,16 @@
     <result column="member_id" jdbcType="VARCHAR" property="memberId" />
     <result column="subscription_id" jdbcType="VARCHAR" property="subscriptionId" />
     <result column="payment" jdbcType="INTEGER" property="payment" />
+    <result column="page_pay_url" jdbcType="VARCHAR" property="pagePayUrl" />
     <result column="qrcode_url" jdbcType="VARCHAR" property="qrcodeUrl" />
     <result column="status" jdbcType="INTEGER" property="status" />
+    <result column="result" jdbcType="VARCHAR" property="result" />
     <result column="created_at" jdbcType="TIMESTAMP" property="createdAt" />
     <result column="updated_at" jdbcType="TIMESTAMP" property="updatedAt" />
     <result column="trade_no" jdbcType="DECIMAL" property="tradeNo" />
+    <result column="android_sign" jdbcType="VARCHAR" property="androidSign" />
     <result column="price" jdbcType="REAL" property="price" />
-  </resultMap>
-  <resultMap extends="BaseResultMap" id="ResultMapWithBLOBs" type="cn.kdan.pdf.backend.core.model.OrdersWithBLOBs">
-    <result column="page_pay_url" jdbcType="LONGVARCHAR" property="pagePayUrl" />
-    <result column="result" jdbcType="LONGVARCHAR" property="result" />
-    <result column="android_sign" jdbcType="LONGVARCHAR" property="androidSign" />
-    <result column="android_sign2" jdbcType="LONGVARCHAR" property="androidSign2" />
+    <result column="android_sign2" jdbcType="VARCHAR" property="androidSign2" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -78,28 +76,9 @@
     </where>
   </sql>
   <sql id="Base_Column_List">
-    id, member_id, subscription_id, payment, qrcode_url, `status`, created_at, updated_at, 
-    trade_no, price
-  </sql>
-  <sql id="Blob_Column_List">
-    page_pay_url, `result`, android_sign, android_sign2
+    id, member_id, subscription_id, payment, page_pay_url, qrcode_url, `status`, `result`, 
+    created_at, updated_at, trade_no, android_sign, price, android_sign2
   </sql>
-  <select id="selectByExampleWithBLOBs" parameterType="cn.kdan.pdf.backend.core.model.OrdersExample" resultMap="ResultMapWithBLOBs">
-    select
-    <if test="distinct">
-      distinct
-    </if>
-    <include refid="Base_Column_List" />
-    ,
-    <include refid="Blob_Column_List" />
-    from orders
-    <if test="_parameter != null">
-      <include refid="Example_Where_Clause" />
-    </if>
-    <if test="orderByClause != null">
-      order by ${orderByClause}
-    </if>
-  </select>
   <select id="selectByExample" parameterType="cn.kdan.pdf.backend.core.model.OrdersExample" resultMap="BaseResultMap">
     select
     <if test="distinct">
@@ -114,11 +93,9 @@
       order by ${orderByClause}
     </if>
   </select>
-  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="ResultMapWithBLOBs">
+  <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
     select 
     <include refid="Base_Column_List" />
-    ,
-    <include refid="Blob_Column_List" />
     from orders
     where id = #{id,jdbcType=VARCHAR}
   </select>
@@ -132,19 +109,19 @@
       <include refid="Example_Where_Clause" />
     </if>
   </delete>
-  <insert id="insert" parameterType="cn.kdan.pdf.backend.core.model.OrdersWithBLOBs">
+  <insert id="insert" parameterType="cn.kdan.pdf.backend.core.model.Orders">
     insert into orders (id, member_id, subscription_id, 
-      payment, qrcode_url, `status`, 
-      created_at, updated_at, trade_no, 
-      price, page_pay_url, `result`, 
-      android_sign, android_sign2)
+      payment, page_pay_url, qrcode_url, 
+      `status`, `result`, created_at, 
+      updated_at, trade_no, android_sign, 
+      price, android_sign2)
     values (#{id,jdbcType=VARCHAR}, #{memberId,jdbcType=VARCHAR}, #{subscriptionId,jdbcType=VARCHAR}, 
-      #{payment,jdbcType=INTEGER}, #{qrcodeUrl,jdbcType=VARCHAR}, #{status,jdbcType=INTEGER}, 
-      #{createdAt,jdbcType=TIMESTAMP}, #{updatedAt,jdbcType=TIMESTAMP}, #{tradeNo,jdbcType=DECIMAL}, 
-      #{price,jdbcType=REAL}, #{pagePayUrl,jdbcType=LONGVARCHAR}, #{result,jdbcType=LONGVARCHAR}, 
-      #{androidSign,jdbcType=LONGVARCHAR}, #{androidSign2,jdbcType=LONGVARCHAR})
+      #{payment,jdbcType=INTEGER}, #{pagePayUrl,jdbcType=VARCHAR}, #{qrcodeUrl,jdbcType=VARCHAR}, 
+      #{status,jdbcType=INTEGER}, #{result,jdbcType=VARCHAR}, #{createdAt,jdbcType=TIMESTAMP}, 
+      #{updatedAt,jdbcType=TIMESTAMP}, #{tradeNo,jdbcType=DECIMAL}, #{androidSign,jdbcType=VARCHAR}, 
+      #{price,jdbcType=REAL}, #{androidSign2,jdbcType=VARCHAR})
   </insert>
-  <insert id="insertSelective" parameterType="cn.kdan.pdf.backend.core.model.OrdersWithBLOBs">
+  <insert id="insertSelective" parameterType="cn.kdan.pdf.backend.core.model.Orders">
     insert into orders
     <trim prefix="(" suffix=")" suffixOverrides=",">
       <if test="id != null">
@@ -159,12 +136,18 @@
       <if test="payment != null">
         payment,
       </if>
+      <if test="pagePayUrl != null">
+        page_pay_url,
+      </if>
       <if test="qrcodeUrl != null">
         qrcode_url,
       </if>
       <if test="status != null">
         `status`,
       </if>
+      <if test="result != null">
+        `result`,
+      </if>
       <if test="createdAt != null">
         created_at,
       </if>
@@ -174,18 +157,12 @@
       <if test="tradeNo != null">
         trade_no,
       </if>
-      <if test="price != null">
-        price,
-      </if>
-      <if test="pagePayUrl != null">
-        page_pay_url,
-      </if>
-      <if test="result != null">
-        `result`,
-      </if>
       <if test="androidSign != null">
         android_sign,
       </if>
+      <if test="price != null">
+        price,
+      </if>
       <if test="androidSign2 != null">
         android_sign2,
       </if>
@@ -203,12 +180,18 @@
       <if test="payment != null">
         #{payment,jdbcType=INTEGER},
       </if>
+      <if test="pagePayUrl != null">
+        #{pagePayUrl,jdbcType=VARCHAR},
+      </if>
       <if test="qrcodeUrl != null">
         #{qrcodeUrl,jdbcType=VARCHAR},
       </if>
       <if test="status != null">
         #{status,jdbcType=INTEGER},
       </if>
+      <if test="result != null">
+        #{result,jdbcType=VARCHAR},
+      </if>
       <if test="createdAt != null">
         #{createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -218,20 +201,14 @@
       <if test="tradeNo != null">
         #{tradeNo,jdbcType=DECIMAL},
       </if>
+      <if test="androidSign != null">
+        #{androidSign,jdbcType=VARCHAR},
+      </if>
       <if test="price != null">
         #{price,jdbcType=REAL},
       </if>
-      <if test="pagePayUrl != null">
-        #{pagePayUrl,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="result != null">
-        #{result,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="androidSign != null">
-        #{androidSign,jdbcType=LONGVARCHAR},
-      </if>
       <if test="androidSign2 != null">
-        #{androidSign2,jdbcType=LONGVARCHAR},
+        #{androidSign2,jdbcType=VARCHAR},
       </if>
     </trim>
   </insert>
@@ -256,12 +233,18 @@
       <if test="record.payment != null">
         payment = #{record.payment,jdbcType=INTEGER},
       </if>
+      <if test="record.pagePayUrl != null">
+        page_pay_url = #{record.pagePayUrl,jdbcType=VARCHAR},
+      </if>
       <if test="record.qrcodeUrl != null">
         qrcode_url = #{record.qrcodeUrl,jdbcType=VARCHAR},
       </if>
       <if test="record.status != null">
         `status` = #{record.status,jdbcType=INTEGER},
       </if>
+      <if test="record.result != null">
+        `result` = #{record.result,jdbcType=VARCHAR},
+      </if>
       <if test="record.createdAt != null">
         created_at = #{record.createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -271,63 +254,41 @@
       <if test="record.tradeNo != null">
         trade_no = #{record.tradeNo,jdbcType=DECIMAL},
       </if>
+      <if test="record.androidSign != null">
+        android_sign = #{record.androidSign,jdbcType=VARCHAR},
+      </if>
       <if test="record.price != null">
         price = #{record.price,jdbcType=REAL},
       </if>
-      <if test="record.pagePayUrl != null">
-        page_pay_url = #{record.pagePayUrl,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="record.result != null">
-        `result` = #{record.result,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="record.androidSign != null">
-        android_sign = #{record.androidSign,jdbcType=LONGVARCHAR},
-      </if>
       <if test="record.androidSign2 != null">
-        android_sign2 = #{record.androidSign2,jdbcType=LONGVARCHAR},
+        android_sign2 = #{record.androidSign2,jdbcType=VARCHAR},
       </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
   </update>
-  <update id="updateByExampleWithBLOBs" parameterType="map">
-    update orders
-    set id = #{record.id,jdbcType=VARCHAR},
-      member_id = #{record.memberId,jdbcType=VARCHAR},
-      subscription_id = #{record.subscriptionId,jdbcType=VARCHAR},
-      payment = #{record.payment,jdbcType=INTEGER},
-      qrcode_url = #{record.qrcodeUrl,jdbcType=VARCHAR},
-      `status` = #{record.status,jdbcType=INTEGER},
-      created_at = #{record.createdAt,jdbcType=TIMESTAMP},
-      updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
-      trade_no = #{record.tradeNo,jdbcType=DECIMAL},
-      price = #{record.price,jdbcType=REAL},
-      page_pay_url = #{record.pagePayUrl,jdbcType=LONGVARCHAR},
-      `result` = #{record.result,jdbcType=LONGVARCHAR},
-      android_sign = #{record.androidSign,jdbcType=LONGVARCHAR},
-      android_sign2 = #{record.androidSign2,jdbcType=LONGVARCHAR}
-    <if test="_parameter != null">
-      <include refid="Update_By_Example_Where_Clause" />
-    </if>
-  </update>
   <update id="updateByExample" parameterType="map">
     update orders
     set id = #{record.id,jdbcType=VARCHAR},
       member_id = #{record.memberId,jdbcType=VARCHAR},
       subscription_id = #{record.subscriptionId,jdbcType=VARCHAR},
       payment = #{record.payment,jdbcType=INTEGER},
+      page_pay_url = #{record.pagePayUrl,jdbcType=VARCHAR},
       qrcode_url = #{record.qrcodeUrl,jdbcType=VARCHAR},
       `status` = #{record.status,jdbcType=INTEGER},
+      `result` = #{record.result,jdbcType=VARCHAR},
       created_at = #{record.createdAt,jdbcType=TIMESTAMP},
       updated_at = #{record.updatedAt,jdbcType=TIMESTAMP},
       trade_no = #{record.tradeNo,jdbcType=DECIMAL},
-      price = #{record.price,jdbcType=REAL}
+      android_sign = #{record.androidSign,jdbcType=VARCHAR},
+      price = #{record.price,jdbcType=REAL},
+      android_sign2 = #{record.androidSign2,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
   </update>
-  <update id="updateByPrimaryKeySelective" parameterType="cn.kdan.pdf.backend.core.model.OrdersWithBLOBs">
+  <update id="updateByPrimaryKeySelective" parameterType="cn.kdan.pdf.backend.core.model.Orders">
     update orders
     <set>
       <if test="memberId != null">
@@ -339,12 +300,18 @@
       <if test="payment != null">
         payment = #{payment,jdbcType=INTEGER},
       </if>
+      <if test="pagePayUrl != null">
+        page_pay_url = #{pagePayUrl,jdbcType=VARCHAR},
+      </if>
       <if test="qrcodeUrl != null">
         qrcode_url = #{qrcodeUrl,jdbcType=VARCHAR},
       </if>
       <if test="status != null">
         `status` = #{status,jdbcType=INTEGER},
       </if>
+      <if test="result != null">
+        `result` = #{result,jdbcType=VARCHAR},
+      </if>
       <if test="createdAt != null">
         created_at = #{createdAt,jdbcType=TIMESTAMP},
       </if>
@@ -354,70 +321,35 @@
       <if test="tradeNo != null">
         trade_no = #{tradeNo,jdbcType=DECIMAL},
       </if>
+      <if test="androidSign != null">
+        android_sign = #{androidSign,jdbcType=VARCHAR},
+      </if>
       <if test="price != null">
         price = #{price,jdbcType=REAL},
       </if>
-      <if test="pagePayUrl != null">
-        page_pay_url = #{pagePayUrl,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="result != null">
-        `result` = #{result,jdbcType=LONGVARCHAR},
-      </if>
-      <if test="androidSign != null">
-        android_sign = #{androidSign,jdbcType=LONGVARCHAR},
-      </if>
       <if test="androidSign2 != null">
-        android_sign2 = #{androidSign2,jdbcType=LONGVARCHAR},
+        android_sign2 = #{androidSign2,jdbcType=VARCHAR},
       </if>
     </set>
     where id = #{id,jdbcType=VARCHAR}
   </update>
-  <update id="updateByPrimaryKeyWithBLOBs" parameterType="cn.kdan.pdf.backend.core.model.OrdersWithBLOBs">
-    update orders
-    set member_id = #{memberId,jdbcType=VARCHAR},
-      subscription_id = #{subscriptionId,jdbcType=VARCHAR},
-      payment = #{payment,jdbcType=INTEGER},
-      qrcode_url = #{qrcodeUrl,jdbcType=VARCHAR},
-      `status` = #{status,jdbcType=INTEGER},
-      created_at = #{createdAt,jdbcType=TIMESTAMP},
-      updated_at = #{updatedAt,jdbcType=TIMESTAMP},
-      trade_no = #{tradeNo,jdbcType=DECIMAL},
-      price = #{price,jdbcType=REAL},
-      page_pay_url = #{pagePayUrl,jdbcType=LONGVARCHAR},
-      `result` = #{result,jdbcType=LONGVARCHAR},
-      android_sign = #{androidSign,jdbcType=LONGVARCHAR},
-      android_sign2 = #{androidSign2,jdbcType=LONGVARCHAR}
-    where id = #{id,jdbcType=VARCHAR}
-  </update>
   <update id="updateByPrimaryKey" parameterType="cn.kdan.pdf.backend.core.model.Orders">
     update orders
     set member_id = #{memberId,jdbcType=VARCHAR},
       subscription_id = #{subscriptionId,jdbcType=VARCHAR},
       payment = #{payment,jdbcType=INTEGER},
+      page_pay_url = #{pagePayUrl,jdbcType=VARCHAR},
       qrcode_url = #{qrcodeUrl,jdbcType=VARCHAR},
       `status` = #{status,jdbcType=INTEGER},
+      `result` = #{result,jdbcType=VARCHAR},
       created_at = #{createdAt,jdbcType=TIMESTAMP},
       updated_at = #{updatedAt,jdbcType=TIMESTAMP},
       trade_no = #{tradeNo,jdbcType=DECIMAL},
-      price = #{price,jdbcType=REAL}
+      android_sign = #{androidSign,jdbcType=VARCHAR},
+      price = #{price,jdbcType=REAL},
+      android_sign2 = #{androidSign2,jdbcType=VARCHAR}
     where id = #{id,jdbcType=VARCHAR}
   </update>
-  <select id="selectByExampleWithBLOBsWithRowbounds" parameterType="cn.kdan.pdf.backend.core.model.OrdersExample" resultMap="ResultMapWithBLOBs">
-    select
-    <if test="distinct">
-      distinct
-    </if>
-    <include refid="Base_Column_List" />
-    ,
-    <include refid="Blob_Column_List" />
-    from orders
-    <if test="_parameter != null">
-      <include refid="Example_Where_Clause" />
-    </if>
-    <if test="orderByClause != null">
-      order by ${orderByClause}
-    </if>
-  </select>
   <select id="selectByExampleWithRowbounds" parameterType="cn.kdan.pdf.backend.core.model.OrdersExample" resultMap="BaseResultMap">
     select
     <if test="distinct">