睦壹 發表於 2020-1-19 14:40:00

微信公众号开发之生成带参数的二维码(六)

<p>为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口。使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送。</p>
<p>目前有2种类型的二维码:</p>
<p>1、临时二维码,是有过期时间的,最长可以设置为在二维码生成后的30天(即2592000秒)后过期,但能够生成较多数量。临时二维码主要用于帐号绑定等不要求二维码永久保存的业务场景 2、永久二维码,是无过期时间的,但数量较少(目前为最多10万个)。永久二维码主要用于适用于帐号绑定、用户来源统计等场景。</p>
<p>用户扫描带场景值二维码时,可能推送以下两种事件:</p>
<p>如果用户还未关注公众号,则用户可以关注公众号,关注后微信会将带场景值关注事件推送给开发者。</p>
<p>如果用户已经关注公众号,在用户扫描后会自动进入会话,微信也会将带场景值扫描事件推送给开发者。</p>
<p>获取带参数的二维码的过程包括两步,首先创建二维码ticket,然后凭借ticket到指定URL换取二维码。</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="8">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;http请求方式: POST\nURL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN\nPOST数据格式:json\nPOST数据例子:{\&amp;quot;expire_seconds\&amp;quot;: 604800, \&amp;quot;action_name\&amp;quot;: \&amp;quot;QR_SCENE\&amp;quot;, \&amp;quot;action_info\&amp;quot;: {\&amp;quot;scene\&amp;quot;: {\&amp;quot;scene_id\&amp;quot;: 123}}}\n\n或者也可以使用以下POST数据创建字符串形式的二维码参数:\n{\&amp;quot;expire_seconds\&amp;quot;: 604800,&nbsp;\&amp;quot;action_name\&amp;quot;: \&amp;quot;QR_STR_SCENE\&amp;quot;, \&amp;quot;action_info\&amp;quot;: {\&amp;quot;scene\&amp;quot;: {\&amp;quot;scene_str\&amp;quot;: \&amp;quot;test\&amp;quot;}}}&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请求方式: POST
URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
POST数据格式:json
POST数据例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}

