Quellcode durchsuchen

Merge remote-tracking branch 'origin/master'

tianyunperfect vor 3 Jahren
Ursprung
Commit
f81e88be96

+ 32 - 0
book-dao/src/main/java/com/book/dao/VO/PalmpayResponse.java

@@ -0,0 +1,32 @@
+package com.book.dao.VO;
+
+import lombok.Data;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+@Data
+public class PalmpayResponse {
+  private String err;
+  private String errcode;
+ private Result result;
+
+
+ @Data
+ public static class Result{
+    private String sign;
+     private String signType;
+     private String money;
+     private String appid;
+     private String charset;
+     private String pay_info;
+     private String outTradeNo;
+     private String mchId;
+     private String pdorderid;
+     private String version;
+
+ }
+}

+ 16 - 0
book-dao/src/main/java/com/book/dao/VO/WxPayInfo.java

@@ -0,0 +1,16 @@
+package com.book.dao.VO;
+
+import lombok.Data;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+@Data
+public class WxPayInfo {
+  private Integer userId;
+  private String orderId;
+  private String payInfo;
+}

+ 16 - 0
book-dao/src/main/java/com/book/dao/VO/WxPayRequest.java

@@ -0,0 +1,16 @@
+package com.book.dao.VO;
+
+import lombok.Data;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+@Data
+public class WxPayRequest {
+    private Long userId;
+    private Integer goodId;
+    private String ip;
+}

+ 1 - 0
book-server/src/main/java/com/book/server/common/entity/ResultCode.java

