liuam 7 лет назад
Родитель
Сommit
24038df918
16 измененных файлов с 873 добавлено и 87 удалено
  1. 30 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/ResultState.java
  2. 0 1
      src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateMessage.java
  3. 21 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/base/AbstractParams.java
  4. 16 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/base/WeChatConstant.java
  5. 93 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthCodeParams.java
  6. 81 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthTokenParams.java
  7. 69 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthUserParams.java
  8. 62 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/RefreshAuthTokenParams.java
  9. 65 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/req/WechatTemplateMsg.java
  10. 32 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AccessToken.java
  11. 40 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthAccessToken.java
  12. 102 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthUserInfo.java
  13. 22 0
      src/main/java/com/uas/platform/b2c/common/weixin/model/resp/TemplateMsgResult.java
  14. 87 85
      src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java
  15. 142 0
      src/main/java/com/uas/platform/b2c/common/weixin/util/HttpReqUtil.java
  16. 11 1
      src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java

+ 30 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/ResultState.java

@@ -0,0 +1,30 @@
+package com.uas.platform.b2c.common.weixin.model;
+
+/**
+ * 微信API返回状态
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class ResultState {
+	
+	private int errcode; // 状态
+	private String errmsg; //信息
+
+	public int getErrcode() {
+		return errcode;
+	}
+
+	public void setErrcode(int errcode) {
+		this.errcode = errcode;
+	}
+
+	public String getErrmsg() {
+		return errmsg;
+	}
+
+	public void setErrmsg(String errmsg) {
+		this.errmsg = errmsg;
+	}
+}

+ 0 - 1
src/main/java/com/uas/platform/b2c/common/weixin/model/TemplateMessage.java

@@ -1,6 +1,5 @@
 package com.uas.platform.b2c.common.weixin.model;
 
-import java.util.List;
 import java.util.Map;
 
 /**

+ 21 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/base/AbstractParams.java

@@ -0,0 +1,21 @@
+package com.uas.platform.b2c.common.weixin.model.base;
+
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * 基本请求抽象类
+ * @author liuam
+ * @date  2018年6月12日
+ *
+ */
+public abstract class AbstractParams implements Serializable{
+
+    private static final long serialVersionUID = 3375127810872852675L;
+
+    /**
+     * 返回请求参数
+     * @return
+     */
+    public abstract Map<String,String> getParams() throws Exception;
+}

+ 16 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/base/WeChatConstant.java

@@ -0,0 +1,16 @@
+package com.uas.platform.b2c.common.weixin.model.base;
+
+/**
+ * 获取授权code请求参数
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class WeChatConstant {
+
+    public static final String DEFAULT_CHARACTER_ENCODING = "UTF-8";
+    public static final String GET_METHOD = "GET";
+	public static final String POST_METHOD = "POST";
+
+}

+ 93 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthCodeParams.java

@@ -0,0 +1,93 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+import com.uas.platform.b2c.common.weixin.model.base.WeChatConstant;
+import com.uas.platform.b2c.common.weixin.util.HttpReqUtil;
+
+import java.io.UnsupportedEncodingException;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取授权code请求参数
+ * 
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthCodeParams extends AbstractParams {
+	
+	private static final long serialVersionUID = 6313379843885615765L;
+	public static final String SCOPE_SNSAPIBASE = "snsapi_base"; // snsapi_base(不需要弹出授权页面,只能获取openid)
+	public static final String SCOPE_SNSPAIUSERINFO = "snsapi_userinfo"; // 弹出授权页面(获取用户基本信息)
+	private String appid;
+	private String redirect_uri; // 使用urlencode对链接进行处理
+	private String response_type = "code";
+	private String scope;
+	private String state;
+
+	public AuthCodeParams() {
+		super();
+	}
+
+	public AuthCodeParams(String appid, String redirect_uri, String response_type, String scope, String state) {
+		super();
+		this.appid = appid;
+		this.redirect_uri = redirect_uri;
+		this.response_type = response_type;
+		this.scope = scope;
+		this.state = state;
+	}
+
+	/**
+	 * 参数组装
+	 * 
+	 * @return
+	 */
+	public Map<String, String> getParams() throws UnsupportedEncodingException {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("redirect_uri", HttpReqUtil.urlEncode(this.redirect_uri, WeChatConstant.DEFAULT_CHARACTER_ENCODING));
+		params.put("response_type", this.response_type);
+		params.put("scope", this.scope);
+		params.put("state", this.state);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getRedirect_uri() {
+		return redirect_uri;
+	}
+
+	public void setRedirect_uri(String redirect_uri) {
+		this.redirect_uri = redirect_uri;
+	}
+
+	public String getResponse_type() {
+		return response_type;
+	}
+
+	public String getScope() {
+		return scope;
+	}
+
+	public void setScope(String scope) {
+		this.scope = scope;
+	}
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+}

