有特点的名字容易让大家记住喔 發表於 2020-1-19 14:06:00

微信公众号开发之配置和接入(二)

<p>从今天开始我们就正式开始微信公众号开发了,首先进入微信官网https://mp.weixin.qq.com/,注册或者登陆(如果已经注册了)你的微信公众号,登陆后需要管理员用个人微信扫码验证通过才行,这里直接贴出截图如下:</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="14"><img src="https://img-blog.csdnimg.cn/20191118012611786.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><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="710" height="679" src="https://img-blog.csdnimg.cn/20191118012647751.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/20191118012647751.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;710&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;679&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/20191118012647751.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><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="12"><img class="has cke_widget_element lazyload" alt="" width="963" height="771" src="https://img-blog.csdnimg.cn/20191118012859126.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/20191118012859126.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;963&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;771&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/20191118012859126.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>点击上面的【开发】---》【基本配置】,进入后如图:</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="11"><img class="has cke_widget_element lazyload" alt="" width="1200" height="816" src="https://img-blog.csdnimg.cn/20191118013352128.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/20191118013352128.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;816&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/20191118013352128.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><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="10"><img class="has cke_widget_element lazyload" alt="" width="1200" height="778" src="https://img-blog.csdnimg.cn/20191118013450154.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/20191118013450154.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;778&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/20191118013450154.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>注意填写下面两个输入框URL和Token即可:</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="9"><img class="has cke_widget_element lazyload" alt="" width="1200" height="920" src="https://img-blog.csdnimg.cn/20191118013815668.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/20191118013815668.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;920&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/20191118013815668.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>Token填写一个你喜欢的字符串,类似你自己设置的密码,随便填写一个你喜欢的英文字符串即可,这里重点说明以下URL;</p>
<p>URL是你跟微信公众号服务器之间通讯传输消息的唯一接口,这里需要重点说明以下微信开发者通讯传输消息的基本工作思路</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="8"><img class="has cke_widget_element lazyload" alt="" width="1073" height="569" src="https://img-blog.csdnimg.cn/20191118015423486.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/20191118015423486.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;1073&amp;quot;,&amp;quot;height&amp;quot;:&amp;quot;569&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/20191118015423486.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>当关注微信公众号的用户发送消息给腾讯公众号服务器之后,腾讯微信公众号服务器会通过这个URL将消息转发给你你自己的项目后台,你的项目可以自定义的做出你想要的任何回复响应,然后当你项目后台做出响应后,腾讯微信公众号服务器再通过这个URL接口收到你的项目后台发过来的消息,继而转发到关注微信公众号的用户手机上,以上就是微信公众号开发的基本思路流程,请读者务必明白,否则后续开发会遇到问题而不知道如何调试处理,接下来我们创建一个这样的可用的URL地址</p>
<p>三、【创建SpringBoot项目】</p>
<p>这里我们利用Java中的明星级IDE工具IDEA新建一个最简单的SpringBoot项目,之所以用SpringBoot就是因为SpringBoot创建和配置太简单了,我们把精力集中到开发业务和逻辑流程上,而不要把精力浪费到项目的冗繁的配置上,用IDEA创建一个最简单的SpringBoot项目,这里我不想细说,不清楚的请百度自行查找网上其他大神的资料,一下是我创建的SpringBoot项目缩略图:</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="7"><img class="has cke_widget_element lazyload" alt="" width="1200" height="1006" src="https://img-blog.csdnimg.cn/20191118020531646.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/20191118020531646.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;1006&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/20191118020531646.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和新建了一个RestApi接口,结合上面截图和下面截图红框部分,你再看看我的URL地址http://r7fkc2.natappfree.cc/weChart/connect&nbsp;你应该好像明白了点什么,对我们配置了这个接口,那问题来了,为什么我们配置的是这个接口而不是别的接口呢,因为我们配置的这个接口第一次提交保存时候,腾讯微信公众号会给你发送一些消息,你需要对这些消息接收后做出符合要求的逻辑处理并作出正确的回应,腾讯微信公众号才会成功认证他作为唯一的合法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="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;WechatController.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">WechatController.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="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;package com.xu.wemall.controller.wechat;\n\nimport com.xu.wemall.commons.utils.CheckUtil;\nimport com.xu.wemall.commons.utils.UploadUtil;\nimport com.xu.wemall.commons.utils.MessageUtil;\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 WechatController {\n\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}\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.wechat;