@@ -9,6 +9,7 @@ public enum ResultCode {
     NOMONEY(10000, "金币不足"),
     IDEXIST(10001, "书籍 ID 已存在"),
     PARAMERROR(10002, "参数错误"),
+    ORDER_FAIL(10003, "下单失败"),
     ;
 
     private Integer code;

+ 65 - 0
book-server/src/main/java/com/book/server/controller/WxPayController.java

@@ -0,0 +1,65 @@
+package com.book.server.controller;
+
+import com.book.dao.VO.UserRecentReadVO;
+import com.book.dao.VO.WxPayInfo;
+import com.book.dao.VO.WxPayRequest;
+import com.book.dao.cps.entity.Goods;
+import com.book.dao.cps.mapper.GoodsMapper;
+import com.book.dao.cpsshard.entity.UserRecentlyRead;
+import com.book.server.common.entity.Result;
+import com.book.server.common.entity.ResultCode;
+import com.book.server.service.WxPayService;
+import com.book.server.utils.NetworkUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+@RestController
+@RequestMapping("/api/wxpay")
+@Slf4j
+public class WxPayController extends BaseController {
+    @Autowired
+    private GoodsMapper goodsMapper;
+    @Autowired
+    private WxPayService wxPayService;
+
+    /**
+     * 创建订单
+     *
+     * @param wxPayRequest
+     * @return
+     */
+    @PostMapping("/createOrder")
+    public Result<WxPayInfo> createOrder(@RequestBody WxPayRequest wxPayRequest, HttpServletRequest request) {
+        String ip = null;
+        try {
+            ip = NetworkUtil.getIpAddress(request);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        wxPayRequest.setIp(ip);
+        Result<WxPayInfo> success = Result.byObject(wxPayService.createOrder(wxPayRequest), ResultCode.ORDER_FAIL);
+        return success;
+
+    }
+
+    @PostMapping("/notify")
+    public String PayNotify() {
+
+        return "success";
+
+    }
+
+}

+ 20 - 0
book-server/src/main/java/com/book/server/service/WxPayService.java

@@ -0,0 +1,20 @@
+package com.book.server.service;
+
+import com.book.dao.VO.WxPayInfo;
+import com.book.dao.VO.WxPayRequest;
+import com.book.server.common.entity.Result;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+
+public interface WxPayService {
+
+
+    WxPayInfo createOrder(WxPayRequest wxPayRequest);
+
+
+}

+ 122 - 0
book-server/src/main/java/com/book/server/service/impl/WxPayServiceImpl.java

@@ -0,0 +1,122 @@
+package com.book.server.service.impl;
+
+import com.book.dao.VO.PalmpayResponse;
+import com.book.dao.VO.WxPayInfo;
+import com.book.dao.VO.WxPayRequest;
+import com.book.dao.cps.entity.Goods;
+import com.book.dao.cps.mapper.AdminConfigMapper;
+import com.book.dao.cps.mapper.ConfigMapper;
+import com.book.dao.cps.mapper.GoodsMapper;
+import com.book.dao.cps.mapper.OphostMapper;
+import com.book.dao.cps.pojo.AdminConfig;
+import com.book.dao.cps.pojo.Config;
+import com.book.dao.cps.pojo.Ophost;
+import com.book.dao.cps.pojo.User;
+import com.book.server.common.entity.Result;
+import com.book.server.service.UserService;
+import com.book.server.service.WxPayService;
+import com.book.server.utils.DateUtil;
+import com.book.server.utils.HTTPSUtil;
+import com.book.server.utils.JsonUtils;
+import com.book.server.utils.Md5Util;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * created in 2021/8/30
+ * Project: book-store
+ *
+ * @author win7
+ */
+@Service
+public class WxPayServiceImpl implements WxPayService {
+
+    public static final String PALMPAY_APPID = "";
+    public static final String PALMPAY_APPKEY = "";
+    public static final String PALMPAY_MCHID = "";
+    public static final String PALMPAY_URL = "https://pay.palmpay.cn/sdkServer/thirdpays/pay/WECHAT_SUB";
+    @Autowired
+    private GoodsMapper goodsMapper;
+    @Autowired
+    private AdminConfigMapper adminConfigMapper;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private ConfigMapper configMapper;
+    @Autowired
+    private OphostMapper ophostMapper;
+
+    @Override
+    public WxPayInfo createOrder(WxPayRequest wxPayRequest) {
+        Integer goodId = wxPayRequest.getGoodId();
+        Goods goods = goodsMapper.selectByPrimaryKey(goodId);
+        if (goods == null) {
+            return null;
+        }
+        BigDecimal money = goods.getMoney();
+        String amount = money.multiply(new BigDecimal(100)).toString();
+        //todo 支付域名
+        User userByUserId = userService.getUserByUserId(wxPayRequest.getUserId());
+        Integer channelId = userByUserId.getChannelId();
+        AdminConfig adminConfig = adminConfigMapper.selectByPrimaryKey(channelId);
+        Integer ophostId = adminConfig.getOphostId();
+        Ophost ophost = ophostMapper.selectByPrimaryKey(ophostId);
+        Config url_pay = configMapper.selectByName("url_pay");
+        String url = url_pay.getValue();
+        //todo 入库
+
+
+        HashMap<String, String> map = new HashMap();
+
+
+        long orderid = TimeUnit.NANOSECONDS.convert(System.currentTimeMillis(), TimeUnit.SECONDS) + wxPayRequest.getUserId();
+
+        map.put("appid", PALMPAY_APPID);
+        map.put("mchId", PALMPAY_MCHID);
+        map.put("version", "3.0");
+        map.put("charset", "UTF-8");
+        map.put("signType", "MD5");
+        map.put("productName", goods.getTitle());
+        map.put("productDesc", goods.getTitle());
+        map.put("outTradeNo", orderid + "");
+        map.put("money", amount);
+        map.put("callbackUrl", String.format("http://%s.%s/home.html#/center?userId=" + wxPayRequest.getUserId(), adminConfig.getAppid(), ophost.getHost()));
+        map.put("notifyUrl", url + "/api/wxpay/notify");
+        map.put("ip", wxPayRequest.getIp());
+
+
+        map.put("subAppid", adminConfig.getAppid());
+        map.put("openid", userByUserId.getOpenid());
+        map.put("api", "1");
+
+
+        String str = PALMPAY_APPID + "WECHAT_SUB" + money + orderid + PALMPAY_APPKEY;
+
+        String sign = Md5Util.md5(str);
+        // sign = generalSign(map,md5key);
+        map.put("sign", sign);
+
+        String form = DateUtil.maptoform(map) + "";
+        System.out.println("请求:" + PALMPAY_URL + "?" + form);
+        String result = HTTPSUtil.sendGetByHttps(PALMPAY_URL, map);
+        System.out.println("响应:" + result);
+        PalmpayResponse object = JsonUtils.getObject(result, PalmpayResponse.class);
+        if (object == null) {
+            return null;
+        }
+        if (!"0".equals(object.getErrcode())) {
+            return null;
+        }
+        PalmpayResponse.Result r = object.getResult();
+        WxPayInfo wxPayInfo = new WxPayInfo();
+
+        r.getPay_info();
+        wxPayInfo.setPayInfo(r.getPay_info());
+        wxPayInfo.setOrderId(r.getOutTradeNo());
+        return wxPayInfo;
+    }
+}

+ 49 - 0
book-server/src/main/java/com/book/server/utils/DateUtil.java

@@ -0,0 +1,49 @@
+package com.book.server.utils;
+
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+public class DateUtil {
+	
+	public static String maptoform(Map<String, String> map){
+		String str="";
+		
+		for(String key:map.keySet()){
+			str=str+key+"="+URLEncoder.encode(map.get(key))+"&";
+		}
+		str = str.substring(0,str.length()-1);
+	
+		return str;
+	}
+
+	
+	public static String maptosortform(Map<String, String> map){
+		String str="";
+		
+		for(String key:map.keySet()){
+			str=str+key+"="+map.get(key)+"&";
+		}
+		str = str.substring(0,str.length()-1);
+	
+		return str;
+	}
+	
+	 public static String createLinkString(Map<String, String> params) {
+	        List<String> keys = new ArrayList<String>(params.keySet());
+	        Collections.sort(keys);
+	        String prestr = "";
+	        for (int i = 0; i < keys.size(); i++) {
+	            String key = keys.get(i);
+	            String value = params.get(key);
+	            if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
+	                prestr = prestr + key + "=" + value;
+	            } else {
+	                prestr = prestr + key + "=" + value + "&";
+	            }
+	        }
+	        return prestr;
+	    }
+}

+ 132 - 0
book-server/src/main/java/com/book/server/utils/HTTPSUtil.java

@@ -0,0 +1,132 @@
+package com.book.server.utils;
+
+import javax.net.ssl.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.cert.X509Certificate;
+import java.util.Iterator;
+import java.util.Map;
+
+public class HTTPSUtil {
+
+    /**
+	 * 参数编码
+	 * @param data
+	 * @return 
+	 */
+	public static String httpBuildQuery(Map<String, String> data) {
+		if(data==null||data.size() == 0) return "";
+		
+		String ret = "";
+		String k, v;
+		Iterator<String> iterator = data.keySet().iterator();
+		while (iterator.hasNext()) {
+			k = iterator.next();
+			v = data.get(k);
+			if(v == null) continue;
+			try {
+				ret += URLEncoder.encode(k, "utf8") + "=" + URLEncoder.encode(v, "utf8");
+			} catch (Exception e) {
+				System.out.println(e.toString());
+				continue;
+			}
+			ret += "&";
+		}
+		return ret.substring(0, ret.length() - 1);
+	}
+
+    private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
+        public boolean verify(String hostname, SSLSession session) {
+            return true;
+        }
+    };
+
+    private static void trustAllHosts() {
+        // Create a trust manager that does not validate certificate chains
+        TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {
+            public X509Certificate[] getAcceptedIssuers() {
+                return new X509Certificate[]{};
+            }
+
+            public void checkClientTrusted(X509Certificate[] chain, String authType) {
+            }
+
+            public void checkServerTrusted(X509Certificate[] chain, String authType) {
+            }
+        }};
+        // Install the all-trusting trust manager
+        try {
+            SSLContext sc = SSLContext.getInstance("TLS");
+            sc.init(null, trustAllCerts, new java.security.SecureRandom());
+            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String sendGetByHttps(String url,Map<String,String> paramsMap) {
+        String result = "";
+        PrintWriter out = null;
+        BufferedReader in = null;
+        HttpURLConnection conn;
+        String params = httpBuildQuery(paramsMap);
+        url = paramsMap!=null&&paramsMap.size() > 0 ? url+"?"+params:url;
+//        System.out.println(url);
+        try {
+        	
+            trustAllHosts();
+            URL realUrl = new URL(url);
+           
+            //通过请求地址判断请求类型(http或者是https)
+            if (realUrl.getProtocol().toLowerCase().equals("https")) {
+                HttpsURLConnection https = (HttpsURLConnection) realUrl.openConnection();
+                https.setHostnameVerifier(DO_NOT_VERIFY);
+                conn = https;
+            } else {
+                conn = (HttpURLConnection) realUrl.openConnection();
+            }
+            // 设置通用的请求属性
+            conn.setRequestProperty("accept", "*/*");
+            conn.setRequestProperty("connection", "Keep-Alive");
+            conn.setRequestProperty("user-agent",
+                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
+            conn.setRequestProperty("Content-Type", "text/plain;charset=utf-8");
+            // 发送POST请求必须设置如下两行
+            conn.setDoOutput(true);
+            conn.setDoInput(true);
+            // 获取URLConnection对象对应的输出流
+            out = new PrintWriter(conn.getOutputStream());
+            // 发送请求参数
+            out.print(params);
+            // flush输出流的缓冲
+            out.flush();
+            // 定义BufferedReader输入流来读取URL的响应
+            in = new BufferedReader(
+                    new InputStreamReader(conn.getInputStream()));
+            String line;
+            while ((line = in.readLine()) != null) {
+                result += line;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {// 使用finally块来关闭输出流、输入流
+            try {
+                if (out != null) {
+                    out.close();
+                }
+                if (in != null) {
+                    in.close();
+                }
+            } catch (IOException ex) {
+                ex.printStackTrace();
+            }
+        }
+        return result;
+    }
+   
+}

+ 46 - 0
book-server/src/main/java/com/book/server/utils/Md5Util.java

@@ -0,0 +1,46 @@
+package com.book.server.utils;
+
+
+import java.io.UnsupportedEncodingException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+
+public class Md5Util {
+	
+	
+	
+		/**
+		 * MD5工具
+		 * @param str
+		 * @return 
+		 */
+		public static String md5(String str) {
+	      if (str == null) {
+	          return null;
+	      }
+	      MessageDigest messageDigest = null;
+
+	      try {
+	          messageDigest = MessageDigest.getInstance("MD5");
+	          messageDigest.reset();
+	          messageDigest.update(str.getBytes("UTF-8"));
+	      } catch (NoSuchAlgorithmException e) {
+	          return str;
+	      } catch (UnsupportedEncodingException e) {
+	          return str;
+	      }
+
+	      byte[] byteArray = messageDigest.digest();
+	      StringBuffer md5StrBuff = new StringBuffer();
+	      for (int i = 0; i < byteArray.length; i++) {
+	          if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
+	              md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
+	          else
+	              md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
+	      }
+	      return md5StrBuff.toString();
+	    }
+		
+		
+}

+ 64 - 0
book-server/src/main/java/com/book/server/utils/NetworkUtil.java

@@ -0,0 +1,64 @@
+package com.book.server.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.net.InetAddress;
+
+/**
+ * 常用获取客户端信息的工具
+ *
+ */
+public final class NetworkUtil {
+
+
+    /**
+     * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
+     *
+     * @param request
+     * @return
+     * @throws
+     */
+    public final static String getIpAddress(HttpServletRequest request) throws IOException {
+        // 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
+
+        String ip = request.getHeader("X-Forwarded-For");
+
+        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("WL-Proxy-Client-IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_CLIENT_IP");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+            }
+            if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+                if(ip.equals("127.0.0.1")){
+                    //根据网卡取本机配置的IP
+                    InetAddress inet=null;
+                    try {
+                        inet = InetAddress.getLocalHost();
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                    ip= inet.getHostAddress();
+                }
+            }
+        } else if (ip.length() > 15) {
+            String[] ips = ip.split(",");
+            for (int index = 0; index < ips.length; index++) {
+                String strIp = ips[index];
+                if (!("unknown".equalsIgnoreCase(strIp))) {
+                    ip = strIp;
+                    break;
+                }
+            }
+        }
+        return ip;
+    }
+}