+ 81 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthTokenParams.java

@@ -0,0 +1,81 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取授权请求token的请求参数
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthTokenParams extends AbstractParams {
+	
+	private static final long serialVersionUID = 4652953400751046159L;
+	private String appid; //公众号的唯一标识
+	private String secret; //公众号的appsecret
+	private String code; //填写第一步获取的code参数
+	private String grant_type = "authorization_code";
+
+	public AuthTokenParams() {
+		super();
+	}
+
+	public AuthTokenParams(String appid, String secret, String code, String grant_type) {
+		super();
+		this.appid = appid;
+		this.secret = secret;
+		this.code = code;
+		this.grant_type = grant_type;
+	}
+
+	public AuthTokenParams(String appid, String secret, String grant_type) {
+		this.appid = appid;
+		this.secret = secret;
+		this.grant_type = grant_type;
+	}
+
+	/**
+	 * 参数组装
+	 * @return
+	 */
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("secret", this.secret);
+		params.put("code", this.code);
+		params.put("grant_type", this.grant_type);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getSecret() {
+		return secret;
+	}
+
+	public void setSecret(String secret) {
+		this.secret = secret;
+	}
+
+	public String getCode() {
+		return code;
+	}
+
+	public void setCode(String code) {
+		this.code = code;
+	}
+
+	public String getGrant_type() {
+		return grant_type;
+	}
+}

+ 69 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/AuthUserParams.java

@@ -0,0 +1,69 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 获取用户信息请求
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthUserParams extends AbstractParams {
+
+	private static final long serialVersionUID = 66535717787322321L;
+	
+	private String accessToken;
+	private String openid;
+	private String lang;
+
+	public AuthUserParams() {
+		super();
+	}
+
+	public AuthUserParams(String accessToken, String openid, String lang) {
+		super();
+		this.accessToken = accessToken;
+		this.openid = openid;
+		this.lang = lang;
+	}
+
+	public String getAccessToken() {
+		return accessToken;
+	}
+
+	public void setAccessToken(String accessToken) {
+		this.accessToken = accessToken;
+	}
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getLang() {
+		return lang;
+	}
+
+	public void setLang(String lang) {
+		this.lang = lang;
+	}
+
+	/**
+	 * 参数组装
+	 * @return
+	 */
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("access_token", this.accessToken);
+		params.put("openid", this.openid);
+		params.put("lang", this.lang);
+		return params;
+	}
+}

+ 62 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/RefreshAuthTokenParams.java

@@ -0,0 +1,62 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+
+import com.uas.platform.b2c.common.weixin.model.base.AbstractParams;
+
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * 刷新token请求
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class RefreshAuthTokenParams extends AbstractParams {
+
+	private static final long serialVersionUID = -1748872326563685295L;
+	private String appid;
+	private String grant_type = "refresh_token";
+	private String refresh_token;
+
+	public RefreshAuthTokenParams(String appid, String grant_type, String refresh_token) {
+		super();
+		this.appid = appid;
+		this.grant_type = grant_type;
+		this.refresh_token = refresh_token;
+	}
+
+	/**
+	 * 参数组装
+	 * 
+	 * @return
+	 */
+	public Map<String, String> getParams() {
+		Map<String, String> params = new TreeMap<String, String>();
+		params.put("appid", this.appid);
+		params.put("grant_type", this.grant_type);
+		params.put("refresh_token", this.refresh_token);
+		return params;
+	}
+
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	public String getGrant_type() {
+		return grant_type;
+	}
+
+	public String getRefresh_token() {
+		return refresh_token;
+	}
+
+	public void setRefresh_token(String refresh_token) {
+		this.refresh_token = refresh_token;
+	}
+}

