微信公众号开发之获取用户列表和用户基本信息(五)
<h3>一、获取用户列表</h3><p>公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成。一次拉取调用最多拉取10000个关注者的OpenID,可以通过多次拉取的方式来满足需求。</p>
<p>接口调用请求说明</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="21">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;code&quot;:&quot;http请求方式: GET(请使用https协议)\nhttps://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&amp;next_openid=NEXT_OPENID\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">http请求方式: GET(请使用https协议)
https://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&next_openid=NEXT_OPENID
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>是否必须</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>access_token</td>
<td>是</td>
<td>调用接口凭证</td>
</tr>
<tr>
<td>next_openid</td>
<td>是</td>
<td>第一个拉取的OPENID,不填默认从头开始拉取</td>
</tr>
</tbody>
</table>
<p>返回说明</p>
<p>正确时返回JSON数据包:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="20">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;code&quot;:&quot;{\n \&quot;total\&quot;:2,\n \&quot;count\&quot;:2,\n \&quot;data\&quot;:{\n \&quot;openid\&quot;:[\&quot;OPENID1\&quot;,\&quot;OPENID2\&quot;]},\n \&quot;next_openid\&quot;:\&quot;NEXT_OPENID\&quot;\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{
"total":2,
"count":2,
"data":{
"openid":["OPENID1","OPENID2"]},
"next_openid":"NEXT_OPENID"
}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>total</td>
<td>关注该公众账号的总用户数</td>
</tr>
<tr>
<td>count</td>
<td>拉取的OPENID个数,最大值为10000</td>
</tr>
<tr>
<td>data</td>
<td>列表数据,OPENID的列表</td>
</tr>
<tr>
<td>next_openid</td>
<td>拉取列表的最后一个用户的OPENID</td>
</tr>
</tbody>
</table>
<p> 我们定义一个方法获取用户列表</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="19"><img class="has cke_widget_element lazyload" alt="" width="1200" height="835" src="https://img-blog.csdnimg.cn/20200121011046411.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200121011046411.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;835&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200121011046411.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="18">
<pre class="cke_widget_element has" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.components.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.constants.URIConstant;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.client.RestTemplate;\n\n@Slf4j\n@Component\npublic class WxUserUtil {\n\n @Autowired\n private RestTemplate restTemplate;\n\n @Autowired\n private AccessTokenUtil accessTokenUtil;\n\n /**\n *获取帐号的关注者列表\n * @return\n */\n public JSONObject getUserList(String nextOpenid){\n\n String accessToken = accessTokenUtil.getAccessToken();\n if(accessToken != null){\n log.info(\&quot;URL{}\&quot;,URIConstant.USER_LIST_URL);\n String url = URIConstant.USER_LIST_URL.replace(\&quot;ACCESS_TOKEN\&quot;, accessToken);\n\n if(nextOpenid != null){\n url = URIConstant.USER_LIST_URL + \&quot;&amp;next_openid=\&quot;+ nextOpenid;\n }\n log.info(\&quot;USER_LIST_URL:{}\&quot;,url);\n\n //发起POST请求创建菜单\n JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);\n\n return jsonObject;\n }\n return null;\n }\n\n}\n&quot;,&quot;classes&quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.components.weixin;
import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.constants.URIConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Slf4j
@Component
public class WxUserUtil {
@Autowired
private RestTemplate restTemplate;
@Autowired
private AccessTokenUtil accessTokenUtil;
/**
*获取帐号的关注者列表
* @return
*/
public JSONObject getUserList(String nextOpenid){
String accessToken = accessTokenUtil.getAccessToken();
if(accessToken != null){
log.info("URL{}",URIConstant.USER_LIST_URL);
String url = URIConstant.USER_LIST_URL.replace("ACCESS_TOKEN", accessToken);
if(nextOpenid != null){
url = URIConstant.USER_LIST_URL + "&next_openid="+ nextOpenid;
}
log.info("USER_LIST_URL:{}",url);
//发起POST请求创建菜单
JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);
return jsonObject;
}
return null;
}
}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>在controller中调用这个方法</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="17"><img class="has cke_widget_element lazyload" alt="" width="1200" height="730" src="https://img-blog.csdnimg.cn/20200121011301250.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200121011301250.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;730&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200121011301250.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="16">
<pre class="cke_widget_element has" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.controller.weixin;\n\nimport com.alibaba.fastjson.JSON;\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.constants.WXConstant;\nimport com.xu.wemall.components.weixin.WxUserUtil;\nimport io.swagger.annotations.Api;\nimport io.swagger.annotations.ApiImplicitParam;\nimport io.swagger.annotations.ApiImplicitParams;\nimport io.swagger.annotations.ApiOperation;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.client.RestTemplate;\nimport springfox.documentation.annotations.ApiIgnore;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.net.URLEncoder;\n\n/**\n * 类名称: LoginController\n * 类描述: 与微信对接登陆验证\n *\n * @author RonnieXu\n * 创建时间:2017年12月5日上午10:52:13\n */\n@Slf4j\n@RestController\n@Api(tags = \&quot;微信用户接口\&quot;)\n@RequestMapping(value = \&quot;/wxuser\&quot;)\npublic class WxUserController {\n\n @Autowired\n private WxUserUtil wxUserUtil;\n\n @Autowired\n private RestTemplate restTemplate;\n\n @ApiIgnore\n @RequestMapping(value=\&quot;/login\&quot;, method = RequestMethod.GET)\n public void wxLogin(HttpServletResponse response) throws IOException {\n //请求获取code的回调地址\n //用线上环境的域名或者用内网穿透,不能用ip\n String callBack = \&quot;http://jialeyuan.nat300.top/wxAuth/callBack\&quot;;\n\n //请求地址\n String url = \&quot;https://open.weixin.qq.com/connect/oauth2/authorize\&quot; +\n \&quot;?appid=\&quot; + WXConstant.TEST_APPID +\n \&quot;&amp;redirect_uri=\&quot; + URLEncoder.encode(callBack,\&quot;utf-8\&quot;) +\n \&quot;&amp;response_type=code\&quot; +\n \&quot;&amp;scope=snsapi_userinfo\&quot; +\n \&quot;&amp;state=STATE#wechat_redirect\&quot;;\n //重定向\n response.sendRedirect(url);\n }\n\n // 回调方法\n @ApiIgnore\n @RequestMapping(value =\&quot;/callBack\&quot;, method = RequestMethod.GET)\n public void wxCallBack(HttpServletRequest request,HttpServletResponse response) throws IOException {\n String code = request.getParameter(\&quot;code\&quot;);\n\n //获取access_token\n String url = \&quot;https://api.weixin.qq.com/sns/oauth2/access_token\&quot; +\n \&quot;?appid=\&quot; + WXConstant.TEST_APPID +\n \&quot;&amp;secret=\&quot; + WXConstant.TEST_APPSECRET +\n \&quot;&amp;code=\&quot; + code +\n \&quot;&amp;grant_type=authorization_code\&quot;;\n\n String result = restTemplate.getForObject(url, String.class);\n\n System.out.println(\&quot;请求获取access_token:\&quot; + result);\n //返回结果的json对象\n JSONObject resultObject = JSON.parseObject(result);\n\n //请求获取userInfo\n String infoUrl = \&quot;https://api.weixin.qq.com/sns/userinfo\&quot; +\n \&quot;?access_token=\&quot; + resultObject.getString(\&quot;access_token\&quot;) +\n \&quot;&amp;openid=\&quot; + resultObject.getString(\&quot;openid\&quot;) +\n \&quot;&amp;lang=zh_CN\&quot;;\n\n String resultInfo = restTemplate.getForObject(infoUrl, String.class);\n\n //此时已获取到userInfo,再根据业务进行处理\n log.info(\&quot;请求获取userInfo:{}\&quot;, resultInfo);\n\n }\n\n /**\n * 获取关注公众号的用户列表\n */\n @ApiOperation(value = \&quot;获取关注公众号的用户列表\&quot;)\n @RequestMapping(value = \&quot;/getUserList\&quot;, method = RequestMethod.GET)\n @ApiImplicitParams({\n @ApiImplicitParam(name=\&quot;nextOpenid\&quot;,value=\&quot;第一个拉取的OPENID,不填默认从头开始拉取\&quot;, paramType=\&quot;query\&quot;,dataType=\&quot;String\&quot;),\n })\n public JSONObject getUserList(String nextOpenid) {\n\n JSONObject result = wxUserUtil.getUserList(nextOpenid);\n log.info(\&quot;user_list:{}\&quot;, result.toJSONString());\n return result;\n\n }\n\n}\n&quot;,&quot;classes&quot;:[]}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.controller.weixin;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.constants.WXConstant;
import com.xu.wemall.components.weixin.WxUserUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import springfox.documentation.annotations.ApiIgnore;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
/**
* 类名称: LoginController
* 类描述: 与微信对接登陆验证
*
* @author RonnieXu
* 创建时间:2017年12月5日上午10:52:13
*/
@Slf4j
@RestController
@Api(tags = "微信用户接口")
@RequestMapping(value = "/wxuser")
public class WxUserController {
@Autowired
private WxUserUtil wxUserUtil;
@Autowired
private RestTemplate restTemplate;
@ApiIgnore
@RequestMapping(value="/login", method = RequestMethod.GET)
public void wxLogin(HttpServletResponse response) throws IOException {
//请求获取code的回调地址
//用线上环境的域名或者用内网穿透,不能用ip
String callBack = "http://jialeyuan.nat300.top/wxAuth/callBack";
//请求地址
String url = "https://open.weixin.qq.com/connect/oauth2/authorize" +
"?appid=" + WXConstant.TEST_APPID +
"&redirect_uri=" + URLEncoder.encode(callBack,"utf-8") +
"&response_type=code" +
"&scope=snsapi_userinfo" +
"&state=STATE#wechat_redirect";
//重定向
response.sendRedirect(url);
}
// 回调方法
@ApiIgnore
@RequestMapping(value ="/callBack", method = RequestMethod.GET)
public void wxCallBack(HttpServletRequest request,HttpServletResponse response) throws IOException {
String code = request.getParameter("code");
//获取access_token
String url = "https://api.weixin.qq.com/sns/oauth2/access_token" +
"?appid=" + WXConstant.TEST_APPID +
"&secret=" + WXConstant.TEST_APPSECRET +
"&code=" + code +
"&grant_type=authorization_code";
String result = restTemplate.getForObject(url, String.class);
System.out.println("请求获取access_token:" + result);
//返回结果的json对象
JSONObject resultObject = JSON.parseObject(result);
//请求获取userInfo
String infoUrl = "https://api.weixin.qq.com/sns/userinfo" +
"?access_token=" + resultObject.getString("access_token") +
"&openid=" + resultObject.getString("openid") +
"&lang=zh_CN";
String resultInfo = restTemplate.getForObject(infoUrl, String.class);
//此时已获取到userInfo,再根据业务进行处理
log.info("请求获取userInfo:{}", resultInfo);
}
/**
* 获取关注公众号的用户列表
*/
@ApiOperation(value = "获取关注公众号的用户列表")
@RequestMapping(value = "/getUserList", method = RequestMethod.GET)
@ApiImplicitParams({
@ApiImplicitParam(name="nextOpenid",value="第一个拉取的OPENID,不填默认从头开始拉取", paramType="query",dataType="String"),
})
public JSONObject getUserList(String nextOpenid) {
JSONObject result = wxUserUtil.getUserList(nextOpenid);
log.info("user_list:{}", result.toJSONString());
return result;
}
}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>我们测试一下,看看我们获取到的关注我们公众号的用户列表</p>
<p> <span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="15"><img class="has cke_widget_element lazyload" alt="" width="1200" height="701" src="https://img-blog.csdnimg.cn/20200121011720517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20200121011720517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;701&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20200121011720517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<p> </p>
<h3>二、获取用户详情</h3>
<p>在微信开发过程中,我们有时候需要获取用户的一些基础信息,尤其比如微信公众号和头像地址。获取用户信息主要是通过以下接口:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="14">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;code&quot;:&quot;接口调用请求说明\nhttp请求方式: GET\nhttps://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&amp;openid=OPENID&amp;lang=zh_CN&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">接口调用请求说明
http请求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>通过这个接口里的参数 可以看到我们需要先获得access_token、openid这两个参数,access_token之前的文章已经说过了,openid是用户的微信公众号唯一标识</p>
<p>参数说明</p>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>是否必须</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>access_token</td>
<td>是</td>
<td>调用接口凭证</td>
</tr>
<tr>
<td>openid</td>
<td>是</td>
<td>普通用户的标识,对当前公众号唯一</td>
</tr>
<tr>
<td>lang</td>
<td>否</td>
<td>返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语</td>
</tr>
</tbody>
</table>
<p> </p>
<p>openid在用户关注我们的公众号时候就可以获取到,不过在那里openid叫FromUserName</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="13"><img class="has cke_widget_element lazyload" alt="" width="1200" height="863" src="https://img-blog.csdnimg.cn/2019122905013848.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/2019122905013848.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;863&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/2019122905013848.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<p>如果接口响应成功,则返回如下:</p>
<p>返回说明</p>
<p>正常情况下,微信会返回下述JSON数据包给公众号:</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="12">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;code&quot;:&quot;{\n \&quot;subscribe\&quot;: 1, \n \&quot;openid\&quot;: \&quot;o6_bmjrPTlm6_2sgVt7hMZOPfL2M\&quot;, \n \&quot;nickname\&quot;: \&quot;Band\&quot;, \n \&quot;sex\&quot;: 1, \n \&quot;language\&quot;: \&quot;zh_CN\&quot;, \n \&quot;city\&quot;: \&quot;广州\&quot;, \n \&quot;province\&quot;: \&quot;广东\&quot;, \n \&quot;country\&quot;: \&quot;中国\&quot;, \n \&quot;headimgurl\&quot;:\&quot;http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0\&quot;,\n \&quot;subscribe_time\&quot;: 1382694957,\n \&quot;unionid\&quot;: \&quot; o6_bmasdasdsad6_2sgVt7hMZOPfL\&quot;\n \&quot;remark\&quot;: \&quot;\&quot;,\n \&quot;groupid\&quot;: 0,\n \&quot;tagid_list\&quot;:,\n \&quot;subscribe_scene\&quot;: \&quot;ADD_SCENE_QR_CODE\&quot;,\n \&quot;qr_scene\&quot;: 98765,\n \&quot;qr_scene_str\&quot;: \&quot;\&quot;\n}&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{
"subscribe": 1,
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
"nickname": "Band",
"sex": 1,
"language": "zh_CN",
"city": "广州",
"province": "广东",
"country": "中国",
"headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"subscribe_time": 1382694957,
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
"remark": "",
"groupid": 0,
"tagid_list":,
"subscribe_scene": "ADD_SCENE_QR_CODE",
"qr_scene": 98765,
"qr_scene_str": ""
}</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p> </p>
<p>参数说明</p>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>subscribe</td>
<td>用户是否订阅该公众号标识,值为0时,代表此用户没有关注该公众号,拉取不到其余信息。</td>
</tr>
<tr>
<td>openid</td>
<td>用户的标识,对当前公众号唯一</td>
</tr>
<tr>
<td>nickname</td>
<td>用户的昵称</td>
</tr>
<tr>
<td>sex</td>
<td>用户的性别,值为1时是男性,值为2时是女性,值为0时是未知</td>
</tr>
<tr>
<td>city</td>
<td>用户所在城市</td>
</tr>
<tr>
<td>country</td>
<td>用户所在国家</td>
</tr>
<tr>
<td>province</td>
<td>用户所在省份</td>
</tr>
<tr>
<td>language</td>
<td>用户的语言,简体中文为zh_CN</td>
</tr>
<tr>
<td>headimgurl</td>
<td>用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。</td>
</tr>
<tr>
<td>subscribe_time</td>
<td>用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间</td>
</tr>
<tr>
<td>unionid</td>
<td>只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。</td>
</tr>
<tr>
<td>remark</td>
<td>公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注</td>
</tr>
<tr>
<td>groupid</td>
<td>用户所在的分组ID(兼容旧的用户分组接口)</td>
</tr>
<tr>
<td>tagid_list</td>
<td>用户被打上的标签ID列表</td>
</tr>
<tr>
<td>subscribe_scene</td>
<td>返回用户关注的渠道来源,ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,ADD_SCENE_PROFILE_ LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他</td>
</tr>
<tr>
<td>qr_scene</td>
<td>二维码扫码场景(开发者自定义)</td>
</tr>
<tr>
<td>qr_scene_str</td>
<td>二维码扫码场景描述(开发者自定义)</td>
</tr>
</tbody>
</table>
<p>这里先贴出所有的依赖 </p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="11">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;pom.xml&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">pom.xml</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="10">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;&lt;?xml version=\&quot;1.0\&quot; encoding=\&quot;UTF-8\&quot;?&gt;\n&lt;project xmlns=\&quot;http://maven.apache.org/POM/4.0.0\&quot; xmlns:xsi=\&quot;http://www.w3.org/2001/XMLSchema-instance\&quot;\n xsi:schemaLocation=\&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\&quot;&gt;\n &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;\n\n &lt;groupId&gt;com.xu&lt;/groupId&gt;\n &lt;artifactId&gt;wemall&lt;/artifactId&gt;\n &lt;version&gt;v0.6.1-beta-build20190718&lt;/version&gt;\n &lt;packaging&gt;jar&lt;/packaging&gt;\n\n &lt;name&gt;wemall&lt;/name&gt;\n &lt;description&gt;this is a wemall project&lt;/description&gt;\n\n &lt;parent&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-parent&lt;/artifactId&gt;\n &lt;version&gt;2.1.1.RELEASE&lt;/version&gt;\n &lt;relativePath/&gt;\n &lt;/parent&gt;\n\n &lt;properties&gt;\n &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;\n &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt;\n &lt;java.version&gt;1.8&lt;/java.version&gt;\n &lt;swagger-ui.version&gt;2.9.2&lt;/swagger-ui.version&gt;\n &lt;swagger2.version&gt;2.9.2&lt;/swagger2.version&gt;\n &lt;/properties&gt;\n\n &lt;dependencies&gt;\n &lt;!-- spring-boot --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-thymeleaf&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;!-- 使thymeleaf支持h5标签 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;net.sourceforge.nekohtml&lt;/groupId&gt;\n &lt;artifactId&gt;nekohtml&lt;/artifactId&gt;\n &lt;version&gt;1.9.22&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- log related --&gt;\n &lt;dependency&gt; &lt;!-- exclude掉spring-boot的默认log配置 --&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;!--aspectj--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-aop&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt;\n &lt;scope&gt;test&lt;/scope&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;junit&lt;/groupId&gt;\n &lt;artifactId&gt;junit&lt;/artifactId&gt;\n &lt;version&gt;4.12&lt;/version&gt;\n &lt;!-- 表示开发的时候引入,发布的时候不会加载此包 --&gt;\n &lt;scope&gt;test&lt;/scope&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;\n &lt;artifactId&gt;commons-io&lt;/artifactId&gt;\n &lt;version&gt;1.3.2&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- mybatis-plus begin --&gt;\n &lt;!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.baomidou&lt;/groupId&gt;\n &lt;artifactId&gt;mybatis-plus-boot-starter&lt;/artifactId&gt;\n &lt;version&gt;3.1.0&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.baomidou&lt;/groupId&gt;\n &lt;artifactId&gt;mybatis-plus-generator&lt;/artifactId&gt;\n &lt;version&gt;3.1.0&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!--swagger2--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.springfox&lt;/groupId&gt;\n &lt;artifactId&gt;springfox-swagger-ui&lt;/artifactId&gt;\n &lt;version&gt;${swagger-ui.version}&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!--排除并新增1.5swagger-annotations和swagger-models\n 为了解决swagger2中example注解导致的input空字符串异常错误--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.springfox&lt;/groupId&gt;\n &lt;artifactId&gt;springfox-swagger2&lt;/artifactId&gt;\n &lt;version&gt;${swagger2.version}&lt;/version&gt;\n &lt;exclusions&gt;\n &lt;exclusion&gt;\n &lt;groupId&gt;io.swagger&lt;/groupId&gt;\n &lt;artifactId&gt;swagger-annotations&lt;/artifactId&gt;\n &lt;/exclusion&gt;\n &lt;exclusion&gt;\n &lt;groupId&gt;io.swagger&lt;/groupId&gt;\n &lt;artifactId&gt;swagger-models&lt;/artifactId&gt;\n &lt;/exclusion&gt;\n &lt;/exclusions&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;io.swagger&lt;/groupId&gt;\n &lt;artifactId&gt;swagger-annotations&lt;/artifactId&gt;\n &lt;version&gt;1.5.21&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;io.swagger&lt;/groupId&gt;\n &lt;artifactId&gt;swagger-models&lt;/artifactId&gt;\n &lt;version&gt;1.5.21&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- 引入Druid依赖,阿里巴巴所提供的数据源 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n &lt;artifactId&gt;druid&lt;/artifactId&gt;\n &lt;version&gt;1.0.29&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- 提供mysql驱动 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;mysql&lt;/groupId&gt;\n &lt;artifactId&gt;mysql-connector-java&lt;/artifactId&gt;\n &lt;version&gt;5.1.38&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.projectlombok&lt;/groupId&gt;\n &lt;artifactId&gt;lombok&lt;/artifactId&gt;\n &lt;version&gt;1.16.16&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!--jsonwebtoken--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.jsonwebtoken&lt;/groupId&gt;\n &lt;artifactId&gt;jjwt&lt;/artifactId&gt;\n &lt;version&gt;0.9.1&lt;/version&gt;\n &lt;/dependency&gt;\n &lt;!--jsonwebtoken--&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n &lt;artifactId&gt;fastjson&lt;/artifactId&gt;\n &lt;version&gt;1.2.46&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!--热部署--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework&lt;/groupId&gt;\n &lt;artifactId&gt;springloaded&lt;/artifactId&gt;\n &lt;version&gt;1.2.8.RELEASE&lt;/version&gt;\n &lt;scope&gt;provided&lt;/scope&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-devtools&lt;/artifactId&gt;\n &lt;optional&gt;true&lt;/optional&gt;\n &lt;/dependency&gt;\n\n &lt;!--redis配置--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-data-redis&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;!-- websocket --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-websocket&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;dom4j&lt;/groupId&gt;\n &lt;artifactId&gt;dom4j&lt;/artifactId&gt;\n &lt;version&gt;1.6.1&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;com.thoughtworks.xstream&lt;/groupId&gt;\n &lt;artifactId&gt;xstream&lt;/artifactId&gt;\n &lt;version&gt;1.4.9&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;\n &lt;artifactId&gt;commons-lang3&lt;/artifactId&gt;\n &lt;version&gt;3.3.2&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- alibaba的easyexcel --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.alibaba&lt;/groupId&gt;\n &lt;artifactId&gt;easyexcel&lt;/artifactId&gt;\n &lt;version&gt;1.1.2-beta4&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- pdf实现 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.itextpdf&lt;/groupId&gt;\n &lt;artifactId&gt;itextpdf&lt;/artifactId&gt;\n &lt;version&gt;5.5.10&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- pdf字体包 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;com.itextpdf&lt;/groupId&gt;\n &lt;artifactId&gt;itext-asian&lt;/artifactId&gt;\n &lt;version&gt;5.2.0&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!-- activemq消息队列 --&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-activemq&lt;/artifactId&gt;\n &lt;version&gt;2.0.4.RELEASE&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;!--netty--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;io.netty&lt;/groupId&gt;\n &lt;artifactId&gt;netty-all&lt;/artifactId&gt;\n &lt;version&gt;4.1.16.Final&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;dependency&gt;\n &lt;groupId&gt;org.mockito&lt;/groupId&gt;\n &lt;artifactId&gt;mockito-core&lt;/artifactId&gt;\n &lt;version&gt;2.0.31-beta&lt;/version&gt;\n &lt;scope&gt;test&lt;/scope&gt;\n &lt;/dependency&gt;\n\n &lt;!-- freemarker自定义模板,生成代码模板时候需要这个--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-starter-freemarker&lt;/artifactId&gt;\n &lt;/dependency&gt;\n\n &lt;!--redisson--&gt;\n &lt;dependency&gt;\n &lt;groupId&gt;org.redisson&lt;/groupId&gt;\n &lt;artifactId&gt;redisson&lt;/artifactId&gt;\n &lt;version&gt;3.5.7&lt;/version&gt;\n &lt;/dependency&gt;\n\n &lt;/dependencies&gt;\n\n &lt;build&gt;\n &lt;plugins&gt;\n &lt;plugin&gt;\n &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt;\n &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt;\n &lt;configuration&gt;\n &lt;includeSystemScope&gt;true&lt;/includeSystemScope&gt;\n &lt;fork&gt;true&lt;/fork&gt;&lt;!--该配置必须--&gt;\n &lt;executable&gt;true&lt;/executable&gt;\n &lt;excludeDevtools&gt;false&lt;/excludeDevtools&gt;\n &lt;mainClass&gt;com.xu.wemall.wemallApplication&lt;/mainClass&gt;\n &lt;/configuration&gt;\n &lt;/plugin&gt;\n\n &lt;plugin&gt;\n &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;\n &lt;artifactId&gt;maven-surefire-plugin&lt;/artifactId&gt;\n &lt;version&gt;2.4.2&lt;/version&gt;\n &lt;configuration&gt;\n &lt;skipTests&gt;true&lt;/skipTests&gt;\n &lt;/configuration&gt;\n &lt;/plugin&gt;\n\n &lt;plugin&gt;\n &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;\n &lt;version&gt;3.3&lt;/version&gt;\n &lt;configuration&gt;\n &lt;encoding&gt;utf-8&lt;/encoding&gt;\n &lt;source&gt;1.8&lt;/source&gt;\n &lt;target&gt;1.8&lt;/target&gt;\n &lt;/configuration&gt;\n &lt;/plugin&gt;\n\n &lt;/plugins&gt;\n &lt;/build&gt;\n\n&lt;/project&gt;\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs"><span class="php"><span class="hljs-meta"><?xml version=<span class="hljs-string">"1.0" encoding=<span class="hljs-string">"UTF-8"<span class="hljs-meta">?>
<span class="hljs-tag"><<span class="hljs-name">project <span class="hljs-attr">xmlns=<span class="hljs-string">"http://maven.apache.org/POM/4.0.0" <span class="hljs-attr">xmlns:xsi=<span class="hljs-string">"http://www.w3.org/2001/XMLSchema-instance"
<span class="hljs-attr">xsi:schemaLocation=<span class="hljs-string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<span class="hljs-tag"><<span class="hljs-name">modelVersion>4.0.0<span class="hljs-tag"></<span class="hljs-name">modelVersion>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.xu<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>wemall<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>v0.6.1-beta-build20190718<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"><<span class="hljs-name">packaging>jar<span class="hljs-tag"></<span class="hljs-name">packaging>
<span class="hljs-tag"><<span class="hljs-name">name>wemall<span class="hljs-tag"></<span class="hljs-name">name>
<span class="hljs-tag"><<span class="hljs-name">description>this is a wemall project<span class="hljs-tag"></<span class="hljs-name">description>
<span class="hljs-tag"><<span class="hljs-name">parent>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-parent<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>2.1.1.RELEASE<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"><<span class="hljs-name">relativePath/>
<span class="hljs-tag"></<span class="hljs-name">parent>
<span class="hljs-tag"><<span class="hljs-name">properties>
<span class="hljs-tag"><<span class="hljs-name">project.build.sourceEncoding>UTF-8<span class="hljs-tag"></<span class="hljs-name">project.build.sourceEncoding>
<span class="hljs-tag"><<span class="hljs-name">project.reporting.outputEncoding>UTF-8<span class="hljs-tag"></<span class="hljs-name">project.reporting.outputEncoding>
<span class="hljs-tag"><<span class="hljs-name">java.version>1.8<span class="hljs-tag"></<span class="hljs-name">java.version>
<span class="hljs-tag"><<span class="hljs-name">swagger-ui.version>2.9.2<span class="hljs-tag"></<span class="hljs-name">swagger-ui.version>
<span class="hljs-tag"><<span class="hljs-name">swagger2.version>2.9.2<span class="hljs-tag"></<span class="hljs-name">swagger2.version>
<span class="hljs-tag"></<span class="hljs-name">properties>
<span class="hljs-tag"><<span class="hljs-name">dependencies>
<span class="hljs-comment"><!-- spring-boot -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-web<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-thymeleaf<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- 使thymeleaf支持h5标签 -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>net.sourceforge.nekohtml<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>nekohtml<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.9.22<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- log related -->
<span class="hljs-tag"><<span class="hljs-name">dependency> <span class="hljs-comment"><!-- exclude掉spring-boot的默认log配置 -->
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--aspectj-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-aop<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-test<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">scope>test<span class="hljs-tag"></<span class="hljs-name">scope>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>junit<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>junit<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>4.12<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-comment"><!-- 表示开发的时候引入,发布的时候不会加载此包 -->
<span class="hljs-tag"><<span class="hljs-name">scope>test<span class="hljs-tag"></<span class="hljs-name">scope>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.apache.commons<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>commons-io<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.3.2<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- mybatis-plus begin -->
<span class="hljs-comment"><!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.baomidou<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>mybatis-plus-boot-starter<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>3.1.0<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.baomidou<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>mybatis-plus-generator<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>3.1.0<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--swagger2-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.springfox<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>springfox-swagger-ui<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>${swagger-ui.version}<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--排除并新增1.5swagger-annotations和swagger-models
为了解决swagger2中example注解导致的input空字符串异常错误-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.springfox<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>springfox-swagger2<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>${swagger2.version}<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"><<span class="hljs-name">exclusions>
<span class="hljs-tag"><<span class="hljs-name">exclusion>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.swagger<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>swagger-annotations<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">exclusion>
<span class="hljs-tag"><<span class="hljs-name">exclusion>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.swagger<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>swagger-models<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">exclusion>
<span class="hljs-tag"></<span class="hljs-name">exclusions>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.swagger<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>swagger-annotations<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.5.21<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.swagger<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>swagger-models<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.5.21<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- 引入Druid依赖,阿里巴巴所提供的数据源 -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.alibaba<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>druid<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.0.29<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- 提供mysql驱动 -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>mysql<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>mysql-connector-java<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>5.1.38<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.projectlombok<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>lombok<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.16.16<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--jsonwebtoken-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>io.jsonwebtoken<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>jjwt<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>0.9.1<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--jsonwebtoken-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.alibaba<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>fastjson<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.2.46<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--热部署-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>springloaded<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.2.8.RELEASE<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"><<span class="hljs-name">scope>provided<span class="hljs-tag"></<span class="hljs-name">scope>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-devtools<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">optional>true<span class="hljs-tag"></<span class="hljs-name">optional>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!--redis配置-->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-data-redis<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-comment"><!-- websocket -->
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>org.springframework.boot<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>spring-boot-starter-websocket<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>dom4j<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>dom4j<span class="hljs-tag"></<span class="hljs-name">artifactId>
<span class="hljs-tag"><<span class="hljs-name">version>1.6.1<span class="hljs-tag"></<span class="hljs-name">version>
<span class="hljs-tag"></<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">dependency>
<span class="hljs-tag"><<span class="hljs-name">groupId>com.thoughtworks.xstream<span class="hljs-tag"></<span class="hljs-name">groupId>
<span class="hljs-tag"><<span class="hljs-name">artifactId>xstream<span class="hljs-tag"></<span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>1.4.9</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.apache.commons</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>commons-lang3</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>3.3.2</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!-- alibaba的easyexcel -->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>com.alibaba</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>easyexcel</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>1.1.2-beta4</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!-- pdf实现 -->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>com.itextpdf</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>itextpdf</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>5.5.10</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!-- pdf字体包 -->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>com.itextpdf</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>itext-asian</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>5.2.0</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!-- activemq消息队列 -->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.springframework.boot</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>spring-boot-starter-activemq</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>2.0.4.RELEASE</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!--netty-->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>io.netty</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>netty-all</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>4.1.16.Final</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.mockito</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>mockito-core</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>2.0.31-beta</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"><</span><span class="hljs-name">scope>test</span><span class="hljs-tag"></</span><span class="hljs-name">scope>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!-- freemarker自定义模板,生成代码模板时候需要这个-->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.springframework.boot</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>spring-boot-starter-freemarker</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-comment"><!--redisson-->
</span><span class="hljs-tag"><</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.redisson</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>redisson</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>3.5.7</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependency>
</span><span class="hljs-tag"></</span><span class="hljs-name">dependencies>
</span><span class="hljs-tag"><</span><span class="hljs-name">build>
</span><span class="hljs-tag"><</span><span class="hljs-name">plugins>
</span><span class="hljs-tag"><</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.springframework.boot</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>spring-boot-maven-plugin</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"><</span><span class="hljs-name">includeSystemScope>true</span><span class="hljs-tag"></</span><span class="hljs-name">includeSystemScope>
</span><span class="hljs-tag"><</span><span class="hljs-name">fork>true</span><span class="hljs-tag"></</span><span class="hljs-name">fork></span><span class="hljs-comment"><!--该配置必须-->
</span><span class="hljs-tag"><</span><span class="hljs-name">executable>true</span><span class="hljs-tag"></</span><span class="hljs-name">executable>
</span><span class="hljs-tag"><</span><span class="hljs-name">excludeDevtools>false</span><span class="hljs-tag"></</span><span class="hljs-name">excludeDevtools>
</span><span class="hljs-tag"><</span><span class="hljs-name">mainClass>com.xu.wemall.wemallApplication</span><span class="hljs-tag"></</span><span class="hljs-name">mainClass>
</span><span class="hljs-tag"></</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"></</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"><</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"><</span><span class="hljs-name">groupId>org.apache.maven.plugins</span><span class="hljs-tag"></</span><span class="hljs-name">groupId>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>maven-surefire-plugin</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>2.4.2</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"><</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"><</span><span class="hljs-name">skipTests>true</span><span class="hljs-tag"></</span><span class="hljs-name">skipTests>
</span><span class="hljs-tag"></</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"></</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"><</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"><</span><span class="hljs-name">artifactId>maven-compiler-plugin</span><span class="hljs-tag"></</span><span class="hljs-name">artifactId>
</span><span class="hljs-tag"><</span><span class="hljs-name">version>3.3</span><span class="hljs-tag"></</span><span class="hljs-name">version>
</span><span class="hljs-tag"><</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"><</span><span class="hljs-name">encoding>utf-8</span><span class="hljs-tag"></</span><span class="hljs-name">encoding>
</span><span class="hljs-tag"><</span><span class="hljs-name">source>1.8</span><span class="hljs-tag"></</span><span class="hljs-name">source>
</span><span class="hljs-tag"><</span><span class="hljs-name">target>1.8</span><span class="hljs-tag"></</span><span class="hljs-name">target>
</span><span class="hljs-tag"></</span><span class="hljs-name">configuration>
</span><span class="hljs-tag"></</span><span class="hljs-name">plugin>
</span><span class="hljs-tag"></</span><span class="hljs-name">plugins>
</span><span class="hljs-tag"></</span><span class="hljs-name">build>
</span><span class="hljs-tag"></</span><span class="hljs-name">project>
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>首先,我们定义一个 微信用户POJO </p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="9">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;WxUser.java&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">WxUser.java</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="8">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.entry;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.annotation.TableName;\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\nimport lombok.EqualsAndHashCode;\nimport lombok.experimental.Accessors;\nimport org.springframework.format.annotation.DateTimeFormat;\n\nimport java.time.LocalDateTime;\n\n/**\n * &lt;p&gt;\n * \n * &lt;/p&gt;\n *\n * @author RonnieXu\n * @since 2019-12-19\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\n@Accessors(chain = true)\n@TableName(\&quot;sys_wx_user\&quot;)\n@ApiModel(value=\&quot;微信对象\&quot;, description=\&quot;微信对象\&quot;)\npublic class WxUser extends BaseEntity&lt;WxUser&gt; {\n\n private static final long serialVersionUID = 1L;\n\n @ApiModelProperty(value=\&quot;用户的标识,对当前公众号唯一\&quot;)\n private String openid;\n\n @ApiModelProperty(value=\&quot;用户的昵称\&quot;)\n private String nickname;\n\n @ApiModelProperty(value=\&quot;用户的性别,值为1时是男性,值为2时是女性,值为0时是未知\&quot;)\n private Integer sex;\n\n @ApiModelProperty(value=\&quot;用户所在城市\&quot;)\n private String city;\n\n @ApiModelProperty(value=\&quot;用户所在国家\&quot;)\n private String country;\n\n @ApiModelProperty(value=\&quot;用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,\&quot; +\n \&quot;0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。\&quot;)\n private String headimgurl;\n\n @ApiModelProperty(value=\&quot;用户所在省份\&quot;)\n private String province;\n\n @ApiModelProperty(value=\&quot;用户的语言,简体中文为zh_CN\&quot;)\n private String language;\n\n @DateTimeFormat(pattern = \&quot;yyyy-MM-dd HH:mm:ss\&quot;)\n @TableField(value = \&quot;subscribe_time\&quot;)\n @ApiModelProperty(value=\&quot;用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间\&quot;)\n private LocalDateTime subscribe_time;\n\n @ApiModelProperty(value=\&quot;只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段\&quot;)\n private String unionid;\n\n @ApiModelProperty(value=\&quot;公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注\&quot;)\n private String remark;\n\n @ApiModelProperty(value=\&quot;用户所在的分组ID(兼容旧的用户分组接口)\&quot;)\n private String groupid;\n\n @TableField(value = \&quot;tagid_list\&quot;)\n @ApiModelProperty(value=\&quot;用户被打上的标签ID列表\&quot;)\n private String tagid_list;\n\n /**\n * 返回用户关注的渠道来源,\n * ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION\n * 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,\n * ADD_SCENE_PROFILE_ LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,\n * ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他\n */\n @TableField(value = \&quot;subscribe_scene\&quot;)\n @ApiModelProperty(value=\&quot;返回用户关注的渠道来源\&quot;)\n private String subscribe_scene;\n\n @TableField(value = \&quot;qr_scene\&quot;)\n @ApiModelProperty(value=\&quot;二维码扫码场景(开发者自定义)\&quot;)\n private String qr_scene;\n\n @TableField(value = \&quot;qr_scene_str\&quot;)\n @ApiModelProperty(value=\&quot;二维码扫码场景描述(开发者自定义)\&quot;)\n private String qr_scene_str;\n\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.entry;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
/**
* <span class="hljs-tag"><<span class="hljs-name">p>
*
* <span class="hljs-tag"></<span class="hljs-name">p>
*
* @author RonnieXu
* @since 2019-12-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@TableName("sys_wx_user")
@ApiModel(value="微信对象", description="微信对象")
public class WxUser extends BaseEntity<span class="hljs-tag"><<span class="hljs-name">WxUser> {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value="用户的标识,对当前公众号唯一")
private String openid;
@ApiModelProperty(value="用户的昵称")
private String nickname;
@ApiModelProperty(value="用户的性别,值为1时是男性,值为2时是女性,值为0时是未知")
private Integer sex;
@ApiModelProperty(value="用户所在城市")
private String city;
@ApiModelProperty(value="用户所在国家")
private String country;
@ApiModelProperty(value="用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选," +
"0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。")
private String headimgurl;
@ApiModelProperty(value="用户所在省份")
private String province;
@ApiModelProperty(value="用户的语言,简体中文为zh_CN")
private String language;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@TableField(value = "subscribe_time")
@ApiModelProperty(value="用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间")
private LocalDateTime subscribe_time;
@ApiModelProperty(value="只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段")
private String unionid;
@ApiModelProperty(value="公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注")
private String remark;
@ApiModelProperty(value="用户所在的分组ID(兼容旧的用户分组接口)")
private String groupid;
@TableField(value = "tagid_list")
@ApiModelProperty(value="用户被打上的标签ID列表")
private String tagid_list;
/**
* 返回用户关注的渠道来源,
* ADD_SCENE_SEARCH 公众号搜索,ADD_SCENE_ACCOUNT_MIGRATION
* 公众号迁移,ADD_SCENE_PROFILE_CARD 名片分享,ADD_SCENE_QR_CODE 扫描二维码,
* ADD_SCENE_PROFILE_ LINK 图文页内名称点击,ADD_SCENE_PROFILE_ITEM 图文页右上角菜单,
* ADD_SCENE_PAID 支付后关注,ADD_SCENE_OTHERS 其他
*/
@TableField(value = "subscribe_scene")
@ApiModelProperty(value="返回用户关注的渠道来源")
private String subscribe_scene;
@TableField(value = "qr_scene")
@ApiModelProperty(value="二维码扫码场景(开发者自定义)")
private String qr_scene;
@TableField(value = "qr_scene_str")
@ApiModelProperty(value="二维码扫码场景描述(开发者自定义)")
private String qr_scene_str;
}
</span></span></span></span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="7"><img class="has cke_widget_element lazyload" alt="" width="1200" height="877" src="https://img-blog.csdnimg.cn/20191229050547750.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20191229050547750.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;877&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20191229050547750.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="6">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;定义一个component&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">定义一个component</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="5">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;WeiXinUserUtil.java&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">WeiXinUserUtil.java</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="4">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.components.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.constants.URIConstant;\nimport com.xu.wemall.entry.WxUser;\nimport com.xu.wemall.pojo.menu.Button;\nimport com.xu.wemall.pojo.menu.ComplexButton;\nimport com.xu.wemall.pojo.menu.Menu;\nimport com.xu.wemall.pojo.menu.ViewButton;\nimport com.xu.wemall.service.IWxUserService;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Component;\nimport org.springframework.web.client.RestTemplate;\n\n@Slf4j\n@Component\npublic class WeiXinUserUtil {\n\n @Autowired\n private IWxUserService iWxUserService;\n\n @Autowired\n private RestTemplate restTemplate;\n\n @Autowired\n private AccessTokenUtil accessTokenUtil;\n\n public JSONObject handdleWeixinUserInfo(String openId){\n\n String accessToken = accessTokenUtil.getAccessToken();\n if(accessToken != null){\n log.info(\&quot;URL{}\&quot;,URIConstant.OPENID_USERINFO_URL);\n String url = URIConstant.OPENID_USERINFO_URL.replace(\&quot;ACCESS_TOKEN\&quot;, accessToken)\n .replace(\&quot;OPENID\&quot;,openId);\n log.info(\&quot;OPENID_USERINFO_URL:{}\&quot;,url);\n\n //发起POST请求创建菜单\n JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);\n\n //表示订阅了该公众号\n if(jsonObject.getIntValue(\&quot;subscribe\&quot;) == 1){\n //保存\n WxUser wxUser = JSONObject.parseObject(jsonObject.toJSONString(),WxUser.class);\n boolean result = iWxUserService.saveOrUpdate(wxUser);\n }\n\n return jsonObject;\n }\n return null;\n }\n\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.components.weixin;
import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.constants.URIConstant;
import com.xu.wemall.entry.WxUser;
import com.xu.wemall.pojo.menu.Button;
import com.xu.wemall.pojo.menu.ComplexButton;
import com.xu.wemall.pojo.menu.Menu;
import com.xu.wemall.pojo.menu.ViewButton;
import com.xu.wemall.service.IWxUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
@Slf4j
@Component
public class WeiXinUserUtil {
@Autowired
private IWxUserService iWxUserService;
@Autowired
private RestTemplate restTemplate;
@Autowired
private AccessTokenUtil accessTokenUtil;
public JSONObject handdleWeixinUserInfo(String openId){
String accessToken = accessTokenUtil.getAccessToken();
if(accessToken != null){
log.info("URL{}",URIConstant.OPENID_USERINFO_URL);
String url = URIConstant.OPENID_USERINFO_URL.replace("ACCESS_TOKEN", accessToken)
.replace("OPENID",openId);
log.info("OPENID_USERINFO_URL:{}",url);
//发起POST请求创建菜单
JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);
//表示订阅了该公众号
if(jsonObject.getIntValue("subscribe") == 1){
//保存
WxUser wxUser = JSONObject.parseObject(jsonObject.toJSONString(),WxUser.class);
boolean result = iWxUserService.saveOrUpdate(wxUser);
}
return jsonObject;
}
return null;
}
}
</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="3"><img class="has cke_widget_element lazyload" alt="" width="1200" height="863" src="https://img-blog.csdnimg.cn/20191229050849676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20191229050849676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;863&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20191229050849676.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<p>最后看看我们的controller中代码,如果我们调用成功就可以获取到用户的相关信息,我们就持续化到自己数据库</p>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="2">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;WeiXinController.java&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">WeiXinController.java</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<div class="cke_widget_wrapper cke_widget_block cke_widget_codeSnippet cke_widget_wrapper_has cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="代码段" data-cke-widget-id="1">
<pre class="has cke_widget_element" data-cke-widget-data="{&quot;lang&quot;:&quot;html&quot;,&quot;code&quot;:&quot;package com.xu.wemall.controller.weixin;\n\nimport com.alibaba.fastjson.JSONObject;\nimport com.xu.wemall.commons.utils.CheckUtil;\nimport com.xu.wemall.commons.utils.UploadUtil;\nimport com.xu.wemall.components.weixin.MessageUtil;\nimport com.xu.wemall.components.weixin.WeiXinUserUtil;\nimport io.swagger.annotations.Api;\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestMethod;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.PrintWriter;\nimport java.util.Map;\n\n/**\n * 类名称: LoginController\n * 类描述: 与微信对接登陆验证\n *\n * @author yuanjun\n * 创建时间:2017年12月5日上午10:52:13\n */\n@Slf4j\n@RestController\n@Api(tags = \&quot;接入验证接口\&quot;)\n@RequestMapping(value = \&quot;/weChart\&quot;)\npublic class WeiXinController {\n\n @Autowired\n private WeiXinUserUtil weiXinUserUtil;\n\n @Autowired\n private UploadUtil uploadUtil;\n\n @Autowired\n private MessageUtil messageUtil;\n\n @RequestMapping(value = \&quot;/connect\&quot;, method = RequestMethod.GET)\n public String connect(@RequestParam(value = \&quot;signature\&quot;) String signature,\n @RequestParam(value = \&quot;timestamp\&quot;) String timestamp,\n @RequestParam(value = \&quot;nonce\&quot;) String nonce,\n @RequestParam(value = \&quot;echostr\&quot;) String echostr) {\n\n log.info(\&quot;-----开始校验签名-----\&quot;);\n PrintWriter out = null;\n if (CheckUtil.checkSignature(signature, timestamp, nonce)) {\n log.info(\&quot;-----签名校验通过-----\&quot;);\n return echostr;\n } else {\n log.info(\&quot;-----校验签名失败-----\&quot;);\n return null;\n }\n\n }\n\n @RequestMapping(value = \&quot;connect\&quot;, method = RequestMethod.POST)\n public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {\n\n response.setCharacterEncoding(\&quot;utf-8\&quot;);\n\n //将微信请求xml转为map格式,获取所需的参数\n Map&lt;String, String&gt; map = MessageUtil.parseXml(request);\n String ToUserName = map.get(\&quot;ToUserName\&quot;);\n String FromUserName = map.get(\&quot;FromUserName\&quot;);\n String MsgType = map.get(\&quot;MsgType\&quot;);\n String Content = map.get(\&quot;Content\&quot;);\n String Event = map.get(\&quot;Event\&quot;);\n\n if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)){\n\n if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(Event)){\n String xmlString = messageUtil.subscribeForText(ToUserName,FromUserName);\n\n //关注了公众号,调用接口获得用户的详细信息并保存到后台\n JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);\n log.info(\&quot;获取用户的详细信息:{}\&quot;,jsonObject.toJSONString());\n\n return xmlString;\n\n }else if(MessageUtil.EVENT_TYPE_UNSUBSCRIBE.equals(Event)){\n\n String xmlString = messageUtil.unsubscribeForText(ToUserName,FromUserName);\n return xmlString;\n\n }\n\n }\n\n //处理文本类型,实现输入1,回复相应的封装的内容\n if (MessageUtil.REQ_MESSAGE_TYPE_TEXT.equals(MsgType)) {\n String xmlString = messageUtil.replyForText(ToUserName,FromUserName,\&quot;你发送的是:\&quot; + Content);\n log.info(xmlString);\n return xmlString;\n\n }\n\n if (MessageUtil.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {\n\n String filePath = \&quot;C:\\\\Users\\\\RonnieXu\\\\Pictures\\\\2.jpg\&quot;;\n String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);\n return xmlString;\n }\n\n return null;\n }\n\n}\n&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="language-html hljs">package com.xu.wemall.controller.weixin;
import com.alibaba.fastjson.JSONObject;
import com.xu.wemall.commons.utils.CheckUtil;
import com.xu.wemall.commons.utils.UploadUtil;
import com.xu.wemall.components.weixin.MessageUtil;
import com.xu.wemall.components.weixin.WeiXinUserUtil;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Map;
/**
* 类名称: LoginController
* 类描述: 与微信对接登陆验证
*
* @author yuanjun
* 创建时间:2017年12月5日上午10:52:13
*/
@Slf4j
@RestController
@Api(tags = "接入验证接口")
@RequestMapping(value = "/weChart")
public class WeiXinController {
@Autowired
private WeiXinUserUtil weiXinUserUtil;
@Autowired
private UploadUtil uploadUtil;
@Autowired
private MessageUtil messageUtil;
@RequestMapping(value = "/connect", method = RequestMethod.GET)
public String connect(@RequestParam(value = "signature") String signature,
@RequestParam(value = "timestamp") String timestamp,
@RequestParam(value = "nonce") String nonce,
@RequestParam(value = "echostr") String echostr) {
log.info("-----开始校验签名-----");
PrintWriter out = null;
if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
log.info("-----签名校验通过-----");
return echostr;
} else {
log.info("-----校验签名失败-----");
return null;
}
}
@RequestMapping(value = "connect", method = RequestMethod.POST)
public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setCharacterEncoding("utf-8");
//将微信请求xml转为map格式,获取所需的参数
Map<span class="hljs-tag"><<span class="hljs-name">String, <span class="hljs-attr">String> map = MessageUtil.parseXml(request);
String ToUserName = map.get("ToUserName");
String FromUserName = map.get("FromUserName");
String MsgType = map.get("MsgType");
String Content = map.get("Content");
String Event = map.get("Event");
if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)){
if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(Event)){
String xmlString = messageUtil.subscribeForText(ToUserName,FromUserName);
//关注了公众号,调用接口获得用户的详细信息并保存到后台
JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);
log.info("获取用户的详细信息:{}",jsonObject.toJSONString());
return xmlString;
}else if(MessageUtil.EVENT_TYPE_UNSUBSCRIBE.equals(Event)){
String xmlString = messageUtil.unsubscribeForText(ToUserName,FromUserName);
return xmlString;
}
}
//处理文本类型,实现输入1,回复相应的封装的内容
if (MessageUtil.REQ_MESSAGE_TYPE_TEXT.equals(MsgType)) {
String xmlString = messageUtil.replyForText(ToUserName,FromUserName,"你发送的是:" + Content);
log.info(xmlString);
return xmlString;
}
if (MessageUtil.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {
String filePath = "C:\\Users\\RonnieXu\\Pictures\\2.jpg";
String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);
return xmlString;
}
return null;
}
}
</span></span></span></code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>当有用户关注该公众号的时候,我们就能利用接口获取用户信息了,</p>
<p><span class="cke_widget_wrapper cke_widget_inline cke_widget_image cke_image_nocaption cke_widget_selected" data-cke-widget-wrapper="1" data-cke-filter="off" data-cke-display-name="图像" data-cke-widget-id="0"><img class="has cke_widget_element lazyload" alt="" width="1200" height="550" src="https://img-blog.csdnimg.cn/20191229051559696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70" data-cke-widget-data="{&quot;hasCaption&quot;:false,&quot;src&quot;:&quot;https://img-blog.csdnimg.cn/20191229051559696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70&quot;,&quot;alt&quot;:&quot;&quot;,&quot;width&quot;:&quot;1200&quot;,&quot;height&quot;:&quot;550&quot;,&quot;lock&quot;:true,&quot;align&quot;:&quot;none&quot;,&quot;classes&quot;:{&quot;has&quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="image" data-src="https://img-blog.csdnimg.cn/20191229051559696.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTM1MjEyMjA=,size_16,color_FFFFFF,t_70"><span class="cke_reset cke_widget_drag_handler_container"><img class="cke_reset cke_widget_drag_handler lazyload" title="点击并拖拽以移动" alt="" width="15" height="15" data-cke-widget-drag-handler="1" data-src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="><span class="cke_image_resizer" title="点击并拖拽以改变尺寸"></span></span></span></p>
<p>获取用户的信息就到这里了,其他相关的内容请参考微信公众号开发文档获取更多的内容,谢谢各位客官捧场。</p><br><br>
来源:https://www.cnblogs.com/xulijun137/p/12213476.html
頁:
[1]