小东黎 發表於 2020-12-19 15:50:00

微信公众号开发接入

<svg xmlns="http://www.w3.org/2000/svg" style="display: none">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0)"></path>
                  </svg>
                  <p></p>
<div class="toc">
<h3>微信开发接入</h3>
<ul><li>一、背景</li><li>二、前置条件</li><li>三、通过natapp内网穿透和域名购买</li><li><ul><li>1、购买隧道</li><li>2、购买一个二级域名(如果自己有可以忽略)</li><li>3、将域名绑定到购买的隧道上</li><li>4、下载natapp客户端</li><li>5、启动 natapp</li></ul>
</li><li>四、编写微信服务端接入验证</li><li><ul><li>1、填写服务器配置</li><li>2、编写服务端验证接入代码</li><li><ul><li>1、引入 weixin-java-mp.jar</li><li>2、进行 mp 配置</li><li>3、服务器端代码验证</li><li>4、验证</li></ul>
</li></ul>
</li><li>五、参考文档</li><li>六、代码网址</li></ul>
</div>
<p></p>
<h1>一、背景</h1>
<p>最近项目中由于某些原因,涉及到了<code>微信公众号</code>的开发,此处简单记录下微信公众号的接入。</p>
<h1>二、前置条件</h1>
<p>1、需要有一个可以在外网可以访问的域名<br> 2、本地开发,需要将内网环境穿透到外网可以访问。<br> 3、需要有一个公众号。</p>
<p><strong>注意:</strong><br> 1、<code>内网穿透</code>和<code>外网域名</code> 我们可以通过 <code>natapp</code> 来购买实现。</p>
<h1>三、通过natapp内网穿透和域名购买</h1>
<h2>1、购买隧道</h2>
<p><img src="https://img-blog.csdnimg.cn/20201219141235446.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> 此处根据自己的情况,购买一个适合自己的隧道。<br> <img src="https://img-blog.csdnimg.cn/20201219141744497.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> 后期将会把我们自己的本地端口,映射到一个外网可以访问的网址上。</p>
<h2>2、购买一个二级域名(如果自己有可以忽略)</h2>
<p><img src="https://img-blog.csdnimg.cn/20201219141552980.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> <strong>注意</strong>:<br> 1、此处购买一个 二级域名,如果自己有 域名,可以不用购买。</p>
<h2>3、将域名绑定到购买的隧道上</h2>
<p><img src="https://img-blog.csdnimg.cn/20201219141951999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"></p>
<h2>4、下载natapp客户端</h2>
<p>https://natapp.cn/#download<br> 此处需要根据自己的操作系统,下载对应的客户端。</p>
<h2>5、启动 natapp</h2>
<p><img src="https://img-blog.csdnimg.cn/20201219142436774.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> 此处的 <code>authtoken</code> 的值为 我们自己购买的隧道的值。</p>
<h1>四、编写微信服务端接入验证</h1>
<h2>1、填写服务器配置</h2>
<p>路径:<code>开发-&gt;基本配置</code><br> <img src="https://img-blog.csdnimg.cn/20201219151333499.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> <img src="https://img-blog.csdnimg.cn/20201219151614241.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"></p>
<h2>2、编写服务端验证接入代码</h2>
<p><img src="https://img-blog.csdnimg.cn/20201219150408198.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> <code>微信服务器地址URL</code>:这个可以先记下来,下面会告知在那个地方配置<br> <code>我们自己接入微信公众号有些验证比较麻烦,此处借助网上的开源框架 weixin-java-mp 这个程序开发</code>。</p>
<h3>1、引入 weixin-java-mp.jar</h3>
<pre><code class="prism language-pom.xml">&lt;dependency&gt;
    &lt;groupId&gt;com.github.binarywang&lt;/groupId&gt;
    &lt;artifactId&gt;weixin-java-mp&lt;/artifactId&gt;
    &lt;version&gt;4.0.0&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<h3>2、进行 mp 配置</h3>