+ 65 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/req/WechatTemplateMsg.java

@@ -0,0 +1,65 @@
+package com.uas.platform.b2c.common.weixin.model.req;
+
+import java.util.TreeMap;
+
+/**
+ * 模板消息
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class WechatTemplateMsg {
+
+	private String touser; //接收者openid
+
+	private String template_id; //模板ID
+
+	private String url; //模板跳转链接
+
+	private TreeMap<String, TreeMap<String, String>> data; //data数据
+
+	public String getTouser() {
+		return touser;
+	}
+
+	public void setTouser(String touser) {
+		this.touser = touser;
+	}
+
+	public String getTemplate_id() {
+		return template_id;
+	}
+
+	public void setTemplate_id(String template_id) {
+		this.template_id = template_id;
+	}
+
+	public String getUrl() {
+		return url;
+	}
+
+	public void setUrl(String url) {
+		this.url = url;
+	}
+
+	public TreeMap<String, TreeMap<String, String>> getData() {
+		return data;
+	}
+
+	public void setData(TreeMap<String, TreeMap<String, String>> data) {
+		this.data = data;
+	}
+
+	/**
+	 * 参数
+	 * @param value
+	 * @param color 可不填
+	 * @return
+	 */
+	public static TreeMap<String, String> item(String value, String color) {
+		TreeMap<String, String> params = new TreeMap<String, String>();
+		params.put("value", value);
+		params.put("color", color);
+		return params;
+	}
+}

+ 32 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AccessToken.java

@@ -0,0 +1,32 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+/**
+ * 微信通用接口凭证
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ * 
+ */
+public class AccessToken {
+	// 获取到的凭证
+	private String access_token;
+	// 凭证有效时间,单位:秒
+	private int expires_in;
+
+	public String getAccess_token() {
+		return access_token;
+	}
+
+	public void setAccess_token(String access_token) {
+		this.access_token = access_token;
+	}
+
+	public int getExpires_in() {
+		return expires_in;
+	}
+
+	public void setExpires_in(int expires_in) {
+		this.expires_in = expires_in;
+	}
+
+}

+ 40 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthAccessToken.java

@@ -0,0 +1,40 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+/**
+ * 网页授权access_token
+ *
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthAccessToken extends AccessToken {
+
+	private String refresh_token; // 用户刷新access_token
+	private String openid; // 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
+	private String scope; // 用户授权的作用域,使用逗号(,)分隔
+
+	public String getRefresh_token() {
+		return refresh_token;
+	}
+
+	public void setRefresh_token(String refresh_token) {
+		this.refresh_token = refresh_token;
+	}
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getScope() {
+		return scope;
+	}
+
+	public void setScope(String scope) {
+		this.scope = scope;
+	}
+
+}

+ 102 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/AuthUserInfo.java

@@ -0,0 +1,102 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+import java.util.List;
+
+/**
+ * 通过网页授权获取的用户信息
+ * @author liuam
+ * @date 2018年6月12日
+ *
+ */
+public class AuthUserInfo {
+	// 用户标识
+	private String openid;
+	// 用户昵称
+	private String nickname;
+	// 性别(1是男性,2是女性,0是未知)
+	private String sex;
+	// 国家
+	private String country;
+	// 省份
+	private String province;
+	// 城市
+	private String city;
+	// 用户头像链接
+	private String headimgurl;
+	// 用户特权信息
+	private List<String> privilege;
+	// 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段
+	private String unionid;
+
+	public String getOpenid() {
+		return openid;
+	}
+
+	public void setOpenid(String openid) {
+		this.openid = openid;
+	}
+
+	public String getNickname() {
+		return nickname;
+	}
+
+	public void setNickname(String nickname) {
+		this.nickname = nickname;
+	}
+
+	public String getSex() {
+		return sex;
+	}
+
+	public void setSex(String sex) {
+		this.sex = sex;
+	}
+
+	public String getCountry() {
+		return country;
+	}
+
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	public String getProvince() {
+		return province;
+	}
+
+	public void setProvince(String province) {
+		this.province = province;
+	}
+
+	public String getCity() {
+		return city;
+	}
+
+	public void setCity(String city) {
+		this.city = city;
+	}
+
+	public String getHeadimgurl() {
+		return headimgurl;
+	}
+
+	public void setHeadimgurl(String headimgurl) {
+		this.headimgurl = headimgurl;
+	}
+
+	public List<String> getPrivilege() {
+		return privilege;
+	}
+
+	public void setPrivilege(List<String> privilege) {
+		this.privilege = privilege;
+	}
+
+	public String getUnionid() {
+		return unionid;
+	}
+
+	public void setUnionid(String unionid) {
+		this.unionid = unionid;
+	}
+}

