Browse Source

1111212121212

liujiankang 5 years ago
parent
commit
08908038bc
25 changed files with 975 additions and 158 deletions
  1. 5 3
      wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/WechatUtils.java
  2. 10 28
      wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/personality/PersonalityRecommended.java
  3. 44 0
      wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/personality/PersonalityResults.java
  4. 196 0
      wechat-common-core/src/main/java/com/iamberry/wechat/tools/HttpClientUtil.java
  5. 80 25
      wechat-common-core/src/main/java/com/iamberry/wechat/tools/WeixinUtil.java
  6. 2 0
      wechat-common-tool/src/main/java/com/iamberry/wechat/tools/NameUtils.java
  7. 3 1
      wechat-common-web/src/main/java/com/iamberry/common/web/SimpleCORSFilter.java
  8. 8 2
      wechat-wechat-interface/src/main/java/com/iamberry/wechat/face/Personality/PersonalitySubjectService.java
  9. 19 4
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/Personality/PersonalitySubjectServiceImpl.java
  10. 10 3
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/PersonalitySubjectMapper.java
  11. 2 1
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/homeMemberMapper.xml
  12. 5 45
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/memberMapper.xml
  13. 12 5
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/personalitySubjectMapper.xml
  14. 29 18
      wechat-wechat-service/src/main/java/com/iamberry/wechat/service/wechat/ConfigServiceImpl.java
  15. 1 1
      wechat-wechat-web/src/main/java/com/iamberry/wechat/filters/CSRFTokenFilter.java
  16. 2 2
      wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/home/HomeHandler.java
  17. 17 1
      wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/pay/WechatBackHandler.java
  18. 183 13
      wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/personality/personalityHandler.java
  19. 2 2
      wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/wechat/menu/MenuInfoHandler.java
  20. 340 0
      wechat-wechat-web/src/main/java/com/iamberry/wechat/utils/ImageUtil.java
  21. 3 3
      wechat-wechat-web/src/main/resources/log4j.properties
  22. 1 0
      wechat-wechat-web/src/main/resources/mybatis.xml
  23. BIN
      wechat-wechat-web/src/main/webapp/WEB-INF/common/images/kfx-1.png
  24. BIN
      wechat-wechat-web/src/main/webapp/WEB-INF/common/images/kfx-2.png
  25. 1 1
      wechat-wechat-web/src/main/webapp/WEB-INF/web.xml

+ 5 - 3
wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/WechatUtils.java