import com.xu.wemall.commons.utils.CheckUtil;
import com.xu.wemall.commons.utils.UploadUtil;
import com.xu.wemall.commons.utils.MessageUtil;
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 WechatController {


    @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;
      }

    }

}
</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;CheckUtil.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">CheckUtil.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="3">
<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.commons.utils;\n\nimport java.util.Arrays;\n\npublic class CheckUtil {\n\n    //自己设置,要与微信页面设置的一致\n    private static final String token = \&amp;quot;xulijun137\&amp;quot;;\n\n    public static boolean checkSignature(String signature,String timestamp,String nonce){\n\n      String[] str = new String[]{token,timestamp,nonce};\n      //排序\n      Arrays.sort(str);\n      //拼接字符串\n      StringBuffer buffer = new StringBuffer();\n      for(int i =0 ;i&amp;lt;str.length;i++){\n            buffer.append(str);\n      }\n      //进行sha1加密\n      String temp = SHA1.encode(buffer.toString());\n      //与微信提供的signature进行匹对\n      return signature.equals(temp);\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.commons.utils;

import java.util.Arrays;

public class CheckUtil {

    //自己设置,要与微信页面设置的一致
    private static final String token = "xulijun137";

    public static boolean checkSignature(String signature,String timestamp,String nonce){

      String[] str = new String[]{token,timestamp,nonce};
      //排序
      Arrays.sort(str);
      //拼接字符串
      StringBuffer buffer = new StringBuffer();
      for(int i =0 ;i<span class="hljs-tag">&lt;<span class="hljs-name">str.length;i++){
            <span class="hljs-attr">buffer.append(<span class="hljs-attr">str[<span class="hljs-attr">i]);
      }
      //进行<span class="hljs-attr">sha1加密
      <span class="hljs-attr">String <span class="hljs-attr">temp = <span class="hljs-string">SHA1.encode(buffer.toString());
      //与微信提供的<span class="hljs-attr">signature进行匹对
      <span class="hljs-attr">return <span class="hljs-attr">signature.equals(<span class="hljs-attr">temp);
    }

}
</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>
<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;SHA1.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">SHA1.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.commons.utils;\n\nimport java.security.MessageDigest;\n\n/**\n * 类名称: SHA1\n * 类描述: sha1加密\n *\n * @author yuanjun\n * 创建时间:2017年12月5日上午11:10:01\n */\npublic final class SHA1 {\n    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',\n            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};\n\n    /**\n   * Takes the raw bytes from the digest and formats them correct.\n   *\n   * @param bytes the raw bytes from the digest.\n   * @return the formatted bytes.\n   */\n    private static String getFormattedText(byte[] bytes) {\n      int len = bytes.length;\n      StringBuilder buf = new StringBuilder(len * 2);\n      // 把密文转换成十六进制的字符串形式\n      for (int j = 0; j &amp;lt; len; j++) {\n            buf.append(HEX_DIGITS[(bytes &amp;gt;&amp;gt; 4) &amp;amp; 0x0f]);\n            buf.append(HEX_DIGITS &amp;amp; 0x0f]);\n      }\n      return buf.toString();\n    }\n\n    public static String encode(String str) {\n      if (str == null) {\n            return null;\n      }\n      try {\n            MessageDigest messageDigest = MessageDigest.getInstance(\&amp;quot;SHA1\&amp;quot;);\n            messageDigest.update(str.getBytes());\n            return getFormattedText(messageDigest.digest());\n      } catch (Exception e) {\n            throw new RuntimeException(e);\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.commons.utils;

import java.security.MessageDigest;

/**
* 类名称: SHA1
* 类描述: sha1加密
*
* @author yuanjun
* 创建时间:2017年12月5日上午11:10:01
*/
public final class SHA1 {
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
   * Takes the raw bytes from the digest and formats them correct.
   *
   * @param bytes the raw bytes from the digest.
   * @return the formatted bytes.
   */
    private static String getFormattedText(byte[] bytes) {
      int len = bytes.length;
      StringBuilder buf = new StringBuilder(len * 2);
      // 把密文转换成十六进制的字符串形式
      for (int j = 0; j <span class="hljs-tag">&lt; <span class="hljs-attr">len; <span class="hljs-attr">j++) {
            <span class="hljs-attr">buf.append(<span class="hljs-attr">HEX_DIGITS[(<span class="hljs-attr">bytes[<span class="hljs-attr">j] &gt;&gt; 4) &amp; 0x0f]);
            buf.append(HEX_DIGITS &amp; 0x0f]);
      }
      return buf.toString();
    }

    public static String encode(String str) {
      if (str == null) {
            return null;
      }
      try {
            MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
            messageDigest.update(str.getBytes());
            return getFormattedText(messageDigest.digest());
      } catch (Exception e) {
            throw new RuntimeException(e);
      }
    }
}
</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><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="570" src="https://img-blog.csdnimg.cn/20191118020723269.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/20191118020723269.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;570&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/20191118020723269.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>上面的Token请换成自己的token,在你的【开发】--》【基本配置】中你之前自己配置过的Token,上面的接口的基本思路是获取腾讯服务器发送到四个参数你项目接口的,你对这四个参数做还有token一起5个参数按照公众号提供的文档说明处理后,满足条件后返回其中一个参数即可,具体请看我代码部分,注意这个接口是GET请求方式的,因此得到我们的项目RestAPI接口地址是:http:/localhost:80/weChat/connnect,再看我配置的地址http://r7fkc2.natappfree.cc/weChart/connect</p>
<p>这里显然我们配了一个域名地址http://r7fkc2.natappfree.cc/【这里默认设置的是80端口,80端口可以不写】这是我们利用NATAPP将本地的127.0.0.1映射成的一个外网可访问的域名地址【这里就是我们上一课讲的用NATAPP将本地地址映射成外网地址,不清楚的同学请先学习我的上一课,映射本地地址到外网的工具还有其他的,目前笔者最推荐是NATAPP】,通过这个外网的域名地址,腾讯的服务器可以成功连接到我们的项目,因为你开发的话你的本地地址localhost腾讯微信公众号服务器是不可能认识的( 后续你可以把项目部署到外网服务器上,比如阿里云,百度云,腾讯云服务器上),</p>
<p>至此我们就成功得到这个URL地址了,配置后保存即对我们的接口做合法性验证,验证成功会弹出弹窗框提示你验证成功,否则表示你的接口逻辑处理后返回的字符串不符合接口要求,请修改代码后重新配置验证接口,好了今天的课就讲到这里了,下节课再见,如有问题请给我留言。</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/12213442.html
頁: [1]
查看完整版本: 微信公众号开发之配置和接入(二)