+ 22 - 0
src/main/java/com/uas/platform/b2c/common/weixin/model/resp/TemplateMsgResult.java

@@ -0,0 +1,22 @@
+package com.uas.platform.b2c.common.weixin.model.resp;
+
+import com.uas.platform.b2c.common.weixin.model.ResultState;
+
+/**
+ * 模板消息 返回的结果
+ * @author phil
+ * @date 2017年6月30日
+ *
+ */
+public class TemplateMsgResult extends ResultState {
+
+	private String msgid; // 消息id(发送模板消息)
+
+	public String getMsgid() {
+		return msgid;
+	}
+
+	public void setMsgid(String msgid) {
+		this.msgid = msgid;
+	}
+}

+ 87 - 85
src/main/java/com/uas/platform/b2c/common/weixin/service/impl/WeChatServiceImpl.java

@@ -1,30 +1,36 @@
 package com.uas.platform.b2c.common.weixin.service.impl;
 
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
 import com.uas.platform.b2c.common.account.dao.UserDao;
 import com.uas.platform.b2c.common.account.model.Enterprise;
 import com.uas.platform.b2c.common.account.model.User;
 import com.uas.platform.b2c.common.weixin.model.MessageModel;
-import com.uas.platform.b2c.common.weixin.model.TemplateData;
-import com.uas.platform.b2c.common.weixin.model.TemplateDataDetail;
-import com.uas.platform.b2c.common.weixin.model.TemplateMessage;
+import com.uas.platform.b2c.common.weixin.model.req.AuthTokenParams;
+import com.uas.platform.b2c.common.weixin.model.req.AuthUserParams;
+import com.uas.platform.b2c.common.weixin.model.req.WechatTemplateMsg;
+import com.uas.platform.b2c.common.weixin.model.resp.AccessToken;
+import com.uas.platform.b2c.common.weixin.model.resp.AuthAccessToken;
+import com.uas.platform.b2c.common.weixin.model.resp.AuthUserInfo;
+import com.uas.platform.b2c.common.weixin.model.resp.TemplateMsgResult;
 import com.uas.platform.b2c.common.weixin.service.WeChatService;
+import com.uas.platform.b2c.common.weixin.util.HttpReqUtil;
 import com.uas.platform.b2c.common.weixin.util.WeChatUtil;
 import com.uas.platform.core.exception.IllegalOperatorException;
 import com.uas.platform.core.util.serializer.FlexJsonUtils;
-import com.uas.sso.common.util.HttpUtil;
 import com.uas.sso.entity.UserAccount;
 import com.uas.sso.entity.UserView;
 import com.uas.sso.util.AccountUtils;
