骄阳如火 發表於 2020-1-19 14:14:00

微信公众号开发之获取用户列表和用户基本信息(五)

<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="{&amp;quot;code&amp;quot;:&amp;quot;http请求方式: GET(请使用https协议)\nhttps://api.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&amp;amp;next_openid=NEXT_OPENID\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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&amp;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="{&amp;quot;code&amp;quot;:&amp;quot;{\n    \&amp;quot;total\&amp;quot;:2,\n    \&amp;quot;count\&amp;quot;:2,\n    \&amp;quot;data\&amp;quot;:{\n    \&amp;quot;openid\&amp;quot;:[\&amp;quot;OPENID1\&amp;quot;,\&amp;quot;OPENID2\&amp;quot;]},\n    \&amp;quot;next_openid\&amp;quot;:\&amp;quot;NEXT_OPENID\&amp;quot;\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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>&nbsp;我们定义一个方法获取用户列表</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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;835&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;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(\&amp;quot;URL{}\&amp;quot;,URIConstant.USER_LIST_URL);\n            String url = URIConstant.USER_LIST_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken);\n\n            if(nextOpenid != null){\n                url = URIConstant.USER_LIST_URL + \&amp;quot;&amp;amp;next_openid=\&amp;quot;+ nextOpenid;\n            }\n            log.info(\&amp;quot;USER_LIST_URL:{}\&amp;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&amp;quot;,&amp;quot;classes&amp;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 + "&amp;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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;730&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;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 = \&amp;quot;微信用户接口\&amp;quot;)\n@RequestMapping(value = \&amp;quot;/wxuser\&amp;quot;)\npublic class WxUserController {\n\n    @Autowired\n    private WxUserUtil wxUserUtil;\n\n    @Autowired\n    private RestTemplate restTemplate;\n\n    @ApiIgnore\n    @RequestMapping(value=\&amp;quot;/login\&amp;quot;, method = RequestMethod.GET)\n    public void wxLogin(HttpServletResponse response) throws IOException {\n      //请求获取code的回调地址\n      //用线上环境的域名或者用内网穿透,不能用ip\n      String callBack = \&amp;quot;http://jialeyuan.nat300.top/wxAuth/callBack\&amp;quot;;\n\n      //请求地址\n      String url = \&amp;quot;https://open.weixin.qq.com/connect/oauth2/authorize\&amp;quot; +\n                \&amp;quot;?appid=\&amp;quot; + WXConstant.TEST_APPID +\n                \&amp;quot;&amp;amp;redirect_uri=\&amp;quot; + URLEncoder.encode(callBack,\&amp;quot;utf-8\&amp;quot;) +\n                \&amp;quot;&amp;amp;response_type=code\&amp;quot; +\n                \&amp;quot;&amp;amp;scope=snsapi_userinfo\&amp;quot; +\n                \&amp;quot;&amp;amp;state=STATE#wechat_redirect\&amp;quot;;\n      //重定向\n      response.sendRedirect(url);\n    }\n\n    // 回调方法\n    @ApiIgnore\n    @RequestMapping(value =\&amp;quot;/callBack\&amp;quot;, method = RequestMethod.GET)\n    public void wxCallBack(HttpServletRequest request,HttpServletResponse response) throws IOException {\n      String code = request.getParameter(\&amp;quot;code\&amp;quot;);\n\n      //获取access_token\n      String url = \&amp;quot;https://api.weixin.qq.com/sns/oauth2/access_token\&amp;quot; +\n                \&amp;quot;?appid=\&amp;quot; + WXConstant.TEST_APPID +\n                \&amp;quot;&amp;amp;secret=\&amp;quot; + WXConstant.TEST_APPSECRET +\n                \&amp;quot;&amp;amp;code=\&amp;quot; + code +\n                \&amp;quot;&amp;amp;grant_type=authorization_code\&amp;quot;;\n\n      String result = restTemplate.getForObject(url, String.class);\n\n      System.out.println(\&amp;quot;请求获取access_token:\&amp;quot; + result);\n      //返回结果的json对象\n      JSONObject resultObject = JSON.parseObject(result);\n\n      //请求获取userInfo\n      String infoUrl = \&amp;quot;https://api.weixin.qq.com/sns/userinfo\&amp;quot; +\n                \&amp;quot;?access_token=\&amp;quot; + resultObject.getString(\&amp;quot;access_token\&amp;quot;) +\n                \&amp;quot;&amp;amp;openid=\&amp;quot; + resultObject.getString(\&amp;quot;openid\&amp;quot;) +\n                \&amp;quot;&amp;amp;lang=zh_CN\&amp;quot;;\n\n      String resultInfo = restTemplate.getForObject(infoUrl, String.class);\n\n      //此时已获取到userInfo,再根据业务进行处理\n      log.info(\&amp;quot;请求获取userInfo:{}\&amp;quot;, resultInfo);\n\n    }\n\n    /**\n   * 获取关注公众号的用户列表\n   */\n    @ApiOperation(value = \&amp;quot;获取关注公众号的用户列表\&amp;quot;)\n    @RequestMapping(value = \&amp;quot;/getUserList\&amp;quot;, method = RequestMethod.GET)\n    @ApiImplicitParams({\n            @ApiImplicitParam(name=\&amp;quot;nextOpenid\&amp;quot;,value=\&amp;quot;第一个拉取的OPENID,不填默认从头开始拉取\&amp;quot;, paramType=\&amp;quot;query\&amp;quot;,dataType=\&amp;quot;String\&amp;quot;),\n    })\n    public JSONObject getUserList(String nextOpenid) {\n\n      JSONObject result = wxUserUtil.getUserList(nextOpenid);\n      log.info(\&amp;quot;user_list:{}\&amp;quot;, result.toJSONString());\n      return result;\n\n    }\n\n}\n&amp;quot;,&amp;quot;classes&amp;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 +
                "&amp;redirect_uri=" + URLEncoder.encode(callBack,"utf-8") +
                "&amp;response_type=code" +
                "&amp;scope=snsapi_userinfo" +
                "&amp;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 +
                "&amp;secret=" + WXConstant.TEST_APPSECRET +
                "&amp;code=" + code +
                "&amp;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") +
                "&amp;openid=" + resultObject.getString("openid") +
                "&amp;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>&nbsp;<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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;701&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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>&nbsp;</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="{&amp;quot;code&amp;quot;:&amp;quot;接口调用请求说明\nhttp请求方式: GET\nhttps://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&amp;amp;openid=OPENID&amp;amp;lang=zh_CN&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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&amp;openid=OPENID&amp;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>&nbsp;</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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;863&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;code&amp;quot;:&amp;quot;{\n &nbsp; &nbsp;\&amp;quot;subscribe\&amp;quot;: 1, \n &nbsp; &nbsp;\&amp;quot;openid\&amp;quot;: \&amp;quot;o6_bmjrPTlm6_2sgVt7hMZOPfL2M\&amp;quot;, \n &nbsp; &nbsp;\&amp;quot;nickname\&amp;quot;: \&amp;quot;Band\&amp;quot;, \n &nbsp; &nbsp;\&amp;quot;sex\&amp;quot;: 1, \n &nbsp; &nbsp;\&amp;quot;language\&amp;quot;: \&amp;quot;zh_CN\&amp;quot;, \n &nbsp; &nbsp;\&amp;quot;city\&amp;quot;: \&amp;quot;广州\&amp;quot;, \n &nbsp; &nbsp;\&amp;quot;province\&amp;quot;: \&amp;quot;广东\&amp;quot;, \n &nbsp; &nbsp;\&amp;quot;country\&amp;quot;: \&amp;quot;中国\&amp;quot;, \n    \&amp;quot;headimgurl\&amp;quot;:\&amp;quot;http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0\&amp;quot;,\n    \&amp;quot;subscribe_time\&amp;quot;: 1382694957,\n &nbsp;\&amp;quot;unionid\&amp;quot;: \&amp;quot; o6_bmasdasdsad6_2sgVt7hMZOPfL\&amp;quot;\n &nbsp;\&amp;quot;remark\&amp;quot;: \&amp;quot;\&amp;quot;,\n    \&amp;quot;groupid\&amp;quot;: 0,\n    \&amp;quot;tagid_list\&amp;quot;:,\n    \&amp;quot;subscribe_scene\&amp;quot;: \&amp;quot;ADD_SCENE_QR_CODE\&amp;quot;,\n    \&amp;quot;qr_scene\&amp;quot;: 98765,\n    \&amp;quot;qr_scene_str\&amp;quot;: \&amp;quot;\&amp;quot;\n}&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;quot;:1}}" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet"><code class="hljs">{
&nbsp; &nbsp;"subscribe": 1,
&nbsp; &nbsp;"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M",
&nbsp; &nbsp;"nickname": "Band",
&nbsp; &nbsp;"sex": 1,
&nbsp; &nbsp;"language": "zh_CN",
&nbsp; &nbsp;"city": "广州",
&nbsp; &nbsp;"province": "广东",
&nbsp; &nbsp;"country": "中国",
    "headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "subscribe_time": 1382694957,
&nbsp;"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
&nbsp;"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>&nbsp;</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>这里先贴出所有的依赖&nbsp;&nbsp;</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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;pom.xml&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;&amp;lt;?xml version=\&amp;quot;1.0\&amp;quot; encoding=\&amp;quot;UTF-8\&amp;quot;?&amp;gt;\n&amp;lt;project xmlns=\&amp;quot;http://maven.apache.org/POM/4.0.0\&amp;quot; xmlns:xsi=\&amp;quot;http://www.w3.org/2001/XMLSchema-instance\&amp;quot;\n         xsi:schemaLocation=\&amp;quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd\&amp;quot;&amp;gt;\n    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;\n\n    &amp;lt;groupId&amp;gt;com.xu&amp;lt;/groupId&amp;gt;\n    &amp;lt;artifactId&amp;gt;wemall&amp;lt;/artifactId&amp;gt;\n    &amp;lt;version&amp;gt;v0.6.1-beta-build20190718&amp;lt;/version&amp;gt;\n    &amp;lt;packaging&amp;gt;jar&amp;lt;/packaging&amp;gt;\n\n    &amp;lt;name&amp;gt;wemall&amp;lt;/name&amp;gt;\n    &amp;lt;description&amp;gt;this is a wemall project&amp;lt;/description&amp;gt;\n\n    &amp;lt;parent&amp;gt;\n      &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n      &amp;lt;artifactId&amp;gt;spring-boot-starter-parent&amp;lt;/artifactId&amp;gt;\n      &amp;lt;version&amp;gt;2.1.1.RELEASE&amp;lt;/version&amp;gt;\n      &amp;lt;relativePath/&amp;gt;\n    &amp;lt;/parent&amp;gt;\n\n    &amp;lt;properties&amp;gt;\n      &amp;lt;project.build.sourceEncoding&amp;gt;UTF-8&amp;lt;/project.build.sourceEncoding&amp;gt;\n      &amp;lt;project.reporting.outputEncoding&amp;gt;UTF-8&amp;lt;/project.reporting.outputEncoding&amp;gt;\n      &amp;lt;java.version&amp;gt;1.8&amp;lt;/java.version&amp;gt;\n      &amp;lt;swagger-ui.version&amp;gt;2.9.2&amp;lt;/swagger-ui.version&amp;gt;\n      &amp;lt;swagger2.version&amp;gt;2.9.2&amp;lt;/swagger2.version&amp;gt;\n    &amp;lt;/properties&amp;gt;\n\n    &amp;lt;dependencies&amp;gt;\n      &amp;lt;!-- spring-boot --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-web&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-thymeleaf&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- 使thymeleaf支持h5标签 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;net.sourceforge.nekohtml&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;nekohtml&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.9.22&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- log related --&amp;gt;\n      &amp;lt;dependency&amp;gt; &amp;lt;!-- exclude掉spring-boot的默认log配置 --&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--aspectj--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-aop&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-test&amp;lt;/artifactId&amp;gt;\n            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;junit&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;junit&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;4.12&amp;lt;/version&amp;gt;\n            &amp;lt;!-- 表示开发的时候引入,发布的时候不会加载此包 --&amp;gt;\n            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;commons-io&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.3.2&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- mybatis-plus begin --&amp;gt;\n      &amp;lt;!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;mybatis-plus-boot-starter&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.baomidou&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;mybatis-plus-generator&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;3.1.0&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--swagger2--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;springfox-swagger-ui&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;${swagger-ui.version}&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--排除并新增1.5swagger-annotations和swagger-models\n            为了解决swagger2中example注解导致的input空字符串异常错误--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.springfox&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;springfox-swagger2&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;${swagger2.version}&amp;lt;/version&amp;gt;\n            &amp;lt;exclusions&amp;gt;\n                &amp;lt;exclusion&amp;gt;\n                  &amp;lt;groupId&amp;gt;io.swagger&amp;lt;/groupId&amp;gt;\n                  &amp;lt;artifactId&amp;gt;swagger-annotations&amp;lt;/artifactId&amp;gt;\n                &amp;lt;/exclusion&amp;gt;\n                &amp;lt;exclusion&amp;gt;\n                  &amp;lt;groupId&amp;gt;io.swagger&amp;lt;/groupId&amp;gt;\n                  &amp;lt;artifactId&amp;gt;swagger-models&amp;lt;/artifactId&amp;gt;\n                &amp;lt;/exclusion&amp;gt;\n            &amp;lt;/exclusions&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.swagger&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;swagger-annotations&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.5.21&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.swagger&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;swagger-models&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.5.21&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- 引入Druid依赖,阿里巴巴所提供的数据源 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;druid&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.0.29&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- 提供mysql驱动 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;mysql&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;mysql-connector-java&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;5.1.38&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.projectlombok&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;lombok&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.16.16&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--jsonwebtoken--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.jsonwebtoken&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;jjwt&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;0.9.1&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n      &amp;lt;!--jsonwebtoken--&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;fastjson&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.2.46&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--热部署--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;springloaded&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.2.8.RELEASE&amp;lt;/version&amp;gt;\n            &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-devtools&amp;lt;/artifactId&amp;gt;\n            &amp;lt;optional&amp;gt;true&amp;lt;/optional&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--redis配置--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-data-redis&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- websocket --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-websocket&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;dom4j&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;dom4j&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.6.1&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.thoughtworks.xstream&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;xstream&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.4.9&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.apache.commons&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;commons-lang3&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;3.3.2&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- alibaba的easyexcel --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.alibaba&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;easyexcel&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;1.1.2-beta4&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- pdf实现 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;itextpdf&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;5.5.10&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- pdf字体包 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;com.itextpdf&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;itext-asian&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;5.2.0&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- activemq消息队列 --&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-activemq&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;2.0.4.RELEASE&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--netty--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;io.netty&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;netty-all&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;4.1.16.Final&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.mockito&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;mockito-core&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;2.0.31-beta&amp;lt;/version&amp;gt;\n            &amp;lt;scope&amp;gt;test&amp;lt;/scope&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!-- freemarker自定义模板,生成代码模板时候需要这个--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;spring-boot-starter-freemarker&amp;lt;/artifactId&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n      &amp;lt;!--redisson--&amp;gt;\n      &amp;lt;dependency&amp;gt;\n            &amp;lt;groupId&amp;gt;org.redisson&amp;lt;/groupId&amp;gt;\n            &amp;lt;artifactId&amp;gt;redisson&amp;lt;/artifactId&amp;gt;\n            &amp;lt;version&amp;gt;3.5.7&amp;lt;/version&amp;gt;\n      &amp;lt;/dependency&amp;gt;\n\n    &amp;lt;/dependencies&amp;gt;\n\n    &amp;lt;build&amp;gt;\n      &amp;lt;plugins&amp;gt;\n            &amp;lt;plugin&amp;gt;\n                &amp;lt;groupId&amp;gt;org.springframework.boot&amp;lt;/groupId&amp;gt;\n                &amp;lt;artifactId&amp;gt;spring-boot-maven-plugin&amp;lt;/artifactId&amp;gt;\n                &amp;lt;configuration&amp;gt;\n                  &amp;lt;includeSystemScope&amp;gt;true&amp;lt;/includeSystemScope&amp;gt;\n                  &amp;lt;fork&amp;gt;true&amp;lt;/fork&amp;gt;&amp;lt;!--该配置必须--&amp;gt;\n                  &amp;lt;executable&amp;gt;true&amp;lt;/executable&amp;gt;\n                  &amp;lt;excludeDevtools&amp;gt;false&amp;lt;/excludeDevtools&amp;gt;\n                  &amp;lt;mainClass&amp;gt;com.xu.wemall.wemallApplication&amp;lt;/mainClass&amp;gt;\n                &amp;lt;/configuration&amp;gt;\n            &amp;lt;/plugin&amp;gt;\n\n            &amp;lt;plugin&amp;gt;\n                &amp;lt;groupId&amp;gt;org.apache.maven.plugins&amp;lt;/groupId&amp;gt;\n                &amp;lt;artifactId&amp;gt;maven-surefire-plugin&amp;lt;/artifactId&amp;gt;\n                &amp;lt;version&amp;gt;2.4.2&amp;lt;/version&amp;gt;\n                &amp;lt;configuration&amp;gt;\n                  &amp;lt;skipTests&amp;gt;true&amp;lt;/skipTests&amp;gt;\n                &amp;lt;/configuration&amp;gt;\n            &amp;lt;/plugin&amp;gt;\n\n            &amp;lt;plugin&amp;gt;\n                &amp;lt;artifactId&amp;gt;maven-compiler-plugin&amp;lt;/artifactId&amp;gt;\n                &amp;lt;version&amp;gt;3.3&amp;lt;/version&amp;gt;\n                &amp;lt;configuration&amp;gt;\n                  &amp;lt;encoding&amp;gt;utf-8&amp;lt;/encoding&amp;gt;\n                  &amp;lt;source&amp;gt;1.8&amp;lt;/source&amp;gt;\n                  &amp;lt;target&amp;gt;1.8&amp;lt;/target&amp;gt;\n                &amp;lt;/configuration&amp;gt;\n            &amp;lt;/plugin&amp;gt;\n\n      &amp;lt;/plugins&amp;gt;\n    &amp;lt;/build&amp;gt;\n\n&amp;lt;/project&amp;gt;\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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">&lt;?xml version=<span class="hljs-string">"1.0" encoding=<span class="hljs-string">"UTF-8"<span class="hljs-meta">?&gt;
<span class="hljs-tag">&lt;<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"&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">modelVersion&gt;4.0.0<span class="hljs-tag">&lt;/<span class="hljs-name">modelVersion&gt;

    <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.xu<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;wemall<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;v0.6.1-beta-build20190718<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">packaging&gt;jar<span class="hljs-tag">&lt;/<span class="hljs-name">packaging&gt;

    <span class="hljs-tag">&lt;<span class="hljs-name">name&gt;wemall<span class="hljs-tag">&lt;/<span class="hljs-name">name&gt;
    <span class="hljs-tag">&lt;<span class="hljs-name">description&gt;this is a wemall project<span class="hljs-tag">&lt;/<span class="hljs-name">description&gt;

    <span class="hljs-tag">&lt;<span class="hljs-name">parent&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-parent<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;2.1.1.RELEASE<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">relativePath/&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">parent&gt;

    <span class="hljs-tag">&lt;<span class="hljs-name">properties&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">project.build.sourceEncoding&gt;UTF-8<span class="hljs-tag">&lt;/<span class="hljs-name">project.build.sourceEncoding&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">project.reporting.outputEncoding&gt;UTF-8<span class="hljs-tag">&lt;/<span class="hljs-name">project.reporting.outputEncoding&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">java.version&gt;1.8<span class="hljs-tag">&lt;/<span class="hljs-name">java.version&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">swagger-ui.version&gt;2.9.2<span class="hljs-tag">&lt;/<span class="hljs-name">swagger-ui.version&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">swagger2.version&gt;2.9.2<span class="hljs-tag">&lt;/<span class="hljs-name">swagger2.version&gt;
    <span class="hljs-tag">&lt;/<span class="hljs-name">properties&gt;

    <span class="hljs-tag">&lt;<span class="hljs-name">dependencies&gt;
      <span class="hljs-comment">&lt;!-- spring-boot --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-web<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-thymeleaf<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- 使thymeleaf支持h5标签 --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;net.sourceforge.nekohtml<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;nekohtml<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.9.22<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- log related --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt; <span class="hljs-comment">&lt;!-- exclude掉spring-boot的默认log配置 --&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--aspectj--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-aop<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-test<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">scope&gt;test<span class="hljs-tag">&lt;/<span class="hljs-name">scope&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;junit<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;junit<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;4.12<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
            <span class="hljs-comment">&lt;!-- 表示开发的时候引入,发布的时候不会加载此包 --&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">scope&gt;test<span class="hljs-tag">&lt;/<span class="hljs-name">scope&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.apache.commons<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;commons-io<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.3.2<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- mybatis-plus begin --&gt;
      <span class="hljs-comment">&lt;!--mybatis-plus自动的维护了mybatis以及mybatis-spring的依赖,在springboot中这三者不能同时的出现,避免版本的冲突,表示:跳进过这个坑--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.baomidou<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;mybatis-plus-boot-starter<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;3.1.0<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-generator --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.baomidou<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;mybatis-plus-generator<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;3.1.0<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--swagger2--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.springfox<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;springfox-swagger-ui<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;${swagger-ui.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--排除并新增1.5swagger-annotations和swagger-models
            为了解决swagger2中example注解导致的input空字符串异常错误--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.springfox<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;springfox-swagger2<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;${swagger2.version}<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">exclusions&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">exclusion&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.swagger<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;swagger-annotations<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
                <span class="hljs-tag">&lt;/<span class="hljs-name">exclusion&gt;
                <span class="hljs-tag">&lt;<span class="hljs-name">exclusion&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.swagger<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
                  <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;swagger-models<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
                <span class="hljs-tag">&lt;/<span class="hljs-name">exclusion&gt;
            <span class="hljs-tag">&lt;/<span class="hljs-name">exclusions&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.swagger<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;swagger-annotations<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.5.21<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.swagger<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;swagger-models<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.5.21<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- 引入Druid依赖,阿里巴巴所提供的数据源 --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.alibaba<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;druid<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.0.29<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- 提供mysql驱动 --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;mysql<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;mysql-connector-java<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;5.1.38<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.projectlombok<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;lombok<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.16.16<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--jsonwebtoken--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;io.jsonwebtoken<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;jjwt<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;0.9.1<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;
      <span class="hljs-comment">&lt;!--jsonwebtoken--&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.alibaba<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;fastjson<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.2.46<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--热部署--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;springloaded<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.2.8.RELEASE<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">scope&gt;provided<span class="hljs-tag">&lt;/<span class="hljs-name">scope&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-devtools<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">optional&gt;true<span class="hljs-tag">&lt;/<span class="hljs-name">optional&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!--redis配置--&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-data-redis<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-comment">&lt;!-- websocket --&gt;
      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;org.springframework.boot<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;spring-boot-starter-websocket<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;dom4j<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;dom4j<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">version&gt;1.6.1<span class="hljs-tag">&lt;/<span class="hljs-name">version&gt;
      <span class="hljs-tag">&lt;/<span class="hljs-name">dependency&gt;

      <span class="hljs-tag">&lt;<span class="hljs-name">dependency&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">groupId&gt;com.thoughtworks.xstream<span class="hljs-tag">&lt;/<span class="hljs-name">groupId&gt;
            <span class="hljs-tag">&lt;<span class="hljs-name">artifactId&gt;xstream<span class="hljs-tag">&lt;/<span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;1.4.9</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.apache.commons</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;commons-lang3</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;3.3.2</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!-- alibaba的easyexcel --&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;com.alibaba</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;easyexcel</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;1.1.2-beta4</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!-- pdf实现 --&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;com.itextpdf</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;itextpdf</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;5.5.10</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!-- pdf字体包 --&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;com.itextpdf</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;itext-asian</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;5.2.0</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!-- activemq消息队列 --&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.springframework.boot</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;spring-boot-starter-activemq</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;2.0.4.RELEASE</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!--netty--&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;io.netty</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;netty-all</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;4.1.16.Final</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.mockito</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;mockito-core</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;2.0.31-beta</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">scope&gt;test</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">scope&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!-- freemarker自定义模板,生成代码模板时候需要这个--&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.springframework.boot</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;spring-boot-starter-freemarker</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

      </span><span class="hljs-comment">&lt;!--redisson--&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">dependency&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.redisson</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;redisson</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;3.5.7</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependency&gt;

    </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">dependencies&gt;

    </span><span class="hljs-tag">&lt;</span><span class="hljs-name">build&gt;
      </span><span class="hljs-tag">&lt;</span><span class="hljs-name">plugins&gt;
            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">plugin&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.springframework.boot</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;spring-boot-maven-plugin</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">configuration&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">includeSystemScope&gt;true</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">includeSystemScope&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">fork&gt;true</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">fork&gt;</span><span class="hljs-comment">&lt;!--该配置必须--&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">executable&gt;true</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">executable&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">excludeDevtools&gt;false</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">excludeDevtools&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">mainClass&gt;com.xu.wemall.wemallApplication</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">mainClass&gt;
                </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">configuration&gt;
            </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">plugin&gt;

            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">plugin&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">groupId&gt;org.apache.maven.plugins</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">groupId&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;maven-surefire-plugin</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;2.4.2</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">configuration&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">skipTests&gt;true</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">skipTests&gt;
                </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">configuration&gt;
            </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">plugin&gt;

            </span><span class="hljs-tag">&lt;</span><span class="hljs-name">plugin&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">artifactId&gt;maven-compiler-plugin</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">artifactId&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">version&gt;3.3</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">version&gt;
                </span><span class="hljs-tag">&lt;</span><span class="hljs-name">configuration&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">encoding&gt;utf-8</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">encoding&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">source&gt;1.8</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">source&gt;
                  </span><span class="hljs-tag">&lt;</span><span class="hljs-name">target&gt;1.8</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">target&gt;
                </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">configuration&gt;
            </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">plugin&gt;

      </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">plugins&gt;
    </span><span class="hljs-tag">&lt;/</span><span class="hljs-name">build&gt;

</span><span class="hljs-tag">&lt;/</span><span class="hljs-name">project&gt;
</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></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>首先,我们定义一个&nbsp;微信用户POJO&nbsp;&nbsp;</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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;WxUser.java&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;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 * &amp;lt;p&amp;gt;\n * \n * &amp;lt;/p&amp;gt;\n *\n * @author RonnieXu\n * @since 2019-12-19\n */\n@Data\n@EqualsAndHashCode(callSuper = true)\n@Accessors(chain = true)\n@TableName(\&amp;quot;sys_wx_user\&amp;quot;)\n@ApiModel(value=\&amp;quot;微信对象\&amp;quot;, description=\&amp;quot;微信对象\&amp;quot;)\npublic class WxUser extends BaseEntity&amp;lt;WxUser&amp;gt; {\n\n    private static final long serialVersionUID = 1L;\n\n    @ApiModelProperty(value=\&amp;quot;用户的标识,对当前公众号唯一\&amp;quot;)\n    private String openid;\n\n    @ApiModelProperty(value=\&amp;quot;用户的昵称\&amp;quot;)\n    private String nickname;\n\n    @ApiModelProperty(value=\&amp;quot;用户的性别,值为1时是男性,值为2时是女性,值为0时是未知\&amp;quot;)\n    private Integer sex;\n\n    @ApiModelProperty(value=\&amp;quot;用户所在城市\&amp;quot;)\n    private String city;\n\n    @ApiModelProperty(value=\&amp;quot;用户所在国家\&amp;quot;)\n    private String country;\n\n    @ApiModelProperty(value=\&amp;quot;用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,\&amp;quot; +\n            \&amp;quot;0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。\&amp;quot;)\n    private String headimgurl;\n\n    @ApiModelProperty(value=\&amp;quot;用户所在省份\&amp;quot;)\n    private String province;\n\n    @ApiModelProperty(value=\&amp;quot;用户的语言,简体中文为zh_CN\&amp;quot;)\n    private String language;\n\n    @DateTimeFormat(pattern = \&amp;quot;yyyy-MM-dd HH:mm:ss\&amp;quot;)\n    @TableField(value = \&amp;quot;subscribe_time\&amp;quot;)\n    @ApiModelProperty(value=\&amp;quot;用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间\&amp;quot;)\n    private LocalDateTime subscribe_time;\n\n    @ApiModelProperty(value=\&amp;quot;只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段\&amp;quot;)\n    private String unionid;\n\n    @ApiModelProperty(value=\&amp;quot;公众号运营者对粉丝的备注,公众号运营者可在微信公众平台用户管理界面对粉丝添加备注\&amp;quot;)\n    private String remark;\n\n    @ApiModelProperty(value=\&amp;quot;用户所在的分组ID(兼容旧的用户分组接口)\&amp;quot;)\n    private String groupid;\n\n    @TableField(value = \&amp;quot;tagid_list\&amp;quot;)\n    @ApiModelProperty(value=\&amp;quot;用户被打上的标签ID列表\&amp;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 = \&amp;quot;subscribe_scene\&amp;quot;)\n    @ApiModelProperty(value=\&amp;quot;返回用户关注的渠道来源\&amp;quot;)\n    private String subscribe_scene;\n\n    @TableField(value = \&amp;quot;qr_scene\&amp;quot;)\n    @ApiModelProperty(value=\&amp;quot;二维码扫码场景(开发者自定义)\&amp;quot;)\n    private String qr_scene;\n\n    @TableField(value = \&amp;quot;qr_scene_str\&amp;quot;)\n    @ApiModelProperty(value=\&amp;quot;二维码扫码场景描述(开发者自定义)\&amp;quot;)\n    private String qr_scene_str;\n\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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">&lt;<span class="hljs-name">p&gt;
*
* <span class="hljs-tag">&lt;/<span class="hljs-name">p&gt;
*
* @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">&lt;<span class="hljs-name">WxUser&gt; {

    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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;877&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;定义一个component&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;WeiXinUserUtil.java&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;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(\&amp;quot;URL{}\&amp;quot;,URIConstant.OPENID_USERINFO_URL);\n            String url = URIConstant.OPENID_USERINFO_URL.replace(\&amp;quot;ACCESS_TOKEN\&amp;quot;, accessToken)\n                  .replace(\&amp;quot;OPENID\&amp;quot;,openId);\n            log.info(\&amp;quot;OPENID_USERINFO_URL:{}\&amp;quot;,url);\n\n            //发起POST请求创建菜单\n            JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);\n\n            //表示订阅了该公众号\n            if(jsonObject.getIntValue(\&amp;quot;subscribe\&amp;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&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;863&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;quot;WeiXinController.java&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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="{&amp;quot;lang&amp;quot;:&amp;quot;html&amp;quot;,&amp;quot;code&amp;quot;:&amp;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 = \&amp;quot;接入验证接口\&amp;quot;)\n@RequestMapping(value = \&amp;quot;/weChart\&amp;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 = \&amp;quot;/connect\&amp;quot;, method = RequestMethod.GET)\n    public String connect(@RequestParam(value = \&amp;quot;signature\&amp;quot;) String signature,\n                        @RequestParam(value = \&amp;quot;timestamp\&amp;quot;) String timestamp,\n                        @RequestParam(value = \&amp;quot;nonce\&amp;quot;) String nonce,\n                        @RequestParam(value = \&amp;quot;echostr\&amp;quot;) String echostr) {\n\n      log.info(\&amp;quot;-----开始校验签名-----\&amp;quot;);\n      PrintWriter out = null;\n      if (CheckUtil.checkSignature(signature, timestamp, nonce)) {\n            log.info(\&amp;quot;-----签名校验通过-----\&amp;quot;);\n            return echostr;\n      } else {\n            log.info(\&amp;quot;-----校验签名失败-----\&amp;quot;);\n            return null;\n      }\n\n    }\n\n    @RequestMapping(value = \&amp;quot;connect\&amp;quot;, method = RequestMethod.POST)\n    public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {\n\n      response.setCharacterEncoding(\&amp;quot;utf-8\&amp;quot;);\n\n      //将微信请求xml转为map格式,获取所需的参数\n      Map&amp;lt;String, String&amp;gt; map = MessageUtil.parseXml(request);\n      String ToUserName = map.get(\&amp;quot;ToUserName\&amp;quot;);\n      String FromUserName = map.get(\&amp;quot;FromUserName\&amp;quot;);\n      String MsgType = map.get(\&amp;quot;MsgType\&amp;quot;);\n      String Content = map.get(\&amp;quot;Content\&amp;quot;);\n      String Event = map.get(\&amp;quot;Event\&amp;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(\&amp;quot;获取用户的详细信息:{}\&amp;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,\&amp;quot;你发送的是:\&amp;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 = \&amp;quot;C:\\\\Users\\\\RonnieXu\\\\Pictures\\\\2.jpg\&amp;quot;;\n            String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);\n            return xmlString;\n      }\n\n      return null;\n    }\n\n}\n&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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">&lt;<span class="hljs-name">String, <span class="hljs-attr">String&gt; 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="{&amp;quot;hasCaption&amp;quot;:false,&amp;quot;src&amp;quot;:&amp;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&amp;quot;,&amp;quot;alt&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;width&amp;quot;:&amp;quot;1200&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;550&amp;quot;,&amp;quot;lock&amp;quot;:true,&amp;quot;align&amp;quot;:&amp;quot;none&amp;quot;,&amp;quot;classes&amp;quot;:{&amp;quot;has&amp;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]
查看完整版本: 微信公众号开发之获取用户列表和用户基本信息(五)