<pre><code class="prism language-java"><span class="token annotation punctuation">@Configuration</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">WxMpConfiguration</span> <span class="token punctuation">{</span>

    <span class="token annotation punctuation">@Autowired</span>
    <span class="token keyword">private</span> WxMpProperties wxMpProperties<span class="token punctuation">;</span>

    <span class="token annotation punctuation">@Bean</span>
    <span class="token keyword">public</span> WxMpService <span class="token function">wxMpService</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      WxMpServiceImpl wxMpService <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WxMpServiceImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      wxMpService<span class="token punctuation">.</span><span class="token function">setWxMpConfigStorage</span><span class="token punctuation">(</span><span class="token function">wxMpConfigStorage</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token comment">// 设置多个微信公众号的配置</span>
      <span class="token comment">// wxMpService.setMultiConfigStorages();</span>
      <span class="token keyword">return</span> wxMpService<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>

    <span class="token comment">/**
   * 这个地方的配置是保存在本地,生产环境需要自己扩展,可以保存在Redis中等等
   *
   * @return WxMpConfigStorage
   */</span>
    <span class="token keyword">public</span> WxMpConfigStorage <span class="token function">wxMpConfigStorage</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      WxMpDefaultConfigImpl storage <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">WxMpDefaultConfigImpl</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      storage<span class="token punctuation">.</span><span class="token function">setAppId</span><span class="token punctuation">(</span>wxMpProperties<span class="token punctuation">.</span><span class="token function">getAppId</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      storage<span class="token punctuation">.</span><span class="token function">setSecret</span><span class="token punctuation">(</span>wxMpProperties<span class="token punctuation">.</span><span class="token function">getAppSecret</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      storage<span class="token punctuation">.</span><span class="token function">setAesKey</span><span class="token punctuation">(</span>wxMpProperties<span class="token punctuation">.</span><span class="token function">getAesKey</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      storage<span class="token punctuation">.</span><span class="token function">setToken</span><span class="token punctuation">(</span>wxMpProperties<span class="token punctuation">.</span><span class="token function">getToken</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> storage<span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p><strong>注意</strong><br> 1、<code>WxMpConfigStorage</code> 这个类在生产环境中,如果服务是 <code>集群</code> 部署的话,最好不要使用 <code>WxMpDefaultConfigImpl</code> 因为这个是将配置保存在 内存中。可以考虑使用 <code>WxMpRedissonConfigImpl</code> 这个类。<br> 2、<code>WxMpConfigStorage</code> 中的配置,和上方的服务器配置保持一致。</p>
<h3>3、服务器端代码验证</h3>
<pre><code class="prism language-java"><span class="token annotation punctuation">@Component</span>
<span class="token annotation punctuation">@RestController</span>
<span class="token annotation punctuation">@Slf4j</span>
<span class="token keyword">public</span> <span class="token keyword">class</span> <span class="token class-name">MpEntryController</span> <span class="token punctuation">{</span>

    <span class="token annotation punctuation">@Autowired</span>
    <span class="token keyword">private</span> WxMpService wxMpService<span class="token punctuation">;</span>

    <span class="token comment">/**
   * 微信接入
   *
   * @param signature 签名
   * @param timestamp 时间戳
   * @param nonce   随机数
   * @param echoStr   随机字符串
   * @return 接入成功返回 echoStr 的值,否则随便返回
   */</span>
    <span class="token annotation punctuation">@GetMapping</span><span class="token punctuation">(</span><span class="token string">"/mp/entry"</span><span class="token punctuation">)</span>
    <span class="token keyword">public</span> String <span class="token function">entry</span><span class="token punctuation">(</span><span class="token annotation punctuation">@RequestParam</span><span class="token punctuation">(</span><span class="token string">"signature"</span><span class="token punctuation">)</span> String signature<span class="token punctuation">,</span>
                        <span class="token annotation punctuation">@RequestParam</span><span class="token punctuation">(</span><span class="token string">"timestamp"</span><span class="token punctuation">)</span> String timestamp<span class="token punctuation">,</span>
                        <span class="token annotation punctuation">@RequestParam</span><span class="token punctuation">(</span><span class="token string">"nonce"</span><span class="token punctuation">)</span> String nonce<span class="token punctuation">,</span>
                        <span class="token annotation punctuation">@RequestParam</span><span class="token punctuation">(</span><span class="token string">"echostr"</span><span class="token punctuation">)</span> String echoStr<span class="token punctuation">)</span> <span class="token punctuation">{</span>
      log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"微信公众号/服务号接入传递的参数 signature:[{}],timestamp:[{}],nonce:[{}],echostr:[{}]"</span><span class="token punctuation">,</span>
                signature<span class="token punctuation">,</span> timestamp<span class="token punctuation">,</span> nonce<span class="token punctuation">,</span> echoStr<span class="token punctuation">)</span><span class="token punctuation">;</span>

      <span class="token keyword">if</span> <span class="token punctuation">(</span>StringUtils<span class="token punctuation">.</span><span class="token function">isAnyBlank</span><span class="token punctuation">(</span>signature<span class="token punctuation">,</span> timestamp<span class="token punctuation">,</span> nonce<span class="token punctuation">,</span> echoStr<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
            log<span class="token punctuation">.</span><span class="token function">error</span><span class="token punctuation">(</span><span class="token string">"接收到微信认证信息,参数非法,存在为空的参数"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">return</span> <span class="token string">"error"</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span>

      <span class="token keyword">boolean</span> result <span class="token operator">=</span> wxMpService<span class="token punctuation">.</span><span class="token function">checkSignature</span><span class="token punctuation">(</span>timestamp<span class="token punctuation">,</span> nonce<span class="token punctuation">,</span> signature<span class="token punctuation">)</span><span class="token punctuation">;</span>
      log<span class="token punctuation">.</span><span class="token function">info</span><span class="token punctuation">(</span><span class="token string">"微信公众号/服务号接入成功?[{}]"</span><span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token keyword">return</span> result <span class="token operator">?</span> echoStr <span class="token operator">:</span> <span class="token string">"error"</span><span class="token punctuation">;</span>
    <span class="token punctuation">}</span>
<span class="token punctuation">}</span>
</code></pre>
<p><strong>注意</strong><br> 1、<code>/mp/entry</code> 这个为我们自己的接入路径,和上方图中保存一致。</p>
<h3>4、验证</h3>
<p>1、启动我们的web工程<br> 2、在微信配置页面,点击<code>提交</code>。<br> 3、验证通过,说明接入成功。</p>
<p><img src="https://img-blog.csdnimg.cn/20201219152916255.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Z1X2h1b18xOTkz,size_16,color_FFFFFF,t_70"><br> 微信服务器地址URL 就是 <code>/mp/entry</code></p>
<h1>五、参考文档</h1>
<p>1、微信接入</p>
<h1>六、代码网址</h1>
<p>https://gitee.com/huan1993/wechat-development</p>
               

</div>
<div id="MySignature" role="contentinfo">
    <p>本文来自博客园,作者:huan1993,转载请注明原文链接:https://www.cnblogs.com/huan1993/p/15416127.html</p><br><br>
来源:https://www.cnblogs.com/huan1993/p/15416127.html
頁: [1]
查看完整版本: 微信公众号开发接入