-import net.sf.json.JSONArray;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.ui.ModelMap;
 import org.springframework.util.CollectionUtils;
 import org.springframework.util.StringUtils;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.concurrent.TimeUnit;
 
 /**
  * @author liusw
@@ -36,14 +42,23 @@ public class WeChatServiceImpl implements WeChatService{
     @Autowired
     private UserDao userDao;
 
+    @Autowired
+    private RedisTemplate redisTemplate;
+
+    /**
+     * 保存到 redis 里的过期时间(second)
+     */
+    private static final Integer ACCESS_TOKEN_EXPIRES_IN = 3600;
+
     @Override
     public ModelMap getWxUserInfo(String code, String state) {
         ModelMap result = new ModelMap();
         if (!StringUtils.isEmpty(code)) {
-            JSONObject userInfo = getAccessTokenByCode(code);
-            result.put("nickname", userInfo.getString("nickname"));
-            result.put("headimgurl", userInfo.getString("headimgurl"));
-            String openid = userInfo.getString("openid");
+            AuthUserInfo userInfo = getAccessTokenByCode(code);
+            result.put("nickname", userInfo.getNickname());
+            result.put("headimgurl", userInfo.getHeadimgurl());
+            String openid = userInfo.getOpenid();
+
             result.put("openid", openid);
             User user = userDao.findUsersByOpenId(openid);
             if (StringUtils.isEmpty(user)) {
@@ -74,53 +89,37 @@ public class WeChatServiceImpl implements WeChatService{
     @Override
     public ModelMap sendTemplateMessage(List<MessageModel> messages) {
         ModelMap result = new ModelMap();
-        String url = WeChatUtil.GET_ACCESS_TOKEN;
-        url = url.replace("APPID", WeChatUtil.APPID);
-        url = url.replace("SECRET", WeChatUtil.APPSECRET);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            String access_token = jsonObject.getString("access_token");
-            String sendTemplateUrl = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token);
-            // 模板内容设置
-            TemplateMessage templateMessage = new TemplateMessage();
-            templateMessage.setTemplate_id(WeChatUtil.INQUIRY_TEMPLATE_ID);
-            TemplateDataDetail first = new TemplateDataDetail();
-            TemplateDataDetail keyword1 = new TemplateDataDetail();
-            TemplateDataDetail keyword2 = new TemplateDataDetail();
-            TemplateDataDetail keyword3 = new TemplateDataDetail();
-            TemplateDataDetail remark = new TemplateDataDetail();
-            for (MessageModel messageModel : messages) {
-                User user = userDao.findOne(messageModel.getReceiverUu());
-                if (!StringUtils.isEmpty(user.getOpenId())) {
-                    templateMessage.setUrl("https://www.usoftmall.com/mobile/applyPurchase/list/businessOpportunity?enuu=" + messageModel.getReceiverEnuu());
-                    Map<String, TemplateDataDetail> data = new HashMap<>();
-                    templateMessage.setTouser(user.getOpenId());
-                    keyword1.setValue(messageModel.getName());
-                    keyword1.setColor("#173177");
-                    data.put("keyword1", keyword1);
-                    keyword2.setValue("点击查看详情");
-                    keyword2.setColor("#173177");
-                    data.put("keyword2", keyword2);
-                    keyword3.setColor("#173177");
-                    keyword3.setValue("点击查看详情");
-                    data.put("keyword3", keyword3);
-                    first.setValue("尊敬的用户,您所在的企业(" + messageModel.getName() + ")有一条新的询价单");
-                    remark.setValue(messageModel.getContent());
-                    data.put("first", first);
-                    data.put("remark", remark);
-                    templateMessage.setData(data);
-                    HttpUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(templateMessage));
-                }
+        List<TemplateMsgResult> templateMsgResults = new ArrayList<>();
+
+        TreeMap<String, TreeMap<String, String>> params = new TreeMap<>();
+
+        // 获取操作 api 需要的 access_token
+        String access_token = getAccessToken();
+        String sendTemplateUrl = WeChatUtil.SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", access_token);
+        // 模板内容设置
+        for (MessageModel messageModel : messages) {
+            User user = userDao.findOne(messageModel.getReceiverUu());
+            if (!StringUtils.isEmpty(user.getOpenId())) {
+                WechatTemplateMsg wechatTemplateMsg = new WechatTemplateMsg();
+                wechatTemplateMsg.setTemplate_id(WeChatUtil.INQUIRY_TEMPLATE_ID);
+
+                params.put("first", WechatTemplateMsg.item("尊敬的用户,您所在的企业(" + messageModel.getName() + ")有一条新的询价单", null));
+                params.put("keyword1", WechatTemplateMsg.item(messageModel.getName(), "#173177"));
+                params.put("keyword2", WechatTemplateMsg.item("点击查看详情", "#173177"));
+                params.put("keyword3", WechatTemplateMsg.item("点击查看详情", "#173177"));
+                params.put("remark", WechatTemplateMsg.item(messageModel.getContent(), null));
+
+                wechatTemplateMsg.setUrl("https://www.usoftmall.com/mobile/applyPurchase/list/businessOpportunity?enuu=" + messageModel.getReceiverEnuu());
+                wechatTemplateMsg.setTouser(user.getOpenId());
+                wechatTemplateMsg.setData(params);
+                String json = HttpReqUtil.doPost(sendTemplateUrl, FlexJsonUtils.toJsonDeep(wechatTemplateMsg));
+
+                TemplateMsgResult templateMsgResult = FlexJsonUtils.fromJson(json, TemplateMsgResult.class);
+                templateMsgResults.add(templateMsgResult);
             }
-            result.put("success", true);
-            return result;
-        } catch (Exception e) {
-            e.printStackTrace();
-            result.put("success", false);
-            result.put("message", e.getMessage());
-            return result;
         }
+        result.put("data", templateMsgResults);
+        return result;
     }
 
     @Override
@@ -174,36 +173,39 @@ public class WeChatServiceImpl implements WeChatService{
      * 通过code获取用户openId
      * @param code
      */
-    private JSONObject getAccessTokenByCode(String code) {
-        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
-        url = url.replace("APPID", WeChatUtil.APPID);
-        url = url.replace("SECRET", WeChatUtil.APPSECRET);
-        url = url.replace("CODE", code);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            String accessToken = jsonObject.getString("access_token");
-            String openId = jsonObject.getString("openid");
-            String refreshToken = jsonObject.getString("refresh_token");
-            JSONObject userInfo = getUserInfo(accessToken, openId);
-            return userInfo;
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
+    private AuthUserInfo getAccessTokenByCode(String code) {
+        AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET, code, "authorization_code");
+        String json = HttpReqUtil.doGet(WeChatUtil.GET_OAUTH_TOKEN_URL, authTokenParams.getParams());
+        AuthAccessToken authAccessToken = FlexJsonUtils.fromJson(json, AuthAccessToken.class);
+        String accessToken = authAccessToken.getAccess_token();
+        String openId = authAccessToken.getOpenid();
+        AuthUserInfo userInfo = getUserInfo(accessToken, openId);
+        return userInfo;
     }
 
-    private JSONObject getUserInfo(String accessToken, String openId) {
-        String url = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
-        url = url.replace("ACCESS_TOKEN", accessToken);
-        url = url.replace("OPENID", openId);
-        try {
-            HttpUtil.ResponseWrap res = HttpUtil.doGet(url);
-            JSONObject jsonObject = JSON.parseObject(res.getContent());
-            return jsonObject;
-        } catch (Exception e) {
-            e.printStackTrace();
+    private AuthUserInfo getUserInfo(String accessToken, String openId) {
+        // 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语
+        AuthUserParams authUserParams = new AuthUserParams(accessToken, openId, "zh_CN");
+        String json = HttpReqUtil.doGet(WeChatUtil.SNS_USERINFO_URL, authUserParams.getParams());
+        AuthUserInfo authUserInfo = FlexJsonUtils.fromJson(json, AuthUserInfo.class);
+        return authUserInfo;
+
+    }
+
+    /**
+     * 获取调用api所需的access_token
+     * @exception Exception 获取 access_token 失败抛出异常
+     */
+    private String getAccessToken () {
+        String access_token = (String) redisTemplate.opsForValue().get("WX_ACCESS_TOKEN");
+        if (!StringUtils.isEmpty(access_token)) {
+            return access_token;
         }
-        return null;
+        AuthTokenParams authTokenParams = new AuthTokenParams(WeChatUtil.APPID, WeChatUtil.APPSECRET,"client_credential");
+        String json = HttpReqUtil.doGet(WeChatUtil.GET_ACCESS_TOKEN, authTokenParams.getParams());
+        AccessToken accessToken = FlexJsonUtils.fromJson(json, AccessToken.class);
+        access_token = accessToken.getAccess_token();
+        redisTemplate.opsForValue().set("WX_ACCESS_TOKEN", access_token, ACCESS_TOKEN_EXPIRES_IN, TimeUnit.SECONDS);
+        return access_token;
     }
 }

+ 142 - 0
src/main/java/com/uas/platform/b2c/common/weixin/util/HttpReqUtil.java

@@ -0,0 +1,142 @@
+package com.uas.platform.b2c.common.weixin.util;
+
+import com.uas.sso.common.util.HttpUtil;
+import org.apache.commons.collections4.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * @author liuam
+ * @since 2018/6/12 0012 下午 14:20
+ */
+public class HttpReqUtil {
+
+    /**
+     * 默认的http请求执行方法,返回
+     *
+     * @param path   请求path 路径
+     * @param map    请求参数集合
+     * @return
+     */
+    public static String doGet(String path, Map<String, String> map) {
+        String result = "";
+        try {
+            String url = setParmas((TreeMap<String, String>) map, path, "");
+            HttpUtil.ResponseWrap responseWrap = HttpUtil.doGet(url);
+            result = responseWrap.getContent();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+    /**
+     * 默认的http请求执行方法,返回
+     *
+     * @param path   请求path 路径
+     * @param json   请求json数据
+     * @return
+     */
+    public static String doPost(String path, String json) {
+        String result = "";
+        try {
+            HttpUtil.ResponseWrap responseWrap = HttpUtil.doPost(path, json);
+            result = responseWrap.getContent();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    /**
+     * 设置参数
+     *
+     * @param map     参数map
+     * @param path    需要赋值的path
+     * @param charset 编码格式 默认编码为utf-8(取消默认)
+     * @return 已经赋值好的url 只需要访问即可
+     */
+    public static String setParmas(Map<String, String> map, String path, String charset) throws Exception {
+        String result = "";
+        boolean hasParams = false;
+        if (path != null && !"".equals(path)) {
+            if (MapUtils.isNotEmpty(map)) {
+                StringBuilder builder = new StringBuilder();
+                Set<Map.Entry<String, String>> params = map.entrySet();
+                for (Map.Entry<String, String> entry : params) {
+                    String key = entry.getKey().trim();
+                    String value = entry.getValue().trim();
+                    if (hasParams) {
+                        builder.append("&");
+                    } else {
+                        hasParams = true;
+                    }
+                    if (charset != null && !"".equals(charset)) {
+                        // builder.append(key).append("=").append(URLDecoder.(value,charset));
+                        builder.append(key).append("=").append(urlEncode(value, charset));
+                    } else {
+                        builder.append(key).append("=").append(value);
+                    }
+                }
+                result = builder.toString();
+            }
+        }
+        return doUrlPath(path, result).toString();
+    }
+
+    /**
+     * 编码
+     *
+     * @param source
+     * @param encode
+     * @return
+     */
+    public static String urlEncode(String source, String encode) {
+        String result = source;
+        try {
+            result = URLEncoder.encode(source, encode);
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+        return result;
+    }
+
+
+    /**
+     * 设置连接参数
+     *
+     * @param path
+     *            路径
+     * @return
+     */
+    private static URL doUrlPath(String path, String query) throws Exception {
+        URL url = new URL(path);
+        if (StringUtils.isEmpty(path)) {
+            return url;
+        }
+        if (StringUtils.isEmpty(url.getQuery())) {
+            if (path.endsWith("?")) {
+                path += query;
+            } else {
+                path = path + "?" + query;
+            }
+        } else {
+            if (path.endsWith("&")) {
+                path += query;
+            } else {
+                path = path + "&" + query;
+            }
+        }
+        return new URL(path);
+    }
+}
+
+
+

+ 11 - 1
src/main/java/com/uas/platform/b2c/common/weixin/util/WeChatUtil.java

@@ -29,5 +29,15 @@ public class WeChatUtil {
     /**
      * 获取access_token
      */
-    public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";
+    public static final String GET_ACCESS_TOKEN = "https://api.weixin.qq.com/cgi-bin/token";
+
+    /**
+     * 获取token的链接
+     */
+    public static final String GET_OAUTH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
+
+    /**
+     * 获取授权用户信息
+     */
+    public static final String SNS_USERINFO_URL = "https://api.weixin.qq.com/sns/userinfo";
 }