@@ -128,7 +128,8 @@ public class WechatUtils {
 			builder.append(NameUtils.getConfig("appId"))
 			.append("&redirect_uri=")
 			.append(URLEncoder.encode(urlTemp, "UTF-8"))
-			.append("&response_type=code&scope=snsapi_base&state=iamberry#wechat_redirect");
+			/*.append("&response_type=code&scope=snsapi_base&state=iamberry#wechat_redirect");*/
+			.append("&response_type=code&scope=snsapi_userinfo&state=iamberry#wechat_redirect");
 			return builder.toString();
 		} catch (UnsupportedEncodingException e) {
 			e.printStackTrace();
@@ -171,8 +172,9 @@ public class WechatUtils {
 		builder.append(NameUtils.getConfig("appId"))
 		.append("&redirect_uri=")
 		.append(URLEncoder.encode(redirect_url, "UTF-8"))
-		.append("&response_type=code&scope=snsapi_base&state=iamberry#wechat_redirect");
-		
+		/*.append("&response_type=code&scope=snsapi_base&state=iamberry#wechat_redirect");*/
+		.append("&response_type=code&scope=snsapi_userinfo&state=iamberry#wechat_redirect");
+
 		return builder.toString();
 	}
 

+ 10 - 28
wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/personality/PersonalityRecommended.java

@@ -6,11 +6,9 @@ import java.util.List;
 public class PersonalityRecommended implements Serializable {
     private static final long serialVersionUID = -7432868161064829901L;
     private Integer recommendedId;
-    private String recommendedTitle;//推荐标题
-    private String recommendedDesc;//推荐内容
-    private Integer recommendedIsHighlow;//高分/低分推荐
+    private String recommendedHighUrl;//高分图片url
+    private String recommendedLowUrl;//低分图片url
     private Integer recommendedTypeId;//人格类型id
-    private List<PersonalityBooks> listPersonalityBooks;
 
     public Integer getRecommendedId() {
         return recommendedId;
@@ -20,28 +18,20 @@ public class PersonalityRecommended implements Serializable {
         this.recommendedId = recommendedId;
     }
 
-    public String getRecommendedTitle() {
-        return recommendedTitle;
+    public String getRecommendedHighUrl() {
+        return recommendedHighUrl;
     }
 
-    public void setRecommendedTitle(String recommendedTitle) {
-        this.recommendedTitle = recommendedTitle;
+    public void setRecommendedHighUrl(String recommendedHighUrl) {
+        this.recommendedHighUrl = recommendedHighUrl;
     }
 
-    public String getRecommendedDesc() {
-        return recommendedDesc;
+    public String getRecommendedLowUrl() {
+        return recommendedLowUrl;
     }
 
-    public void setRecommendedDesc(String recommendedDesc) {
-        this.recommendedDesc = recommendedDesc;
-    }
-
-    public Integer getRecommendedIsHighlow() {
-        return recommendedIsHighlow;
-    }
-
-    public void setRecommendedIsHighlow(Integer recommendedIsHighlow) {
-        this.recommendedIsHighlow = recommendedIsHighlow;
+    public void setRecommendedLowUrl(String recommendedLowUrl) {
+        this.recommendedLowUrl = recommendedLowUrl;
     }
 
     public Integer getRecommendedTypeId() {
@@ -51,12 +41,4 @@ public class PersonalityRecommended implements Serializable {
     public void setRecommendedTypeId(Integer recommendedTypeId) {
         this.recommendedTypeId = recommendedTypeId;
     }
-
-    public List<PersonalityBooks> getListPersonalityBooks() {
-        return listPersonalityBooks;
-    }
-
-    public void setListPersonalityBooks(List<PersonalityBooks> listPersonalityBooks) {
-        this.listPersonalityBooks = listPersonalityBooks;
-    }
 }

+ 44 - 0
wechat-common-core/src/main/java/com/iamberry/wechat/core/entity/personality/PersonalityResults.java

@@ -0,0 +1,44 @@
+package com.iamberry.wechat.core.entity.personality;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class PersonalityResults implements Serializable {
+    private static final long serialVersionUID = 3940169680330230692L;
+    private Integer resultsId;
+    private String resultsOpenid;
+    private String resultsUrl;
+    private Date resultsCreateTime;
+
+    public Integer getResultsId() {
+        return resultsId;
+    }
+
+    public void setResultsId(Integer resultsId) {
+        this.resultsId = resultsId;
+    }
+
+    public String getResultsOpenid() {
+        return resultsOpenid;
+    }
+
+    public void setResultsOpenid(String resultsOpenid) {
+        this.resultsOpenid = resultsOpenid;
+    }
+
+    public String getResultsUrl() {
+        return resultsUrl;
+    }
+
+    public void setResultsUrl(String resultsUrl) {
+        this.resultsUrl = resultsUrl;
+    }
+
+    public Date getResultsCreateTime() {
+        return resultsCreateTime;
+    }
+
+    public void setResultsCreateTime(Date resultsCreateTime) {
+        this.resultsCreateTime = resultsCreateTime;
+    }
+}

+ 196 - 0
wechat-common-core/src/main/java/com/iamberry/wechat/tools/HttpClientUtil.java

@@ -0,0 +1,196 @@
+package com.iamberry.wechat.tools;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.net.URLConnection;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.StatusLine;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.HttpResponseException;
+import org.apache.http.client.ResponseHandler;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+
+
+
+public class HttpClientUtil {
+
+    private static class SingletonHolder{
+        private final static  HttpClientUtil INSTANCE=new HttpClientUtil();
+    }
+
+    private HttpClientUtil(){}
+
+    public static HttpClientUtil getInstance(){
+        return SingletonHolder.INSTANCE;
+    }
+
+    public  String get(String url){
+        CharsetHandler handler = new CharsetHandler("UTF-8");
+        CloseableHttpClient client = null;
+        try {
+            HttpGet httpget = new HttpGet(new URI(url));
+            HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+            client= httpClientBuilder.build();
+            client = (CloseableHttpClient) wrapClient(client);
+            return client.execute(httpget, handler);
+        } catch (Exception e) {
+            //e.printStackTrace();
+            return "";
+        }finally {
+            try {
+                if(client!=null){
+                    client.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+    public static String post(String url, String params,String contentType)
+    {
+
+        //创建HttpClientBuilder
+        HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+        //HttpClient
+        CloseableHttpClient client = httpClientBuilder.build();
+        client = (CloseableHttpClient) wrapClient(client);
+
+
+        HttpPost post = new HttpPost(url);
+        CloseableHttpResponse res = null;
+        try
+        {
+            StringEntity s = new StringEntity(params,"UTF-8");
+            if(StringUtils.isBlank(contentType)){
+                s.setContentType("application/json");
+            }
+            s.setContentType(contentType);
+            s.setContentEncoding("utf-8");
+            post.setEntity(s);
+            res = client.execute(post);
+            HttpEntity entity = res.getEntity();
+            return EntityUtils.toString(entity, "utf-8");
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+        } finally {
+            try {
+                res.close();
+                client.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return "";
+    }
+
+    public static String post(String urlStr,String xmlInfo) {
+        String line1 = "";
+        try {
+            URL url = new URL(urlStr);
+            URLConnection con = url.openConnection();
+            con.setDoOutput(true);
+            //con.setRequestProperty("Pragma:", "no-cache");
+            con.setRequestProperty("Cache-Control", "no-cache");
+            con.setRequestProperty("Content-Type", "text/xml");
+
+            OutputStreamWriter out = new OutputStreamWriter(con
+                    .getOutputStream());
+            out.write(new String(xmlInfo.getBytes("utf-8")));
+            out.flush();
+            out.close();
+            BufferedReader br = new BufferedReader(new InputStreamReader(con
+                    .getInputStream()));
+            String line = "";
+            for (line = br.readLine(); line != null; line = br.readLine()) {
+                line1+=line;
+            }
+            return new String(line1.getBytes(),"utf-8");
+        } catch (MalformedURLException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private class CharsetHandler implements ResponseHandler<String> {
+        private String charset;
+
+        public CharsetHandler(String charset) {
+            this.charset = charset;
+        }
+
+        public String handleResponse(HttpResponse response)
+                throws ClientProtocolException, IOException {
+            StatusLine statusLine = response.getStatusLine();
+            if (statusLine.getStatusCode() >= 300) {
+                throw new HttpResponseException(statusLine.getStatusCode(),
+                        statusLine.getReasonPhrase());
+            }
+            HttpEntity entity = response.getEntity();
+            if (entity != null) {
+                if (!StringUtils.isBlank(charset)) {
+                    return EntityUtils.toString(entity, charset);
+                } else {
+                    return EntityUtils.toString(entity);
+                }
+            } else {
+                return null;
+            }
+        }
+    }
+
+    private static  HttpClient wrapClient(HttpClient base) {
+        try {
+            SSLContext ctx = SSLContext.getInstance("TLSv1");
+            X509TrustManager tm = new X509TrustManager() {
+                public void checkClientTrusted(X509Certificate[] xcs,
+                                               String string) throws CertificateException {
+                }
+
+                public void checkServerTrusted(X509Certificate[] xcs,
+                                               String string) throws CertificateException {
+                }
+
+                public X509Certificate[] getAcceptedIssuers() {
+                    return null;
+                }
+            };
+            ctx.init(null, new TrustManager[] { tm }, null);
+            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ctx, new String[] { "TLSv1" }, null,
+                    SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
+            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
+            return httpclient;
+
+        } catch (Exception ex) {
+            return null;
+        }
+    }
+
+}

+ 80 - 25
wechat-common-core/src/main/java/com/iamberry/wechat/tools/WeixinUtil.java

@@ -1,7 +1,9 @@
 package com.iamberry.wechat.tools;
 
+import com.iamberry.app.tool.util.HttpUtility;
 import com.iamberry.cache.LocalCache;
 import com.iamberry.wechat.core.entity.wx.*;
+import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
 import org.slf4j.LoggerFactory;
 
@@ -9,16 +11,15 @@ import javax.net.ssl.HttpsURLConnection;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocketFactory;
 import javax.net.ssl.TrustManager;
-import java.io.BufferedReader;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
+import java.io.*;
 import java.net.ConnectException;
 import java.net.URL;
 import java.net.URLEncoder;
 import java.util.Date;
 import java.util.logging.Logger;
 
+import static com.iamberry.app.tool.util.HttpUtility.httpsGet;
+
 /**
  * 公众平台通用接口工具类
  *
@@ -140,7 +141,7 @@ public class WeixinUtil {
 	 *            密钥
 	 * @return
 	 */
-	public static AccessToken getAccessToken(String appid, String appsecret) {
+/*	public static AccessToken getAccessToken(String appid, String appsecret) {
 		
 		// 根据public No查询access_token
 		Token token = cache.get(NameUtils.getConfig("pubNo"));
@@ -177,7 +178,7 @@ public class WeixinUtil {
 					} catch (Exception e) {
 						accessToken = null;
 						// 获取token失败
-						logger.error("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
+						logger.error("获取token失败1 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
 					}
 				}
 			}
@@ -206,12 +207,12 @@ public class WeixinUtil {
 				} catch (Exception e) {
 					accessToken = null;
 					// 获取token失败
-					logger.error("获取token失败 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
+					logger.error("获取token失败2 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
 				}
 			}
 		}
 		return accessToken;
-	}
+	}*/
 
 	/**
 	 * 获取jsapi_ticket(jsapi_ticket的有效期为7200秒)
@@ -315,7 +316,7 @@ public class WeixinUtil {
 	 * @param json
 	 * @return
 	 */
-	public static QRCJson createQrcode(String json) {
+	/*public static QRCJson createQrcode(String json) {
 		QRCJson qrcJson = new QRCJson();
 		try {
 			AccessToken at = getAccessToken(NameUtils.getConfig("appId"), NameUtils.getConfig("appSecret"));
@@ -335,7 +336,7 @@ public class WeixinUtil {
 			e.printStackTrace();
 		}
 		return qrcJson;
-	}
+	}*/
 
 	/**
 	 * 创建二维码 -- 测试
@@ -436,6 +437,7 @@ public class WeixinUtil {
 		url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
 		jsonObject = httpRequest(url.replaceAll("CODE", code).replaceAll("APPID", appid).replaceAll("SECRET", secret), "GET", null);
 		if (null != jsonObject) {
+			Logger.getAnonymousLogger().info("用户信息user = " + jsonObject);
 			try {
 				openid = jsonObject.getString("openid");
 				access_token = jsonObject.getString("access_token");
@@ -457,14 +459,21 @@ public class WeixinUtil {
 	 * @return
 	 */
 	public  static JSONObject getUserInfo(String openid) {
-		AccessToken token = getAccessToken(NameUtils.getConfig("appId"), NameUtils.getConfig("appSecret"));
-		if (token == null) {
+		AccessToken accessToken = new AccessToken();
+		try {
+			accessToken.setToken(httpsGet(NameUtils.accessToken_url));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		if (accessToken == null) {
 			// 此处如果出错,只能说明程序逻辑改变,存在多线程安全隐患
 			return null;
 		}
 
 		// 获取信息 - 验证
-		JSONObject jsonObject = httpRequest(NameUtils.userinfo_url.replaceAll("ACCESS_TOKEN", token.getToken()).replaceAll("OPENID", openid), "GET", null);
+		JSONObject jsonObject = httpRequest(NameUtils.userinfo_url.replaceAll("ACCESS_TOKEN", accessToken.getToken().substring(1,accessToken.getToken().length()-1)).replaceAll("OPENID", openid), "GET", null);
+        logger.error("请求地址:"+NameUtils.userinfo_url.replaceAll("ACCESS_TOKEN", accessToken.getToken().substring(1,accessToken.getToken().length()-1)).replaceAll("OPENID", openid));
+        logger.error("jsonObject:" + jsonObject);
 		if (null == jsonObject) {
 			// 网络错误
 			return null;
@@ -481,7 +490,7 @@ public class WeixinUtil {
 			// 记录日志
 			logger.error("getUserInfo method throw exception:" + e.getMessage() + "[" + jsonObject + "]");
 			// 判断错误信息是否为 access_token 失效的问题,只有access失效,我们才重新获取,否则每次获取可能导致access_token资源耗尽
-			if (jsonObject.getInt("errcode") != 40001) 
+			/*if (jsonObject.getInt("errcode") != 40001)
 				return jsonObject;
 			
 			// 强制刷新access_token,存在多线程安全隐患!
@@ -493,9 +502,9 @@ public class WeixinUtil {
 			wechatToken.setEndDate(new Date(new Date().getTime() + 6500000));
 			wechatToken.setAppid(NameUtils.getConfig("pubNo"));
 			wechatToken.setToken(accessTokenJsonObject.getString("access_token"));
-			cache.put(NameUtils.getConfig("pubNo"), wechatToken);
+			cache.put(NameUtils.getConfig("pubNo"), wechatToken);*/
 			// 再次获取用户信息
-			return httpRequest(NameUtils.userinfo_url.replaceAll("ACCESS_TOKEN", wechatToken.getToken()).replaceAll("OPENID", openid), "GET", null);
+			return httpRequest(NameUtils.userinfo_url.replaceAll("ACCESS_TOKEN", accessToken.getToken().substring(1,accessToken.getToken().length()-1)).replaceAll("OPENID", openid), "GET", null);
 		}
 		return jsonObject;
 	}
@@ -509,7 +518,7 @@ public class WeixinUtil {
 		logger.info("推送消息模板:"+ template_id );
 
 		// 准备数据
-		AccessToken token = getAccessToken(appId, appSecret);
+		/*AccessToken token = getAccessToken(appId, appSecret);
 		String access_token = token.getToken();
 		String url = sendTemplate  + access_token;
 
@@ -531,16 +540,62 @@ public class WeixinUtil {
 			if (0 != jsonObject.getInt("errcode")) {
 				logger.info("错误 errcode:{} errmsg:{}" + jsonObject.getInt("errcode") + jsonObject.getString("errmsg"));
 			}
-		}
+		}*/
 	}
 
 
-//	public static void main(String[] args) {
-//		String QR_LIMIT_STR_SCENE = "{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"%s\"}}}";
-//		String chananel = "main_channel_id_22";
-//		String json = String.format(QR_LIMIT_STR_SCENE, chananel);
-//		QRCJson qrc = WeixinUtil.createQrcodeTest(json);
-//		String xx = qrc.getUrl();
-//	}
+
+	/**
+	 * 获取用户信息 拉取用户信息(需scope为 snsapi_userinfo)
+	 * 只有在用户将公众号绑定到微信开放平台帐号后,可以获取unionid
+	 *
+	 * @param
+	 * @param
+	 * @return
+	 */
+	public static String[] getUserInfo(String openid, String accessToken) {
+		String userInfoUrl = "https://api.weixin.qq.com/sns/userinfo?lang=zh_CN";
+		userInfoUrl = userInfoUrl + "&access_token=" + accessToken + "&openid=" + openid;
+		JSONObject  json = new JSONObject();
+		try {
+			String s = httpsGet(userInfoUrl);
+			json = JSONObject.fromObject(s);
+		} catch (Exception e2) {
+			e2.printStackTrace();
+		}
+		String nickname = ""; //用户昵称
+		String sex = "";  //用户的性别
+		String province = ""; //用户个人资料填写的省份
+		String city = "";  //普通用户个人资料填写的城市
+		String country = ""; //国家,如中国为CN
+		String headimgurl = ""; //用户头像,
+		String unionid = ""; //
+		String[] s = new String[6];
+		if (json != null) {
+			try {
+				nickname = json.getString("nickname");
+				sex = json.getString("sex");
+				province = json.getString("province");
+				city = json.getString("city");
+				country = json.getString("country");
+				headimgurl = json.getString("headimgurl");
+				s[0] = nickname;
+				s[1] = sex;
+				s[2] = province;
+				s[3] = city;
+				s[4] = country;
+				s[5] = headimgurl;
+			} catch (JSONException e) {
+				String errcode = null;
+				try {
+					errcode = json.getString("errcode");
+					System.out.println("errcode================>获取用户信息失败" + errcode);
+				} catch (JSONException e1) {
+					e1.printStackTrace();
+				}
+			}
+		}
+		return s;
+	}
 
 }

+ 2 - 0
wechat-common-tool/src/main/java/com/iamberry/wechat/tools/NameUtils.java

@@ -69,6 +69,8 @@ public class NameUtils {
 	public static String oauth2_getUserInfo_url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
 	// 引导授权链接
 	public static String oauth2_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
+	// 获取watero accestoken
+	public static String accessToken_url = "https://w.iamberry.com/watero/AccessToken/get_AccessToken";
 
 	/** 
      * 验证码类型为仅数字,即0~9 

+ 3 - 1
wechat-common-web/src/main/java/com/iamberry/common/web/SimpleCORSFilter.java

@@ -20,7 +20,7 @@ import org.apache.commons.lang3.StringUtils;
  */
 public class SimpleCORSFilter implements Filter {
 	
-	public static List<String> origins = new ArrayList<String>(6);
+	public static List<String> origins = new ArrayList<String>(15);
 	
 	static {
 		origins.add("h5.iamberry.com");
@@ -37,6 +37,8 @@ public class SimpleCORSFilter implements Filter {
 		origins.add("test.iamberry.com:801");
 		origins.add("w.iamberry.com:8848");
 		origins.add("test.iamberry.com:8848");
+		origins.add("w.iamberry.com");
+
 	}
     public void init(FilterConfig filterConfig) throws ServletException {}
     public void doFilter(ServletRequest servletRequest, ServletResponse

+ 8 - 2
wechat-wechat-interface/src/main/java/com/iamberry/wechat/face/Personality/PersonalitySubjectService.java

@@ -10,9 +10,15 @@ public interface PersonalitySubjectService {
     //查询答案
     public List<PersonalityAnswer> getAnswer(Integer subjectId);
     //查询题目类型
-    public List<PersonalityType> getType(Integer typeId);
+    public List<PersonalityType> getType();
     //查询推荐内容
-    public PersonalityRecommended getRecommended(PersonalityRecommended personalityRecommended);
+    public PersonalityRecommended getRecommended(Integer recommendedTypeId);
     //查询推荐书籍
     public List<PersonalityBooks> getBooks(Integer booksRecommendedId);
+    //查询单个题目
+    public PersonalitySubject getSubject(Integer subjectId);
+    //查询结果
+    public PersonalityResults getResults(String resultsOpenid);
+    //添加结果
+    public Integer addResults(PersonalityResults personalityResults);
 }

+ 19 - 4
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/Personality/PersonalitySubjectServiceImpl.java

@@ -30,17 +30,32 @@ public class PersonalitySubjectServiceImpl implements PersonalitySubjectService
 	}
 
 	@Override
-	public List<PersonalityType> getType(Integer typeId) {
-		return personalitySubjectMapper.getType(typeId);
+	public List<PersonalityType> getType() {
+		return personalitySubjectMapper.getType();
 	}
 
 	@Override
-	public PersonalityRecommended getRecommended(PersonalityRecommended personalityRecommended) {
-		return personalitySubjectMapper.getRecommended(personalityRecommended);
+	public PersonalityRecommended getRecommended(Integer recommendedTypeId) {
+		return personalitySubjectMapper.getRecommended(recommendedTypeId);
 	}
 
 	@Override
 	public List<PersonalityBooks> getBooks(Integer booksRecommendedId) {
 		return personalitySubjectMapper.getBooks(booksRecommendedId);
 	}
+
+	@Override
+	public PersonalitySubject getSubject(Integer subjectId) {
+		return personalitySubjectMapper.getSubject(subjectId);
+	}
+
+	@Override
+	public PersonalityResults getResults(String resultsOpenid) {
+		return personalitySubjectMapper.getResults(resultsOpenid);
+	}
+
+	@Override
+	public Integer addResults(PersonalityResults personalityResults) {
+		return personalitySubjectMapper.addResults(personalityResults);
+	}
 }

+ 10 - 3
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/PersonalitySubjectMapper.java

@@ -5,14 +5,21 @@ import com.iamberry.wechat.core.entity.personality.*;
 import java.util.List;
 
 public interface PersonalitySubjectMapper {
-	//查询题目
+	//查询所有题目
 	public List<PersonalitySubject> listSubject();
 	//查询答案
 	public List<PersonalityAnswer> getAnswer(Integer subjectId);
 	//查询题目类型
-	public List<PersonalityType> getType(Integer typeId);
+	public List<PersonalityType> getType();
 	//查询推荐内容
-	public PersonalityRecommended getRecommended(PersonalityRecommended personalityRecommended);
+	public PersonalityRecommended getRecommended(Integer recommendedTypeId);
 	//查询推荐书籍
 	public List<PersonalityBooks> getBooks(Integer booksRecommendedId);
+	//查询单个题目
+	public PersonalitySubject getSubject(Integer subjectId);
+	//查询结果
+	public PersonalityResults getResults(String resultsOpenid);
+	//添加结果
+	public Integer addResults(PersonalityResults personalityResults);
+
 }

+ 2 - 1
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/homeMemberMapper.xml

@@ -8,7 +8,8 @@
 		SELECT
 			USER_ID userId,
 			USER_OPENID userOpenid, 
-			USER_IS_FLAG userIsFlag, 
+			user_nickname userNickname,
+			USER_IS_FLAG userIsFlag,
 			USER_DEALERS userDealers,
 			USER_STATUS userStatus,
 			USER_RES_TYPE userResType,

+ 5 - 45
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/memberMapper.xml

@@ -25,22 +25,17 @@
 		user_status userStatus,
 		user_surplus_integral userSurplusIntegral,
 		user_sub_date userSubDate,
-		user_stay_integral userStayIntegral,
 		user_use_integral userUseIntegral,
 		user_income userIncome,
 		user_template_id templateId,
 		user_dealers userDealers,
-		user_is_bought userIsBought,
-
-		user_email userEmail,
-		user_qrcode_type userQrcodeType,
-		user_age_stage userAgeStage
+		user_is_bought userIsBought
 	</sql>
 	<!-- 获取个人信息-->
 	<select id="getMyMemberInfo"  parameterType="String" resultType="Member" >
 		SELECT
 			user_head,user_nickname,user_sex,user_name,user_birth_date,user_tel,user_age_stage,user_identity,
-			user_integral,user_stay_integral,user_use_integral,user_surplus_integral
+			user_integral,user_use_integral,user_surplus_integral
 		FROM TB_IAMBERRY_USER_USERINFO
 		WHERE user_openid = #{userOpenid}
 	</select>
@@ -145,15 +140,9 @@
 			<if test="userIsFlag!=null">
 				user_is_flag = #{userIsFlag},
 			</if>
-			<if test="userEmail!=null">
-				user_email = #{userEmail},
-			</if>
 			<if test="userQrcodeType != null">
 				user_qrcode_type = #{userQrcodeType}
 			</if>
-			<if test="userStayIntegral != null">
-				user_stay_integral = #{userStayIntegral}
-			</if>
 			<if test="userAgeStage != null">
 				user_age_stage = #{userAgeStage}
 			</if>
@@ -233,22 +222,7 @@
 				user_dealers = #{userDealers},
 			</if >
 			<if test="userIsBought != null ">
-				user_is_bought = #{userIsBought},
-			</if >
-			<if test="userEmail != null and userEmail != ''">
-				user_email = #{userEmail},
-			</if >
-			<if test="userQrcodeType != null ">
-				user_qrcode_type = #{userQrcodeType},
-			</if >
-			<if test="userAgeStage != null ">
-				user_age_stage = #{userAgeStage},
-			</if >
-			<if test="userStayIntegral != null ">
-				user_stay_integral = #{userStayIntegral},
-			</if >
-			<if test="userIsAc != null ">
-				user_is_ac = #{userIsAc}
+				user_is_bought = #{userIsBought}
 			</if >
 		</set >
 		where user_id= #{userId}
@@ -329,23 +303,9 @@
 				user_dealers = #{userDealers},
 			</if >
 			<if test="userIsBought != null ">
-				user_is_bought = #{userIsBought},
-			</if >
-			<if test="userEmail != null and userEmail != ''">
-				user_email = #{userEmail},
-			</if >
-			<if test="userQrcodeType != null ">
-				user_qrcode_type = #{userQrcodeType},
-			</if >
-			<if test="userAgeStage != null ">
-				user_age_stage = #{userAgeStage},
-			</if >
-			<if test="userStayIntegral != null ">
-				user_stay_integral = #{userStayIntegral},
-			</if >
-			<if test="userIsAc != null ">
-				user_is_ac = #{userIsAc}
+				user_is_bought = #{userIsBought}
 			</if >
+
 		</set >
 		where user_openid = #{userOpenid}
 	</update>

+ 12 - 5
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/mapper/personalitySubjectMapper.xml

@@ -21,18 +21,25 @@
 		SELECT * FROM tb_personality_answer where answer_subject_id = #{subjectId}
 	</select>
 
-	<select id="getType" parameterType="Integer" resultType="PersonalityType">
-		SELECT * FROM tb_personality_type where type_id = #{typeId}
+	<select id="getType"  resultType="PersonalityType">
+		SELECT * FROM tb_personality_type
 	</select>
 
-	<select id="getRecommended" parameterType="PersonalityRecommended" resultType="PersonalityRecommended">
+	<select id="getRecommended" parameterType="Integer" resultType="PersonalityRecommended">
 		SELECT * FROM tb_personality_recommended where
 		recommended_type_id = #{recommendedTypeId}
-		AND recommended_is_highlow = #{recommendedIsHighlow}
 	</select>
 
 	<select id="getBooks" parameterType="Integer" resultType="PersonalityBooks">
 		SELECT * FROM tb_personality_books where books_recommended_id = #{booksRecommendedId}
 	</select>
-
+	<select id="getSubject" parameterType="Integer" resultType="PersonalitySubject">
+		SELECT * FROM tb_personality_subject where subject_id = #{subjectId}
+	</select>
+	<select id="getResults" parameterType="String" resultType="PersonalityResults">
+		SELECT * FROM tb_personality_results where results_openid = #{resultsOpenid}
+	</select>
+	<insert id="addResults" parameterType="PersonalityResults">
+		INSERT into tb_personality_results(results_openid,results_url,results_create_time) VALUES (#{resultsOpenid},#{resultsUrl},NOW())
+	</insert>
 </mapper>

+ 29 - 18
wechat-wechat-service/src/main/java/com/iamberry/wechat/service/wechat/ConfigServiceImpl.java

@@ -1,8 +1,10 @@
 package com.iamberry.wechat.service.wechat;
 
+import java.io.IOException;
 import java.sql.SQLException;
 import java.util.Date;
 
+import com.iamberry.app.tool.util.HttpUtility;
 import net.sf.json.JSONObject;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,9 +21,10 @@ import com.iamberry.wechat.tools.WeixinUtil;
 
 @Service
 public class ConfigServiceImpl implements ConfigService {
-	
+
 	@Autowired
 	private ConfigDAO configDAO;
+
 	public void setConfigDAO(ConfigDAO configDAO) {
 		this.configDAO = configDAO;
 	}
@@ -38,38 +41,40 @@ public class ConfigServiceImpl implements ConfigService {
 
 	/**
 	 * jsapi_ticket使用权限签名算法
+	 *
 	 * @param appid
 	 * @param url
 	 * @return
 	 * @throws SQLException
 	 */
-	public JSONObject selectConfig(String appid,String url){
+	public JSONObject selectConfig(String appid, String url) {
 		try {
 			// 数据库获取微信配置,并获取ticket
 			Config cfg = configDAO.getConfig(appid);
-			if(cfg == null) {
+			if (cfg == null) {
 				return null;
 			}
-			
+
 			// 准备数据
 			String nonceStr = SignUtil.getNonceStr(),
-				  timestamp = SignUtil.getTimeStamp(),
-					 ticket = cfg.getTicket(), 
-				  appsecret = cfg.getAppsecret();
-			
+					timestamp = SignUtil.getTimeStamp(),
+					ticket = cfg.getTicket(),
+					appsecret = cfg.getAppsecret();
+
 			// 判断ticket是否失效,如果失效自动获取 ;如果 (当前时间 - config的创建时间) / 1000 = 剩余超时的秒
-			if(ticket == null || (new Date().getTime() - cfg.getCreateTime()) / 1000 >= 7000){
+			if (ticket == null || (new Date().getTime() - cfg.getCreateTime()) / 1000 >= 7000) {
 				//获取access_token, 已经兼容缓存
-				String token = WeixinUtil.getAccessToken(appid, appsecret).getToken();
-				
+				/*String token = WeixinUtil.getAccessToken(appid, appsecret).getToken();*/
+				String token = HttpUtility.httpsGet(NameUtils.accessToken_url);
+
 				//access_token换取jsapi_ticket
-				if(token == null) {
+				if (token == null) {
 					return null;
 				}
-				
+
 				// 获取ticket
 				ticket = WeixinUtil.getTicket(token).getTicket();
-				if(ticket == null) {
+				if (ticket == null) {
 					return null;
 				}
 				//更新ticket
@@ -77,13 +82,13 @@ public class ConfigServiceImpl implements ConfigService {
 				cfg.setCreateTime(new Date().getTime());
 				configDAO.updateConfig(cfg);
 			}
-			
+
 			//字典排序的签名参数
 			String string1 = "jsapi_ticket=%s&noncestr=%s&timestamp=%s&url=%s";
 			string1 = String.format(string1, ticket, nonceStr, timestamp, url);
 			//对string1进行sha1签名,得到signature
 			String signature = Sha1Util.getSha1(string1).toLowerCase();
-			
+
 			//最后组装json数据
 			ConfigJSSDK config = new ConfigJSSDK();
 			config.setAppId(appid);
@@ -101,7 +106,7 @@ public class ConfigServiceImpl implements ConfigService {
 				share.setShareNum(0);
 				configDAO.updateWechatShareByHash(share);		// 更新一次数据
 			}*/
-			
+
 			return JSONObject.fromObject(config);
 		} catch (Exception e) {
 			e.printStackTrace();
@@ -112,6 +117,12 @@ public class ConfigServiceImpl implements ConfigService {
 	@Override
 	public String getAccessToken() {
 		// TODO Auto-generated method stub
-		return WeixinUtil.getAccessToken(NameUtils.getConfig("appId"), NameUtils.getConfig("appSecret")).getToken();
+		String token = null;
+		try {
+			token = HttpUtility.httpsGet(NameUtils.accessToken_url);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		return token;
 	}
 }

+ 1 - 1
wechat-wechat-web/src/main/java/com/iamberry/wechat/filters/CSRFTokenFilter.java

@@ -30,7 +30,7 @@ import com.iamberry.wechat.tools.IpAddressUtil;
  * 			使用注意:如果多次重复启动,可能导致系统拒绝服务,这只是因为tomcat默认最多接受200个cookie的缘故,关闭浏览器重新打开即可。
  * 			另外系统本身已经做了优化处理,保证99%情况下不会出现问题。
  */
-/*@WebFilter(value = {"/admin/*", "/loginUI"})*/
+@WebFilter(value = {"/admin/*", "/loginUI"})
 public class CSRFTokenFilter implements Filter {
 
 	/**

+ 2 - 2
wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/home/HomeHandler.java

@@ -30,7 +30,7 @@ public class HomeHandler {
      * 刷新用户信息
      */
     @ResponseBody
-    @RequestMapping(value = "/getUserInfo", method = RequestMethod.POST)
+    @RequestMapping(value = "/getUserInfo", method = RequestMethod.GET)
     public ResultMsg getUserInfo(HttpServletRequest request) throws Exception {
         Member m = memberService.getMemberByUserOpenId(WechatUtils.getUserBySession(request).getUserOpenid());
         try{
@@ -57,7 +57,7 @@ public class HomeHandler {
                 }
                 memberService.nowUpdateUserByOpenId(mem);
             }
-//				logger.info("获取个人信息成功;openid:"+m.getUserOpenid());
+				logger.info("获取个人信息成功;openid:"+m.getUserOpenid());
         }catch (Exception e){
             logger.error("获取个人信息失败:{}", e);
         }

+ 17 - 1
wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/pay/WechatBackHandler.java

@@ -49,7 +49,7 @@ public class WechatBackHandler {
 			HttpServletRequest request,
 			HttpServletResponse response) throws Exception {
 
-		logger.info("微信回调");
+		logger.info("微信回调---");
 
 		String callbackURL = NameUtils.getConfig("redirectUrl_index");
 		if (callback != null) {
@@ -71,6 +71,10 @@ public class WechatBackHandler {
 			mv.setViewName("redirect:" + WechatUtils.getOpenIdFunction(null));
 			return mv;
 		}
+		String openId2 = str[0];
+		String accessToken2 = str[1];
+		String[] userInfo = WeixinUtil.getUserInfo(openId2, accessToken2);//获取用户信息
+		logger.info("userInfo---"+userInfo+userInfo[0]);
 		Member info = homeService.selectMemberInfoByOpenId(openId);
 		if (info == null) {
 			// 创建新的用户
@@ -78,10 +82,22 @@ public class WechatBackHandler {
 			info.setUserOpenid(openId);
 			info.setUserSex(0);
 			info.setUserStatus(1);
+			info.setUserNickname(userInfo[0]);
 			int flag = homeService.insertMemberInfo(info);
 			if (flag < 1) {
 				homeService.insertMemberInfo(info);
 			}
+		}else{
+			// 创建新的用户
+			Member member = new Member();
+			member.setUserOpenid(openId);
+			member.setUserSex(0);
+			member.setUserStatus(1);
+			member.setUserNickname(userInfo[0]);
+			int flag = homeService.updateWechatMemberInfoByByOpenid(member);
+			if (flag < 1) {
+				homeService.updateWechatMemberInfoByByOpenid(member);
+			}
 		}
 		info.setUserOpenid(openId);
 		// 提前获取session中的地址

+ 183 - 13
wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/personality/personalityHandler.java

@@ -1,31 +1,44 @@
 package com.iamberry.wechat.handles.personality;
 
+import com.google.gson.Gson;
 import com.iamberry.wechat.core.entity.ResultMsg;
+import com.iamberry.wechat.core.entity.WechatUtils;
 import com.iamberry.wechat.core.entity.member.Member;
-import com.iamberry.wechat.core.entity.personality.PersonalityAnswer;
-import com.iamberry.wechat.core.entity.personality.PersonalityBooks;
-import com.iamberry.wechat.core.entity.personality.PersonalityRecommended;
-import com.iamberry.wechat.core.entity.personality.PersonalitySubject;
+import com.iamberry.wechat.core.entity.personality.*;
 import com.iamberry.wechat.face.Personality.PersonalitySubjectService;
+import com.iamberry.wechat.face.home.HomeService;
 import com.iamberry.wechat.face.member.MemberService;
 import com.iamberry.wechat.tools.ResultInfo;
+import com.iamberry.wechat.tools.WeixinUtil;
+import com.iamberry.wechat.utils.ImageUtil;
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
+import java.awt.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Array;
+import java.net.URLEncoder;
 import java.util.List;
-import java.util.Map;
+import java.util.Map.Entry;
+import java.util.*;
 
 @Controller
 @RequestMapping("/wechat/personality")
-public class personalityHandler {
+public class personalityHandler {	// 日志
+    private  static org.slf4j.Logger logger = LoggerFactory.getLogger(WeixinUtil.class);
 
     @Autowired
     private PersonalitySubjectService personalitySubjectService;
-
+    @Autowired
+    private HomeService homeService;
     @Autowired
     private MemberService memberService;
     /**
@@ -34,7 +47,7 @@ public class personalityHandler {
      */
     @ResponseBody
     @RequestMapping(value = "/listSubject")
-    public ResultMsg checkOrderPaySuccess(HttpServletRequest request) {
+    public ResultMsg listSubject(HttpServletRequest request) {
         ResultMsg msg = new ResultMsg();
         /*Member member = WechatUtils.getUserBySession(request);*/
         List<PersonalitySubject> listPersonalitySubject = personalitySubjectService.listSubject();
@@ -46,6 +59,23 @@ public class personalityHandler {
         return msg;
     }
     /**
+     * 获取题目答案
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getAnswer")
+    public ResultMsg getAnswer(HttpServletRequest request,String subjectId) {
+        ResultMsg msg = new ResultMsg();
+        /*Member member = WechatUtils.getUserBySession(request);*/
+        List<PersonalityAnswer> listAnswer = personalitySubjectService.getAnswer(Integer.valueOf(subjectId));
+        Map<String,Object> map = new HashMap<String,Object>();
+        map.put("listAnswer", listAnswer);
+        msg.setResultCode(ResultInfo.SUCCESSCODE);
+        msg.setStatus(true);
+        msg.setData(map);
+        return msg;
+    }
+    /**
      * 获取推荐内容
      * @return
      */
@@ -53,10 +83,8 @@ public class personalityHandler {
     @RequestMapping(value = "/getRecommended")
     public ResultMsg getPersonalityRecommended(HttpServletRequest request,PersonalityRecommended personalityRecommended) {
         ResultMsg msg = new ResultMsg();
-        /*Member member = WechatUtils.getUserBySession(request);*/
-        PersonalityRecommended recommended = personalitySubjectService.getRecommended(personalityRecommended);
-        List<PersonalityBooks> listBooks = personalitySubjectService.getBooks(recommended.getRecommendedId());
-        recommended.setListPersonalityBooks(listBooks);
+        PersonalityRecommended recommended = personalitySubjectService.getRecommended(personalityRecommended.getRecommendedTypeId());
+
         Map<String,Object> map = new HashMap<String,Object>();
         map.put("recommended", recommended);
         msg.setResultCode(ResultInfo.SUCCESSCODE);
@@ -64,4 +92,146 @@ public class personalityHandler {
         msg.setData(map);
         return msg;
     }
+    /**
+     * 计算测试结果
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/calculationResults")
+    public ResultMsg calculationResults(HttpServletRequest request,String answers) throws IOException {
+        ResultMsg msg = new ResultMsg();
+        JSONObject jsonObject = null;
+        String nickname =  null;
+        String headimgurl = null;
+        Member member = WechatUtils.getUserBySession(request);
+        Member info = homeService.selectMemberInfoByOpenId(member.getUserOpenid());
+        if(info == null || info.getUserNickname().equals("")){
+            jsonObject = WeixinUtil.getUserInfo(member.getUserOpenid());
+            logger.error("jsonObject22"+jsonObject);
+            assert jsonObject != null;
+            assert jsonObject.has("nickname");
+            nickname = jsonObject.getString("nickname");
+            headimgurl = jsonObject.getString("headimgurl");
+        }else{
+            nickname = info.getUserNickname();
+        }
+
+        try {
+                String s = new String(Base64.getEncoder().encode(nickname.getBytes()), "UTF-8");
+                new String(Base64.getDecoder().decode(s));
+        } catch (UnsupportedEncodingException e) {
+            nickname = "";
+        }
+
+        Member mem = new Member();
+        mem.setUserHead(headimgurl);
+        mem.setUserNickname(nickname);
+        mem.setUserOpenid(member.getUserOpenid());
+
+        Gson gson = new Gson();
+        Map<String, Object> map = new HashMap<String, Object>();
+        map = gson.fromJson(answers, map.getClass());
+
+        //查询所有类型
+        List<PersonalityType> listType = personalitySubjectService.getType();
+        HashMap<Integer,Integer> answerScoremap = new HashMap<Integer,Integer>();
+        for(PersonalityType personalityType : listType){
+            answerScoremap.put(personalityType.getTypeId(),0);
+        }
+        for(int i = 0; i< map.size(); i++ ){
+            String answerScore = (String)map.get(i+1+"");
+            //查询所属类型
+            PersonalitySubject subject = personalitySubjectService.getSubject(i+1);
+            //计算各个类型所得分数
+            answerScoremap.put(subject.getSubjectType(),answerScoremap.get(subject.getSubjectType()) + Integer.valueOf(answerScore));
+        }
+        //用中间值减去得分
+        for(int i= 0;i<answerScoremap.size();i++){
+            Integer typeScore = listType.get(i).getTypeScore();
+            answerScoremap.put(i+1,typeScore - answerScoremap.get(i+1));
+        }
+
+        //计算最低分
+        Object minKey = getMapMinOrMaxValueKey(answerScoremap, "max");
+        PersonalityRecommended minRecommended = personalitySubjectService.getRecommended((Integer)minKey);
+        //计算最高分
+        Object maxKey = getMapMinOrMaxValueKey(answerScoremap, "min");
+        PersonalityRecommended maxRecommended = personalitySubjectService.getRecommended((Integer)maxKey);
+
+        String filePath = request.getServletContext().getRealPath("/common/images");
+        File dir = new File(filePath + File.separator + "send");
+        if (!dir.exists()) {
+            dir.mkdir();
+        }
+
+        //图片添加昵称
+        Font font = new Font("04b_08", Font.BOLD, 25);//字体
+        String watermark= nickname + ":";//水印内容
+        Color color=new Color(0,0,0,150);
+
+        String sourceImg=filePath +minRecommended.getRecommendedLowUrl(); //源图片地址
+        String targetImg=dir.getAbsolutePath() + File.separator+member.getUserOpenid()+"1.png".replaceAll("\\\\", "/"); //新存储的地址
+        ImageUtil.addWatermark(sourceImg, targetImg,watermark, color,font);
+
+        String sourceImg2=filePath +maxRecommended.getRecommendedHighUrl(); //源图片地址
+        String targetImg2=dir.getAbsolutePath() + File.separator+member.getUserOpenid()+"2.png".replaceAll("\\\\", "/"); //新存储的地址
+        ImageUtil.addWatermark(sourceImg2, targetImg2,watermark, color,font);
+
+        String[] files1 = new String[2];
+        files1[0] = (filePath + File.separator+"send"+File.separator+member.getUserOpenid()+"2.png").replaceAll("\\\\", "/");
+        files1[1] = (filePath + File.separator+"db2.png").replaceAll("\\\\", "/");
+        ImageUtil.mergeImage(files1,2,dir.getAbsolutePath() + File.separator+member.getUserOpenid()+"db.png");
+
+
+        String[] files = new String[2];
+        files[0] = (filePath + File.separator+"send"+File.separator+member.getUserOpenid()+"1.png").replaceAll("\\\\", "/");
+        files[1] = (filePath + File.separator+"send"+File.separator+member.getUserOpenid()+"db.png").replaceAll("\\\\", "/");
+        ImageUtil.mergeImage(files,2,dir.getAbsolutePath() + File.separator+member.getUserOpenid()+".png");
+
+        //获取生成后的图片地址
+        String url = ("https://w.iamberry.com/wechat_rg/common/images/send/"+member.getUserOpenid()+".png");
+
+        //添加测试结果
+        PersonalityResults personalityResults = new PersonalityResults();
+        personalityResults.setResultsOpenid(member.getUserOpenid());
+        personalityResults.setResultsUrl(url);
+        personalitySubjectService.addResults(personalityResults);
+
+        Map<String,Object> map2 = new HashMap<String,Object>();
+        map2.put("url", url);
+        msg.setResultCode(ResultInfo.SUCCESSCODE);
+        msg.setStatus(true);
+        msg.setData(map2);
+        return msg;
+    }
+
+    public static Object getMapMinOrMaxValueKey(Map<Integer, Integer> map, String choose) {
+        List<Entry<Integer,Integer>> list = new ArrayList(map.entrySet());
+        Collections.sort(list, (o1, o2) -> (o1.getValue().intValue() - o2.getValue().intValue()));
+        Object key = null;
+        if (choose.equals("min")) {
+            key = list.get(0).getKey();
+        } else if (choose.equals("max")) {
+            key = list.get(list.size() - 1).getKey();
+        }
+        return key;
+    }
+
+    /**
+     * 判断是否已存在测试结果
+     * @return
+     */
+    @ResponseBody
+    @RequestMapping(value = "/getResults")
+    public ResultMsg getResults(HttpServletRequest request) {
+        ResultMsg msg = new ResultMsg();
+        Member member = WechatUtils.getUserBySession(request);
+        PersonalityResults personalityResults = personalitySubjectService.getResults(member.getUserOpenid());
+        Map<String,Object> map = new HashMap<String,Object>();
+        map.put("personalityResults", personalityResults);
+        msg.setResultCode(ResultInfo.SUCCESSCODE);
+        msg.setStatus(true);
+        msg.setData(map);
+        return msg;
+    }
 }

+ 2 - 2
wechat-wechat-web/src/main/java/com/iamberry/wechat/handles/wechat/menu/MenuInfoHandler.java

@@ -70,7 +70,7 @@ public class MenuInfoHandler {
 	@RequestMapping("/createmenu")
 	public ModelAndView createMenu(HttpServletRequest request){
 		ModelAndView mv = new ModelAndView();
-		int result = -1;
+		/*int result = -1;
 		AccessToken accessToken = WeixinUtil.getAccessToken(NameUtils.getConfig("appId"), NameUtils.getConfig("appSecret"));
 		if(accessToken != null){
 			String jsondata = request.getParameter("jsondata").replaceAll("},]", "}]");
@@ -86,7 +86,7 @@ public class MenuInfoHandler {
 				mv.addObject("treedata", request.getParameter("treedata"));
 				mv.setViewName("admin/wx/menu/wxtree");
 			}
-		}
+		}*/
 		return mv;
 	}
 	

+ 340 - 0
wechat-wechat-web/src/main/java/com/iamberry/wechat/utils/ImageUtil.java

@@ -0,0 +1,340 @@
+package com.iamberry.wechat.utils;
+
+
+
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.util.Iterator;
+
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReadParam;
+import javax.imageio.ImageReader;
+import javax.imageio.stream.ImageInputStream;
+import javax.swing.*;
+
+
+import java.awt.Image;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @Description:图片处理工具
+ * @author:liuyc
+ * @time:2016年5月27日 上午10:18:00
+ */
+public class ImageUtil {
+
+    /**
+     * @param srcFile源图片、targetFile截好后图片全名、startAcross 开始截取位置横坐标、StartEndlong开始截图位置纵坐标、width截取的长,hight截取的高
+     * @Description:截图
+     * @author:liuyc
+     * @time:2016年5月27日 上午10:18:23
+     */
+    public static void cutImage(String srcFile, String targetFile, int startAcross, int StartEndlong, int width,
+                                int hight) throws Exception {
+        // 取得图片读入器
+        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpg");
+        ImageReader reader = readers.next();
+        // 取得图片读入流
+        InputStream source = new FileInputStream(srcFile);
+        ImageInputStream iis = ImageIO.createImageInputStream(source);
+        reader.setInput(iis, true);
+        // 图片参数对象
+        ImageReadParam param = reader.getDefaultReadParam();
+        Rectangle rect = new Rectangle(startAcross, StartEndlong, width, hight);
+        param.setSourceRegion(rect);
+        BufferedImage bi = reader.read(0, param);
+        ImageIO.write(bi, targetFile.split("\\.")[1], new File(targetFile));
+    }
+
+    /**
+     * @param files 要拼接的文件列表
+     * @param type1 横向拼接, 2 纵向拼接
+     * @Description:图片拼接 (注意:必须两张图片长宽一致哦)
+     * @author:liuyc
+     * @time:2016年5月27日 下午5:52:24
+     */
+    public static void mergeImage(String[] files, int type, String targetFile) {
+        int len = files.length;
+        if (len < 1) {
+            throw new RuntimeException("图片数量小于1");
+        }
+        File[] src = new File[len];
+        BufferedImage[] images = new BufferedImage[len];
+        int[][] ImageArrays = new int[len][];
+        for (int i = 0; i < len; i++) {
+            try {
+                src[i] = new File(files[i]);
+                images[i] = ImageIO.read(src[i]);
+            } catch (Exception e) {
+                throw new RuntimeException(e);
+            }
+            int width = images[i].getWidth();
+            int height = images[i].getHeight();
+            ImageArrays[i] = new int[width * height];
+            ImageArrays[i] = images[i].getRGB(0, 0, width, height, ImageArrays[i], 0, width);
+        }
+        int newHeight = 0;
+        int newWidth = 0;
+        for (int i = 0; i < images.length; i++) {
+            // 横向
+            if (type == 1) {
+                newHeight = newHeight > images[i].getHeight() ? newHeight : images[i].getHeight();
+                newWidth += images[i].getWidth();
+            } else if (type == 2) {// 纵向
+                newWidth = newWidth > images[i].getWidth() ? newWidth : images[i].getWidth();
+                newHeight += images[i].getHeight();
+            }
+        }
+        if (type == 1 && newWidth < 1) {
+            return;
+        }
+        if (type == 2 && newHeight < 1) {
+            return;
+        }
+
+        // 生成新图片
+        try {
+            BufferedImage ImageNew = new BufferedImage(newWidth, newHeight, BufferedImage.SCALE_FAST);
+            int height_i = 0;
+            int width_i = 0;
+            for (int i = 0; i < images.length; i++) {
+                if (type == 1) {
+                    ImageNew.setRGB(width_i, 0, images[i].getWidth(), newHeight, ImageArrays[i], 0,
+                            images[i].getWidth());
+                    width_i += images[i].getWidth();
+                } else if (type == 2) {
+                    ImageNew.setRGB(0, height_i, newWidth, images[i].getHeight(), ImageArrays[i], 0, newWidth);
+                    height_i += images[i].getHeight();
+                }
+            }
+            //输出想要的图片
+            targetFile.replaceAll("\\\\", "/");
+
+            ImageIO.write(ImageNew, "png", new File(targetFile));
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * @Description:小图片贴到大图片形成一张图(合成)
+     * @author:liuyc
+     * @time:2016年5月27日 下午5:51:20
+     */
+    public static final void overlapImage(String bigPath, String smallPath, String outFile) {
+        try {
+            BufferedImage big = ImageIO.read(new File(bigPath));
+            BufferedImage small = ImageIO.read(new File(smallPath));
+            Graphics2D g = big.createGraphics();
+            int x = (big.getWidth() - small.getWidth()) / 2;
+            int y = (big.getHeight() - small.getHeight()) / 2;
+            g.drawImage(small, x, y, small.getWidth(), small.getHeight(), null);
+            g.dispose();
+            ImageIO.write(big, outFile.split("\\.")[1], new File(outFile));
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+   /* public static void main(String[] args) throws IOException {
+        Font font = new Font("04b_08", Font.PLAIN, 30);//字体
+        *//*String sourceImg="D:\\test\\123.jpg"; //源图片地址
+        String targetImg="D:\\test\\watermark\\123.jpg"; //新存储的地址
+        String watermark="图片出处:www.baidu.com";//水印内容
+        String watermarkUrl="D:\\test\\zy.png";*//*
+        String sourceImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx-2.png"; //源图片地址
+        String targetImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx1.png"; //新存储的地址
+        String watermark="柳康健";//水印内容
+        String watermarkUrl="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx2.png";
+        Color color=new Color(0);
+        addWatermark(sourceImg, targetImg,watermark, color,font);
+        markImgMark(watermarkUrl,sourceImg,targetImg);
+    }*/
+
+
+
+    /**
+     * 为图片添加图片水印
+     * @param watermarkUrl 原图
+     * @param source 水印图片
+     * @param output 制作完成的图片
+     * @return
+     * @throws IOException
+     */
+    public static String markImgMark(String watermarkUrl, String source, String output) throws IOException {
+        String result = "添加图片水印出错";
+        File file = new File(source);
+        Image img = ImageIO.read(file);
+        int width = img.getWidth(null);//水印宽度
+        int height = img.getHeight(null);//水印高
+        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = bi.createGraphics();
+        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+        g.drawImage(img.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
+        ImageIcon imgIcon = new ImageIcon(watermarkUrl);
+        Image con = imgIcon.getImage();
+        float clarity = 0.6f;//透明度
+        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, clarity));
+        g.drawImage(con, 10, 10, null);//水印的位置
+        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
+        g.dispose();
+        File sf = new File(output);
+        ImageIO.write(bi, "jpg", sf); // 保存图片
+        System.out.println("添加图片水印成功");
+        return result;
+    }
+
+    /** 设置文字水印
+     * @param sourceImg 源图片路径
+     * @param targetImg 保存的图片路径
+     * @param watermark 水印内容
+     * @param color 水印颜色
+     * @param font 水印字体
+     * @throws IOException
+     */
+    public static void addWatermark(String sourceImg, String targetImg, String watermark,Color color,Font font) throws IOException {
+
+        File srcImgFile = new File(sourceImg);
+        Image srcImg = ImageIO.read(srcImgFile);
+        int srcImgWidth = srcImg.getWidth(null);
+        int srcImgHeight = srcImg.getHeight(null);
+        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.SCALE_FAST);
+        Graphics2D g = bufImg.createGraphics();
+        g.drawImage(srcImg, 0, 0, null);
+        g.setColor(color);
+        g.setFont(font);
+        g.setBackground(Color.WHITE);
+        //设置水印的坐标
+        /*int x = srcImgWidth - (g.getFontMetrics(g.getFont()).charsWidth(watermark.toCharArray(), 0, watermark.length())+20);
+        int y = srcImgHeight - 25;*/
+        int x = 80;
+        int y = 110;
+        //处理昵称位置
+        switch (watermark.length()){
+            case 1:
+                x += 130;
+                break;
+            case 2:
+                x += 150;
+                break;
+            case 3:
+                x += 140;
+                break;
+            case 4:
+                x += 130;
+                break;
+            case 5:
+                x += 120;
+                break;
+            case 6:
+                x += 110;
+                break;
+            case 7:
+                x += 90;
+                break;
+            case 8:
+                x += 80;
+                break;
+            case 9:
+                x += 70;
+                break;
+            case 10:
+                x += 60;
+                break;
+            case 11:
+                x += 50;
+                break;
+            case 12:
+                x += 35;
+                break;
+            case 13:
+                x += 25;
+                break;
+            case 14:
+                x += 15;
+                break;
+            default:
+                break;
+        }
+        g.drawString(watermark, x, y);  //加水印
+        g.dispose();
+        // 输出图片
+        FileOutputStream outImgStream = new FileOutputStream(targetImg);
+        ImageIO.write(bufImg, "png", outImgStream);
+        System.out.println("添加水印完成");
+        outImgStream.flush();
+        outImgStream.close();
+    }
+
+
+    public static void yPic(){//纵向处理图片
+        try {
+            /* 1 读取第一张图片*/
+            File fileOne = new File("F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/send/o3G6nw7DSmcQwSy3LtNhEcPYMqRI2.png");
+            BufferedImage imageFirst = ImageIO.read(fileOne);
+            int width = imageFirst.getWidth();// 图片宽度
+            int height = imageFirst.getHeight();// 图片高度
+            int[] imageArrayFirst = new int[width * height];// 从图片中读取RGB
+            imageArrayFirst = imageFirst.getRGB(0, 0, width, height, imageArrayFirst, 0, width);
+
+            /* 1 对第二张图片做相同的处理 */
+            File fileTwo = new File("F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/db2.png");
+            BufferedImage imageSecond = ImageIO.read(fileTwo);
+            int width2 = imageSecond.getWidth();// 图片宽度
+            int height2 = imageSecond.getHeight();// 图片高度
+
+            int[] imageArraySecond = new int[width * height];
+            imageArraySecond = imageSecond.getRGB(0, 0, width2, height2, imageArraySecond, 0, width2);
+
+            // 生成新图片
+            BufferedImage imageResult = new BufferedImage(width, height + height2,BufferedImage.SCALE_FAST);
+            imageResult.setRGB(0, 0, width, height, imageArrayFirst, 0, width);// 设置左半部分的RGB
+            imageResult.setRGB(0, height, width, height2, imageArraySecond, 0, width);// 设置右半部分的RGB
+            File outFile = new File("F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/send/o3G6nw7DSmcQwSy3LtNhEcPYMqRI211.png");
+            ImageIO.write(imageResult, "jpg", outFile);// 写图片
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+
+
+
+
+
+
+
+    public static void main(String[] args) throws Exception {
+        /*Font font = new Font("04b_08", Font.PLAIN, 25);//字体
+        String sourceImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx-2.png"; //源图片地址
+        String targetImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx.png"; //新存储的地址
+        String watermark="柳康健";//水印内容
+        Color color=new Color(0,0,0,150);
+        addWatermark(sourceImg, targetImg,watermark, color,font);
+        *//*markImgMark(watermarkUrl,sourceImg,targetImg);*//*
+        String[] files = new String[2];
+        files[0] = "C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx-2.png";
+        files[1] = "C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx-1.png";
+        mergeImage(files,2,"C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx.png"); */
+        Font font = new Font("04b_08", Font.BOLD, 22);//字体
+        String sourceImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx-1.png"; //源图片地址
+        String targetImg="C:/Users/Administrator/Desktop/人格测试/0309测试题,结果图/0309测试题,结果图/kfx.png"; //新存储的地址
+        String watermark="柳康健健健健健健健健健健:";//水印内容
+        Color color=new Color(0,0,0,150);
+        /*addWatermark(sourceImg, targetImg,watermark, color,font);*/
+        /*markImgMark(watermarkUrl,sourceImg,targetImg);*/
+        String[] files = new String[2];
+        files[0] = "F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/send/o3G6nw7DSmcQwSy3LtNhEcPYMqRI2.png";
+        files[1] = "F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/db2.png";
+        /*mergeImage(files,2,"F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/send/o3G6nw7DSmcQwSy3LtNhEcPYMqRI211.png");*/
+        /*mergeImage(files,2,"F:/wechatN/wechat-wechat-web/target/wechat-wechat-web-1.0.0/WEB-INF/common/images/send/1.png");*/
+        /*yPic();*/
+       //zipImageFile("C:/Users/Administrator/Desktop/人格测试/0312测试结果图/0312测试结果图/JG.png", 750, 1942, 1f, "x2");
+       //saveMinPhoto("C:/Users/Administrator/Desktop/人格测试/0312测试结果图/0312测试结果图/JG.png", "C:/Users/Administrator/Desktop/人格测试/0312测试结果图/0312测试结果图/JG2.png", 139, 0.9d);
+    }
+
+}

+ 3 - 3
wechat-wechat-web/src/main/resources/log4j.properties

@@ -6,11 +6,11 @@ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.Target=System.out
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m %n
-log4j.appender.stdout.File=D:/log/tooth/iamberry_wechat_out.log
+log4j.appender.stdout.File=E:/log/wechat_rg/iamberry_wechat_out.log
 
 #\u4e3b\u65e5\u5fd7\u6587\u4ef6
 log4j.appender.infoLog=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.infoLog.File=D:/log/tooth/iamberry_wechat_info.log
+log4j.appender.infoLog.File=E:/log/wechat_rg/iamberry_wechat_info.log
 log4j.appender.infoLog.Append=true
 log4j.appender.infoLog.Threshold=INFO
 log4j.appender.infoLog.layout=org.apache.log4j.PatternLayout
@@ -19,7 +19,7 @@ log4j.appender.infoLog.encoding=UTF-8
 
 #\u9519\u8bef\u65e5\u5fd7
 log4j.appender.errorLog=org.apache.log4j.DailyRollingFileAppender
-log4j.appender.errorLog.File=D:/log/tooth/iamberry_wechat_error.log
+log4j.appender.errorLog.File=E:/log/wechat_rg/iamberry_wechat_error.log
 log4j.appender.errorLog.Append=true
 log4j.appender.errorLog.Threshold=ERROR
 log4j.appender.errorLog.layout=org.apache.log4j.PatternLayout

+ 1 - 0
wechat-wechat-web/src/main/resources/mybatis.xml

@@ -72,6 +72,7 @@
 		<typeAlias type="com.iamberry.wechat.core.entity.personality.PersonalityRecommended" alias="PersonalityRecommended"/>
 		<typeAlias type="com.iamberry.wechat.core.entity.personality.PersonalitySubject" alias="PersonalitySubject"/>
 		<typeAlias type="com.iamberry.wechat.core.entity.personality.PersonalityType" alias="PersonalityType"/>
+		<typeAlias type="com.iamberry.wechat.core.entity.personality.PersonalityResults" alias="PersonalityResults"/>
 
 		<package name="com.iamberry.wechat.core.entity.rent"/>
 	</typeAliases>

BIN
wechat-wechat-web/src/main/webapp/WEB-INF/common/images/kfx-1.png


BIN
wechat-wechat-web/src/main/webapp/WEB-INF/common/images/kfx-2.png


+ 1 - 1
wechat-wechat-web/src/main/webapp/WEB-INF/web.xml

@@ -7,7 +7,7 @@
 	<!-- Session配置 -->
 	<session-config>
 		<cookie-config>
-			<name>IAMBERRY_WECHAT</name>
+			<name>WATERO_WEB_PF</name>
 			<http-only>true</http-only>
 			<max-age>1800</max-age>
 		</cookie-config>