或者也可以使用以下POST数据创建字符串形式的二维码参数:
{"expire_seconds": 604800,&nbsp;"action_name": "QR_STR_SCENE", "action_info": {"scene": {"scene_str": "test"}}}</code></pre>
<span class="cke_reset cke_widget_drag_handler_container"><img src="data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw=="></span></div>
<p>参数说明</p>
<table class=" cke_show_border">
<thead>
<tr><th>参数</th><th>说明</th></tr>
</thead>
<tbody>
<tr>
<td>expire_seconds</td>
<td>该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。</td>
</tr>
<tr>
<td>action_name</td>
<td>二维码类型,QR_SCENE为临时的整型参数值,QR_STR_SCENE为临时的字符串参数值,QR_LIMIT_SCENE为永久的整型参数值,QR_LIMIT_STR_SCENE为永久的字符串参数值</td>
</tr>
<tr>
<td>action_info</td>
<td>二维码详细信息</td>
</tr>
<tr>
<td>scene_id</td>
<td>场景值ID,临时二维码时为32位非0整型,永久二维码时最大值为100000(目前参数只支持1--100000)</td>
</tr>
<tr>
<td>scene_str</td>
<td>场景值ID(字符串形式的ID),字符串类型,长度限制为1到64</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="7">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;{\&amp;quot;ticket\&amp;quot;:\&amp;quot;gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm\n3sUw==\&amp;quot;,\&amp;quot;expire_seconds\&amp;quot;:60,\&amp;quot;url\&amp;quot;:\&amp;quot;http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI\&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">{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}
</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>ticket</td>
<td>获取的二维码ticket,凭借此ticket可以在有效时间内换取二维码。</td>
</tr>
<tr>
<td>expire_seconds</td>
<td>该二维码有效时间,以秒为单位。 最大不超过2592000(即30天)。</td>
</tr>
<tr>
<td>url</td>
<td>二维码图片解析后的地址,开发者可根据该地址自行生成需要的二维码图片</td>
</tr>
</tbody>
</table>
<p><strong>通过ticket换取二维码</strong></p>
<p>获取二维码ticket后,开发者可用ticket换取二维码图片。请注意,本接口无须登录态即可调用。</p>
<p><strong>请求说明</strong></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;code&amp;quot;:&amp;quot;HTTP GET请求(请使用https协议)https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET\n提醒:TICKET记得进行UrlEncode&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://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET
提醒:TICKET记得进行UrlEncode</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;一、新建一个QrCodeUtil里面包含三个方法,分别是封装请求的参数,产生二维码和获得二维码</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="5"><img class="has cke_widget_element lazyload" alt="" width="1200" height="894" src="https://img-blog.csdnimg.cn/20200102180647218.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/20200102180647218.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;894&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/20200102180647218.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>
<pre><code class="language-html hljs">QrCodeUtil.java</code></pre>
<pre><code class="language-html hljs">package com.xu.wemall.components.weixin;<br><br>import com.alibaba.fastjson.JSONObject;<br>import com.xu.wemall.commons.constants.URIConstant;<br>import lombok.extern.slf4j.Slf4j;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import org.springframework.stereotype.Component;<br>import org.springframework.web.client.RestTemplate;<br><br>import java.io.UnsupportedEncodingException;<br>import java.net.URLEncoder;<br>import java.util.TreeMap;<br><br>@Slf4j<br>@Component<br>public class QrCodeUtil {<br><br>    @Autowired<br>    private RestTemplate restTemplate;<br><br>    @Autowired<br>    private AccessTokenUtil accessTokenUtil;<br><br>    private String createQrCodeString(String sceneStr) {<br><br>      TreeMap&lt;String, String&gt; params = new TreeMap&lt;&gt;();<br>      // output data<br>      JSONObject data = new JSONObject();<br>      data.put("action_name", "QR_SCENE");<br>      data.put("expire_seconds", 3600);//一小时<br><br>      JSONObject scene = new JSONObject();<br>      scene.put("scene_str", sceneStr);<br>      JSONObject actionInfo = new JSONObject();<br>      actionInfo.put("scene", scene);<br>      data.put("action_info", actionInfo);<br><br>      return data.toJSONString();<br><br>    }<br><br>    public JSONObject createQrCode(String sceneId) {<br><br>      String qrCodeString = this.createQrCodeString(sceneId);<br>      log.info("qrCodeString:{}", qrCodeString);<br><br>      String accessToken = accessTokenUtil.getAccessToken();<br>      if (accessToken != null) {<br>            log.info("URL{}", URIConstant.CREATE_QRCODE_URL);<br>            String url = URIConstant.CREATE_QRCODE_URL.replace("ACCESS_TOKEN", accessToken);<br>            log.info("URL_ACCESS_TOKEN:{}", url);<br>            //将菜单对象转换成JSON字符串<br><br>            //发起POST请求创建菜单<br>            JSONObject jsonObject = restTemplate.postForObject(url, qrCodeString, JSONObject.class);<br><br>            return jsonObject;<br>      }<br>      return null;<br><br>    }<br><br>    public void showQrCode(String ticket) throws UnsupportedEncodingException {<br><br>      String TICKET = URLEncoder.encode(ticket, "utf-8");<br><br>      log.info("URL{}", URIConstant.SHOW_QRCODE_URL);<br>      String url = URIConstant.SHOW_QRCODE_URL.replace("TICKET", TICKET);<br>      log.info("SHOW_QRCODE_URL:{}", url);<br>      //将菜单对象转换成JSON字符串<br><br>      //发起POST请求创建菜单<br>      restTemplate.getForObject(url, JSONObject.class);<br><br>    }<br><br>}<br></code></pre>
<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="4"><img class="has cke_widget_element lazyload" alt="" width="1200" height="888" src="https://img-blog.csdnimg.cn/20200102180820169.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/20200102180820169.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;888&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/20200102180820169.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>
<pre><code class="language-html hljs">QrCodeWxController.java</code></pre>
<pre><code class="language-html hljs">package com.xu.wemall.controller.weixin;<br><br>import com.alibaba.fastjson.JSONObject;<br>import com.xu.wemall.components.weixin.QrCodeUtil;<br>import io.swagger.annotations.Api;<br>import io.swagger.annotations.ApiOperation;<br>import lombok.extern.slf4j.Slf4j;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import org.springframework.web.bind.annotation.RequestMapping;<br>import org.springframework.web.bind.annotation.RequestMethod;<br>import org.springframework.web.bind.annotation.RestController;<br><br>import java.io.UnsupportedEncodingException;<br><br>/**<br> * 类名称: LoginController<br> * 类描述: 与微信对接登陆验证<br> *<br> * @author yuanjun<br> * 创建时间:2017年12月5日上午10:52:13<br> */<br>@Slf4j<br>@RestController<br>@Api(tags = "微信生成带参的二维码接口")<br>@RequestMapping(value = "/weixin/qrcode")<br>public class QrCodeWxController {<br><br>    @Autowired<br>    private QrCodeUtil qrCodeUtil;<br><br>    @ApiOperation(value = "创建带参的二维码")<br>    @RequestMapping(value = "/createQrCode", method = RequestMethod.POST)<br>    public Object createQrCode(String sceneId) {<br><br>      JSONObject jsonObject = qrCodeUtil.createQrCode(sceneId);<br>      return jsonObject;<br><br>    }<br><br>    @ApiOperation(value = "获取带参的二维码")<br>    @RequestMapping(value = "/showQrCode", method = RequestMethod.GET)<br>    public void showQrCode(String ticket) throws UnsupportedEncodingException {<br>      qrCodeUtil.showQrCode(ticket);<br><br>    }<br><br>}<br></code></pre>
<p>三、我们打开我们的swagger页面提交一下请求试试看</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="3"><img class="has cke_widget_element lazyload" alt="" width="1200" height="784" src="https://img-blog.csdnimg.cn/20200102181029576.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/20200102181029576.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;784&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/20200102181029576.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>四、根据ticket获取二维码</p>
<p>https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQEd7zwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyYlo5NXRyR0ljZ2oxOFVkZHh1MWQAAgQofw1eAwQQDgAA</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="2"><img class="has cke_widget_element lazyload" alt="" width="1200" height="890" src="https://img-blog.csdnimg.cn/20200102182045782.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/20200102182045782.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;890&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/20200102182045782.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>五、【One More Thing!!!】</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="1">
<pre class="has cke_widget_element" data-cke-widget-data="{&amp;quot;code&amp;quot;:&amp;quot;&amp;lt;xml&amp;gt;\n&amp;lt;ToUserName&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/ToUserName&amp;gt;\n&amp;lt;FromUserName&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/FromUserName&amp;gt;\n&amp;lt;CreateTime&amp;gt;123456789&amp;lt;/CreateTime&amp;gt;\n&amp;lt;MsgType&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/MsgType&amp;gt;\n&amp;lt;Event&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/Event&amp;gt;\n&amp;lt;EventKey&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/EventKey&amp;gt;\n&amp;lt;Ticket&amp;gt;&amp;lt;!]&amp;gt;&amp;lt;/Ticket&amp;gt;\n&amp;lt;/xml&amp;gt; &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">&lt;xml&gt;
&lt;ToUserName&gt;&lt;!]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;!]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;123456789&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;!]&gt;&lt;/MsgType&gt;
&lt;Event&gt;&lt;!]&gt;&lt;/Event&gt;
&lt;EventKey&gt;&lt;!]&gt;&lt;/EventKey&gt;
&lt;Ticket&gt;&lt;!]&gt;&lt;/Ticket&gt;
&lt;/xml&gt; </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>到这里你应该清楚了吧,我们在我们的微信对接接口的POST方法里增加如下代码即可:</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="567" src="https://img-blog.csdnimg.cn/20200102182442857.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/20200102182442857.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;567&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/20200102182442857.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>
<pre><code class="language-html hljs">WeiXinController.java</code></pre>
<pre><code class="language-html hljs">package com.xu.wemall.controller.weixin;<br><br>import com.alibaba.fastjson.JSONObject;<br>import com.xu.wemall.commons.utils.CheckUtil;<br>import com.xu.wemall.components.weixin.MessageUtil;<br>import com.xu.wemall.components.weixin.WeiXinUserUtil;<br>import io.swagger.annotations.Api;<br>import lombok.extern.slf4j.Slf4j;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import org.springframework.web.bind.annotation.RequestMapping;<br>import org.springframework.web.bind.annotation.RequestMethod;<br>import org.springframework.web.bind.annotation.RequestParam;<br>import org.springframework.web.bind.annotation.RestController;<br><br>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;<br>import java.io.PrintWriter;<br>import java.util.Map;<br><br>/**<br> * 类名称: LoginController<br> * 类描述: 与微信对接登陆验证<br> *<br> * @author yuanjun<br> * 创建时间:2017年12月5日上午10:52:13<br> */<br>@Slf4j<br>@RestController<br>@Api(tags = "接入验证接口")<br>@RequestMapping(value = "/weChart")<br>public class WeiXinController {<br><br>    @Autowired<br>    private WeiXinUserUtil weiXinUserUtil;<br><br>    @Autowired<br>    private MessageUtil messageUtil;<br><br>    @RequestMapping(value = "/connect", method = RequestMethod.GET)<br>    public String connect(@RequestParam(value = "signature") String signature,<br>                        @RequestParam(value = "timestamp") String timestamp,<br>                        @RequestParam(value = "nonce") String nonce,<br>                        @RequestParam(value = "echostr") String echostr) {<br><br>      log.info("-----开始校验签名-----");<br>      PrintWriter out = null;<br>      if (CheckUtil.checkSignature(signature, timestamp, nonce)) {<br>            log.info("-----签名校验通过-----");<br>            return echostr;<br>      } else {<br>            log.info("-----校验签名失败-----");<br>            return null;<br>      }<br><br>    }<br><br>    @RequestMapping(value = "connect", method = RequestMethod.POST)<br>    public String dopost(HttpServletRequest request, HttpServletResponse response) throws Exception {<br><br>      response.setCharacterEncoding("utf-8");<br><br>      //将微信请求xml转为map格式,获取所需的参数<br>      Map&lt;String, String&gt; map = MessageUtil.parseXml(request);<br>      String ToUserName = map.get("ToUserName");<br>      String FromUserName = map.get("FromUserName");<br>      String MsgType = map.get("MsgType");<br>      String Content = map.get("Content");<br>      String Event = map.get("Event");<br><br>      if(MessageUtil.REQ_MESSAGE_TYPE_EVENT.equals(MsgType)){<br><br>            if(MessageUtil.EVENT_TYPE_SUBSCRIBE.equals(Event)){<br>                String xmlString = messageUtil.subscribeForText(ToUserName,FromUserName);<br><br>                //关注了公众号,调用接口获得用户的详细信息并保存到后台<br>                JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);<br>                log.info("获取用户的详细信息:{}",jsonObject.toJSONString());<br><br>                return xmlString;<br><br>            }else if(MessageUtil.EVENT_TYPE_UNSUBSCRIBE.equals(Event)){<br><br>                String xmlString = messageUtil.unsubscribeForText(ToUserName,FromUserName);<br>                return xmlString;<br><br>            }else if(MessageUtil.EVENT_TYPE_SCAN.equals(Event)){<br>                JSONObject jsonObject = weiXinUserUtil.handdleWeixinUserInfo(FromUserName);<br>                log.info("获取用户的详细信息:{}",jsonObject.toJSONString());<br><br>            }<br><br>      }<br><br>      //处理文本类型,实现输入1,回复相应的封装的内容<br>      if (MessageUtil.REQ_MESSAGE_TYPE_TEXT.equals(MsgType)) {<br>            String xmlString = messageUtil.replyForText(ToUserName,FromUserName,"你发送的是:" + Content);<br>            log.info(xmlString);<br>            return xmlString;<br><br>      }<br><br>      if (MessageUtil.REQ_MESSAGE_TYPE_IMAGE.equals(MsgType)) {<br><br>            String filePath = "C:\\Users\\RonnieXu\\Pictures\\2.jpg";<br>            String xmlString = messageUtil.replyForImage(ToUserName,FromUserName,filePath);<br>            return xmlString;<br>      }<br><br>      return null;<br>    }<br><br>}<br></code></pre>
<pre><code class="language-html hljs">WeiXinUserUtil.java</code></pre>
<pre><code class="language-html hljs">package com.xu.wemall.components.weixin;<br><br>import com.alibaba.fastjson.JSONObject;<br>import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;<br>import com.xu.wemall.commons.constants.URIConstant;<br>import com.xu.wemall.entry.WxUser;<br>import com.xu.wemall.service.IWxUserService;<br>import lombok.extern.slf4j.Slf4j;<br>import org.springframework.beans.factory.annotation.Autowired;<br>import org.springframework.stereotype.Component;<br>import org.springframework.web.client.RestTemplate;<br><br>@Slf4j<br>@Component<br>public class WeiXinUserUtil {<br><br>    @Autowired<br>    private IWxUserService iWxUserService;<br><br>    @Autowired<br>    private RestTemplate restTemplate;<br><br>    @Autowired<br>    private AccessTokenUtil accessTokenUtil;<br><br>    public JSONObject handdleWeixinUserInfo(String openId) {<br><br>      String accessToken = accessTokenUtil.getAccessToken();<br>      if (accessToken != null) {<br>            log.info("URL{}", URIConstant.OPENID_USERINFO_URL);<br>            String url = URIConstant.OPENID_USERINFO_URL.replace("ACCESS_TOKEN", accessToken)<br>                  .replace("OPENID", openId);<br>            log.info("OPENID_USERINFO_URL:{}", url);<br><br>            //发起POST请求创建菜单<br>            JSONObject jsonObject = restTemplate.getForObject(url, JSONObject.class);<br><br>            //表示订阅了该公众号<br>            if (jsonObject.getIntValue("subscribe") == 1) {<br>                //保存<br>                WxUser wxUser = JSONObject.parseObject(jsonObject.toJSONString(), WxUser.class);<br><br>                //先查一下是否曾经查询过(查看数据库数据)<br>                QueryWrapper&lt;WxUser&gt; queryWrapper = new QueryWrapper();<br>                queryWrapper.lambda().eq(WxUser::getOpenid, openId);<br>                WxUser wxUserExist = iWxUserService.getOne(queryWrapper);<br>                if (wxUserExist == null) {<br>                  boolean result = iWxUserService.saveOrUpdate(wxUser);<br>                }<br><br>            }<br><br>            return jsonObject;<br>      }<br><br>      return null;<br>    }<br><br>}<br></code></pre>
<p>打完收工,下回再见!</p>
<p>========================================================================================================================================================================================================</p>
<h3>如果您觉得此文有帮助,可以小小打赏一下,持续更新更有动力哟!</h3>
<p><img alt="" width="218" height="274" data-src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133129576-79870337.png"><img src="https://img2020.cnblogs.com/blog/1501920/202004/1501920-20200402133221455-2112921293.png"></p><br><br>
来源:https://www.cnblogs.com/xulijun137/p/12213604.html
頁: [1]
查看完整版本: 微信公众号开发之生成带参数的二维码(六)