<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Tenken blog</title>
  
  <subtitle>技术-不进则退</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="http://whatcode.cn/"/>
  <updated>2018-04-11T03:30:35.000Z</updated>
  <id>http://whatcode.cn/</id>
  
  <author>
    <name>Tenken</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>获取腾讯视频源地址</title>
    <link href="http://whatcode.cn/2018/04/11/get-tencent-video-func/"/>
    <id>http://whatcode.cn/2018/04/11/get-tencent-video-func/</id>
    <published>2018-04-10T16:00:00.000Z</published>
    <updated>2018-04-11T03:30:35.000Z</updated>
    
    <content type="html"><![CDATA[<p>前几天开发微信小程序的时候需要用到腾讯视频的内容，但是小程序的video标签只支持视频源地址，我们在腾讯视频网站上找到的分享链接并不是视频的源地址，例如：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;iframe frameborder=<span class="string">"0"</span> width=<span class="string">"640"</span> height=<span class="string">"498"</span> src=<span class="string">"https://v.qq.com/iframe/player.html?vid=r0519gvbvsj&amp;tiny=0&amp;auto=0"</span> allowfullscreen&gt;&lt;/iframe&gt;</span><br></pre></td></tr></table></figure></p><p>这样的分享地址只是一个iframe框架链接，小程序video标签是无法识别的，那么问题来了，怎么样获取腾讯的视频的源地址呢？经过chrome浏览器的调试测试和postman工具的模拟测试，找出了腾讯视频源地址的解码原理。</p><h3 id="腾讯视频获取源地址步骤"><a href="#腾讯视频获取源地址步骤" class="headerlink" title="腾讯视频获取源地址步骤"></a>腾讯视频获取源地址步骤</h3><p>1、用vid参数通过<code>https://h5vv.video.qq.com/getinfo</code>接口获取vkey参数和fn参数<br>2、然后用vkey参数组合成源地址<br><code>http://ugcws.video.gtimg.com/fn&amp;vkey&amp;br=56&amp;platform=2&amp;fmt=auto&amp;level=0&amp;sdtfrom=v5010&amp;guid=a3527bbc8888951591bc3a67c2bc9c50</code></p><h3 id="php解码程序"><a href="#php解码程序" class="headerlink" title="php解码程序"></a>php解码程序</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">class getRealVideo&#123;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> http_get(<span class="variable">$url</span>) &#123;</span><br><span class="line"><span class="variable">$oCurl</span> = curl_init ();</span><br><span class="line"><span class="keyword">if</span> (stripos ( <span class="variable">$url</span>, <span class="string">"https://"</span> ) !== FALSE) &#123;</span><br><span class="line">curl_setopt ( <span class="variable">$oCurl</span>, CURLOPT_SSL_VERIFYPEER, FALSE );</span><br><span class="line">curl_setopt ( <span class="variable">$oCurl</span>, CURLOPT_SSL_VERIFYHOST, FALSE );</span><br><span class="line">&#125;</span><br><span class="line">curl_setopt ( <span class="variable">$oCurl</span>, CURLOPT_URL, <span class="variable">$url</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$oCurl</span>, CURLOPT_RETURNTRANSFER, 1 );</span><br><span class="line"><span class="variable">$sContent</span> = curl_exec ( <span class="variable">$oCurl</span> );</span><br><span class="line"><span class="variable">$aStatus</span> = curl_getinfo ( <span class="variable">$oCurl</span> );</span><br><span class="line">curl_close ( <span class="variable">$oCurl</span> );</span><br><span class="line"><span class="keyword">if</span> (intval ( <span class="variable">$aStatus</span> [<span class="string">"http_code"</span>] ) == 200) &#123;</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$sContent</span>;</span><br><span class="line">&#125; <span class="keyword">else</span> &#123;</span><br><span class="line"><span class="built_in">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//通过vid参数换取源地址</span><br><span class="line"><span class="keyword">function</span> realVideo(array <span class="variable">$vids</span>)&#123;</span><br><span class="line"><span class="keyword">if</span>(empty(<span class="variable">$vids</span>) || !is_array(<span class="variable">$vids</span>))&#123;</span><br><span class="line"><span class="built_in">return</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$getUrl</span> = <span class="string">'https://h5vv.video.qq.com/getinfo?'</span>;</span><br><span class="line"><span class="variable">$realUrl</span> = <span class="string">'http://ugcws.video.gtimg.com/%s?vkey=%s&amp;br=56&amp;platform=2&amp;fmt=auto&amp;level=0&amp;sdtfrom=v5010&amp;guid=a3527bbc8888951591bc3a67c2bc9c50'</span>;</span><br><span class="line"><span class="variable">$newVideo</span> = [];</span><br><span class="line">foreach(<span class="variable">$vids</span> as <span class="variable">$value</span>)&#123;</span><br><span class="line"><span class="keyword">if</span>(!empty(<span class="variable">$value</span>))&#123;</span><br><span class="line"><span class="variable">$vid</span> = <span class="variable">$value</span>;</span><br><span class="line">//获取真正的视频源地址</span><br><span class="line"><span class="variable">$data</span> = [</span><br><span class="line"><span class="string">'platform'</span> =&gt; 11001,</span><br><span class="line"><span class="string">'charge'</span> =&gt; 0,</span><br><span class="line"><span class="string">'otype'</span> =&gt; <span class="string">'json'</span>,</span><br><span class="line"><span class="string">'ehost'</span> =&gt; <span class="string">'https://v.qq.com'</span>,</span><br><span class="line"><span class="string">'sphls'</span> =&gt; 1,</span><br><span class="line"><span class="string">'sb'</span> =&gt; 1,</span><br><span class="line"><span class="string">'nocache'</span> =&gt; 0,</span><br><span class="line"><span class="string">'_rnd'</span> =&gt; time(),</span><br><span class="line"><span class="string">'guid'</span> =&gt; <span class="string">'a3527bbc8888951591bc3a67c2bc9c50'</span>,</span><br><span class="line"><span class="string">'appVer'</span> =&gt; <span class="string">'V2.0Build9496'</span>,</span><br><span class="line"><span class="string">'vids'</span> =&gt; <span class="variable">$vid</span>,</span><br><span class="line"><span class="string">'defaultfmt'</span> =&gt; <span class="string">'auto'</span>,</span><br><span class="line"><span class="string">'_qv_rmt'</span> =&gt; <span class="string">'jJPtBTyoA12993HPU='</span>,</span><br><span class="line"><span class="string">'_qv_rmt2'</span> =&gt; <span class="string">'pS3QdOqZ150285Jdg='</span>,</span><br><span class="line"><span class="string">'sdtfrom'</span> =&gt; <span class="string">'v5010'</span></span><br><span class="line">];</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_get(<span class="variable">$getUrl</span>.http_build_query(<span class="variable">$data</span>));</span><br><span class="line"><span class="keyword">if</span>(!empty(<span class="variable">$result</span>))&#123;</span><br><span class="line"><span class="variable">$result</span> = explode(<span class="string">'='</span>, <span class="variable">$result</span>);</span><br><span class="line"><span class="keyword">if</span>(!empty(<span class="variable">$result</span>) &amp;&amp; !empty(<span class="variable">$result</span>[1]))&#123;</span><br><span class="line"><span class="variable">$json</span> = substr(<span class="variable">$result</span>[1], 0, strlen(<span class="variable">$result</span>[1])-1);</span><br><span class="line"><span class="variable">$json</span> = json_decode(<span class="variable">$json</span>, <span class="literal">true</span>);</span><br><span class="line"><span class="keyword">if</span>(json_last_error() == <span class="string">'JSON_ERROR_NONE'</span>)&#123;</span><br><span class="line"><span class="keyword">if</span>(!empty(<span class="variable">$json</span>[<span class="string">'vl'</span>][<span class="string">'vi'</span>][0][<span class="string">'fn'</span>]) &amp;&amp; !empty(<span class="variable">$json</span>[<span class="string">'vl'</span>][<span class="string">'vi'</span>][0][<span class="string">'fvkey'</span>]))&#123;</span><br><span class="line"><span class="variable">$fn</span> = <span class="variable">$json</span>[<span class="string">'vl'</span>][<span class="string">'vi'</span>][0][<span class="string">'fn'</span>];</span><br><span class="line"><span class="variable">$fvkey</span> = <span class="variable">$json</span>[<span class="string">'vl'</span>][<span class="string">'vi'</span>][0][<span class="string">'fvkey'</span>];</span><br><span class="line"><span class="variable">$returnUrl</span> = sprintf(<span class="variable">$realUrl</span>, <span class="variable">$fn</span>, <span class="variable">$fvkey</span>);</span><br><span class="line"><span class="variable">$newVideo</span>[<span class="variable">$value</span>] = <span class="variable">$returnUrl</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$newVideo</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">## 使用方法</span></span><br><span class="line"><span class="variable">$RealVideo</span> = new getRealVideo();</span><br><span class="line"><span class="variable">$realvideo</span> = <span class="variable">$RealVideo</span>-&gt;realVideo([<span class="string">'r0519gvbvsj'</span>]);</span><br><span class="line">var_dump(<span class="variable">$realvideo</span>);</span><br><span class="line">?&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">###结果如下</span></span><br><span class="line">array(1) &#123;</span><br><span class="line">  [<span class="string">"r0519gvbvsj"</span>]=&gt;</span><br><span class="line">  string(376) <span class="string">"http://ugcws.video.gtimg.com/r0519gvbvsj.mp4?vkey=2C231D07B09D86572B36E66F3B45A96CF7E390079C0AE61002D65336AB7406B033851BF3F24C6372392D1720FF0B4D29D905C481335FF15409EE7427FF2517E804BFCFBD95FFAED757A4464F09B1DDCD1B38F23E16E714598699DDA2D1728C1C525B360EFF67C067053A8C83AC6826EA6F127F274D771AE7&amp;br=56&amp;platform=2&amp;fmt=auto&amp;level=0&amp;sdtfrom=v5010&amp;guid=a3527bbc8888951591bc3a67c2bc9c50"</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><p>这个解出来的视频源地址是有时间限制的，大概是4到5小时的有效时间，过了这一段时间后就会失效，需要重新获取一次，所以这个解出来的源地址不适合直接入库，适合当做缓存，例如写入redis，然后每隔4小时重新获取一次。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;前几天开发微信小程序的时候需要用到腾讯视频的内容，但是小程序的video标签只支持视频源地址，我们在腾讯视频网站上找到的分享链接并不是视频的源地址，例如：&lt;br&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gut
      
    
    </summary>
    
      <category term="php" scheme="http://whatcode.cn/categories/php/"/>
    
      <category term="other" scheme="http://whatcode.cn/categories/php/other/"/>
    
    
      <category term="php" scheme="http://whatcode.cn/tags/php/"/>
    
      <category term="other" scheme="http://whatcode.cn/tags/other/"/>
    
  </entry>
  
  <entry>
    <title>微信小程序HTML、MarkDown富文本解析插件-wxParse</title>
    <link href="http://whatcode.cn/2018/03/16/wxapp-plugin/"/>
    <id>http://whatcode.cn/2018/03/16/wxapp-plugin/</id>
    <published>2018-03-15T16:00:00.000Z</published>
    <updated>2018-03-16T11:09:23.000Z</updated>
    
    <content type="html"><![CDATA[<p>小程序有自己本身的wxml解析器，但是不能直接支持html标签，如果想弄一个新闻资讯类的小程序是比较蛋疼的，幸好互联网有大神在，这个问题得到了解决。下面介绍的是这个html转wxml神器-wxParse。<a href="https://github.com/icindy/wxParse" target="_blank" rel="noopener">github地址</a></p><h3 id="使用方法"><a href="#使用方法" class="headerlink" title="使用方法"></a>使用方法</h3><p>1、首先我们在github上下载wxParse，下载完之后我们需要用到目录下的wxParse文件夹，把他拷贝到我们的项目目录下<br>2、在app.wxss全局样式文件中，需要引入wxParse的样式表（如果不需要全局引入样式，可以在需要使用的pages页面下的.wxss文件引入此文件）<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">@import <span class="string">"/wxParse/wxParse.wxss"</span>;</span><br></pre></td></tr></table></figure></p><p>3、在pages页面下的.js文件引入wxParse<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">var WxParse = require(<span class="string">'../../wxParse/wxParse.js'</span>);</span><br></pre></td></tr></table></figure></p><p>4、在pages页面下的.wxml文件引入wxParse<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&lt;import src=<span class="string">"../../wxParse/wxParse.wxml"</span>/&gt; </span><br><span class="line">&lt;view class=<span class="string">"wxParse"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParse"</span> data=<span class="string">"&#123;&#123;wxParseData:article.nodes&#125;&#125;"</span>/&gt;</span><br><span class="line">&lt;/view&gt;</span><br></pre></td></tr></table></figure></p><p>5、调用WxParse.wxParse方法来设置html内容<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">/**</span><br><span class="line">* WxParse.wxParse(bindName , <span class="built_in">type</span>, data, target,imagePadding)</span><br><span class="line">* 1.bindName绑定的数据名(必填)</span><br><span class="line">* 2.type可以为html或者md(必填)</span><br><span class="line">* 3.data为传入的具体数据(必填)</span><br><span class="line">* 4.target为Page对象,一般为this(必填)</span><br><span class="line">* 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选)</span><br><span class="line">*/</span><br><span class="line">Page(&#123;</span><br><span class="line">  data: &#123;</span><br><span class="line">  &#125;,</span><br><span class="line">  onLoad: <span class="function"><span class="title">function</span></span> () &#123;</span><br><span class="line">    var that = this;</span><br><span class="line">    wx.request(&#123;</span><br><span class="line">        url: <span class="string">''</span>, </span><br><span class="line">        method: <span class="string">'POST'</span>,</span><br><span class="line">        success: <span class="keyword">function</span>(res) &#123;</span><br><span class="line">            var article = res.data.content;</span><br><span class="line">            WxParse.wxParse(<span class="string">'article'</span>, <span class="string">'html'</span>, article, that,5);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;)</span><br><span class="line">  &#125;</span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></p><p>到这一步就OK了，整个使用流程很简单，大部分的HTML标签都能正确的解析，可能样式会有点出入。</p><h3 id="修改标签"><a href="#修改标签" class="headerlink" title="修改标签"></a>修改标签</h3><p>目前发现有两个标签解析不成功的：audio语音标签，iframe模式video标签。<br>例如：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;audio src=<span class="string">"https://res.wx.qq.com/voice/getvoice?mediaid=MzUyMTE2ODMzNV8yMjQ3NDg1NzQ2"</span>&gt;&lt;/audio&gt;</span><br></pre></td></tr></table></figure></p><p>wxParse解析出来的是：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;view class=<span class="string">"wxParse-audio"</span>&gt;&lt;/view&gt;</span><br></pre></td></tr></table></figure></p><p>这个在小程序里面就播放不了语音了，这里需要修改wxParse.wxml源码，加上audio标签支持，下面是修改过后的wxParse.wxml源码<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br><span class="line">741</span><br><span class="line">742</span><br><span class="line">743</span><br><span class="line">744</span><br><span class="line">745</span><br><span class="line">746</span><br><span class="line">747</span><br><span class="line">748</span><br><span class="line">749</span><br><span class="line">750</span><br><span class="line">751</span><br><span class="line">752</span><br><span class="line">753</span><br><span class="line">754</span><br><span class="line">755</span><br><span class="line">756</span><br><span class="line">757</span><br><span class="line">758</span><br><span class="line">759</span><br><span class="line">760</span><br><span class="line">761</span><br><span class="line">762</span><br><span class="line">763</span><br><span class="line">764</span><br><span class="line">765</span><br><span class="line">766</span><br><span class="line">767</span><br><span class="line">768</span><br><span class="line">769</span><br><span class="line">770</span><br><span class="line">771</span><br><span class="line">772</span><br><span class="line">773</span><br><span class="line">774</span><br><span class="line">775</span><br><span class="line">776</span><br><span class="line">777</span><br><span class="line">778</span><br><span class="line">779</span><br><span class="line">780</span><br><span class="line">781</span><br><span class="line">782</span><br><span class="line">783</span><br><span class="line">784</span><br><span class="line">785</span><br><span class="line">786</span><br><span class="line">787</span><br><span class="line">788</span><br><span class="line">789</span><br><span class="line">790</span><br><span class="line">791</span><br><span class="line">792</span><br><span class="line">793</span><br><span class="line">794</span><br><span class="line">795</span><br><span class="line">796</span><br><span class="line">797</span><br><span class="line">798</span><br><span class="line">799</span><br><span class="line">800</span><br><span class="line">801</span><br><span class="line">802</span><br><span class="line">803</span><br><span class="line">804</span><br><span class="line">805</span><br><span class="line">806</span><br><span class="line">807</span><br><span class="line">808</span><br><span class="line">809</span><br><span class="line">810</span><br><span class="line">811</span><br><span class="line">812</span><br><span class="line">813</span><br><span class="line">814</span><br><span class="line">815</span><br><span class="line">816</span><br><span class="line">817</span><br><span class="line">818</span><br><span class="line">819</span><br><span class="line">820</span><br><span class="line">821</span><br><span class="line">822</span><br><span class="line">823</span><br><span class="line">824</span><br><span class="line">825</span><br><span class="line">826</span><br><span class="line">827</span><br><span class="line">828</span><br><span class="line">829</span><br><span class="line">830</span><br><span class="line">831</span><br><span class="line">832</span><br><span class="line">833</span><br><span class="line">834</span><br><span class="line">835</span><br><span class="line">836</span><br><span class="line">837</span><br><span class="line">838</span><br><span class="line">839</span><br><span class="line">840</span><br><span class="line">841</span><br><span class="line">842</span><br><span class="line">843</span><br><span class="line">844</span><br><span class="line">845</span><br><span class="line">846</span><br><span class="line">847</span><br><span class="line">848</span><br><span class="line">849</span><br><span class="line">850</span><br><span class="line">851</span><br><span class="line">852</span><br><span class="line">853</span><br><span class="line">854</span><br><span class="line">855</span><br><span class="line">856</span><br><span class="line">857</span><br><span class="line">858</span><br><span class="line">859</span><br><span class="line">860</span><br><span class="line">861</span><br><span class="line">862</span><br><span class="line">863</span><br><span class="line">864</span><br><span class="line">865</span><br><span class="line">866</span><br><span class="line">867</span><br><span class="line">868</span><br><span class="line">869</span><br><span class="line">870</span><br><span class="line">871</span><br><span class="line">872</span><br><span class="line">873</span><br><span class="line">874</span><br><span class="line">875</span><br><span class="line">876</span><br><span class="line">877</span><br><span class="line">878</span><br><span class="line">879</span><br><span class="line">880</span><br><span class="line">881</span><br><span class="line">882</span><br><span class="line">883</span><br><span class="line">884</span><br><span class="line">885</span><br><span class="line">886</span><br><span class="line">887</span><br><span class="line">888</span><br><span class="line">889</span><br><span class="line">890</span><br><span class="line">891</span><br><span class="line">892</span><br><span class="line">893</span><br><span class="line">894</span><br><span class="line">895</span><br><span class="line">896</span><br><span class="line">897</span><br><span class="line">898</span><br><span class="line">899</span><br><span class="line">900</span><br><span class="line">901</span><br><span class="line">902</span><br><span class="line">903</span><br><span class="line">904</span><br><span class="line">905</span><br><span class="line">906</span><br><span class="line">907</span><br><span class="line">908</span><br><span class="line">909</span><br><span class="line">910</span><br><span class="line">911</span><br><span class="line">912</span><br><span class="line">913</span><br><span class="line">914</span><br><span class="line">915</span><br><span class="line">916</span><br><span class="line">917</span><br><span class="line">918</span><br><span class="line">919</span><br><span class="line">920</span><br><span class="line">921</span><br><span class="line">922</span><br><span class="line">923</span><br><span class="line">924</span><br><span class="line">925</span><br><span class="line">926</span><br><span class="line">927</span><br><span class="line">928</span><br><span class="line">929</span><br><span class="line">930</span><br><span class="line">931</span><br><span class="line">932</span><br><span class="line">933</span><br><span class="line">934</span><br><span class="line">935</span><br><span class="line">936</span><br><span class="line">937</span><br><span class="line">938</span><br><span class="line">939</span><br><span class="line">940</span><br><span class="line">941</span><br><span class="line">942</span><br><span class="line">943</span><br><span class="line">944</span><br><span class="line">945</span><br><span class="line">946</span><br><span class="line">947</span><br><span class="line">948</span><br><span class="line">949</span><br><span class="line">950</span><br><span class="line">951</span><br><span class="line">952</span><br><span class="line">953</span><br><span class="line">954</span><br><span class="line">955</span><br><span class="line">956</span><br><span class="line">957</span><br><span class="line">958</span><br><span class="line">959</span><br><span class="line">960</span><br><span class="line">961</span><br><span class="line">962</span><br><span class="line">963</span><br><span class="line">964</span><br><span class="line">965</span><br><span class="line">966</span><br><span class="line">967</span><br><span class="line">968</span><br><span class="line">969</span><br><span class="line">970</span><br><span class="line">971</span><br><span class="line">972</span><br><span class="line">973</span><br><span class="line">974</span><br><span class="line">975</span><br><span class="line">976</span><br><span class="line">977</span><br><span class="line">978</span><br><span class="line">979</span><br><span class="line">980</span><br><span class="line">981</span><br><span class="line">982</span><br><span class="line">983</span><br><span class="line">984</span><br><span class="line">985</span><br><span class="line">986</span><br><span class="line">987</span><br><span class="line">988</span><br><span class="line">989</span><br><span class="line">990</span><br><span class="line">991</span><br><span class="line">992</span><br><span class="line">993</span><br><span class="line">994</span><br><span class="line">995</span><br><span class="line">996</span><br><span class="line">997</span><br><span class="line">998</span><br><span class="line">999</span><br><span class="line">1000</span><br><span class="line">1001</span><br><span class="line">1002</span><br><span class="line">1003</span><br><span class="line">1004</span><br><span class="line">1005</span><br><span class="line">1006</span><br><span class="line">1007</span><br><span class="line">1008</span><br><span class="line">1009</span><br><span class="line">1010</span><br><span class="line">1011</span><br><span class="line">1012</span><br><span class="line">1013</span><br><span class="line">1014</span><br><span class="line">1015</span><br><span class="line">1016</span><br><span class="line">1017</span><br><span class="line">1018</span><br><span class="line">1019</span><br><span class="line">1020</span><br><span class="line">1021</span><br><span class="line">1022</span><br><span class="line">1023</span><br><span class="line">1024</span><br><span class="line">1025</span><br><span class="line">1026</span><br><span class="line">1027</span><br><span class="line">1028</span><br><span class="line">1029</span><br><span class="line">1030</span><br><span class="line">1031</span><br><span class="line">1032</span><br><span class="line">1033</span><br><span class="line">1034</span><br></pre></td><td class="code"><pre><span class="line">&lt;!--**</span><br><span class="line"> * author: Di (微信小程序开发工程师)</span><br><span class="line"> * organization: WeAppDev(微信小程序开发论坛)(http://weappdev.com)</span><br><span class="line"> *               垂直微信小程序开发交流社区</span><br><span class="line"> * </span><br><span class="line"> * github地址: https://github.com/icindy/wxParse</span><br><span class="line"> * </span><br><span class="line"> * <span class="keyword">for</span>: 微信小程序富文本解析</span><br><span class="line"> * detail : http://weappdev.com/t/wxparse-alpha0-1-html-markdown/184</span><br><span class="line"> */--&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--基础元素--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParseVideo"</span>&gt;</span><br><span class="line">  &lt;!--增加video标签支持，并循环添加--&gt;</span><br><span class="line">  &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;video class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;-video"</span> src=<span class="string">"&#123;&#123;item.attr.src&#125;&#125;"</span>&gt;&lt;/video&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;template name=<span class="string">"wxParseAudio"</span>&gt;</span><br><span class="line">  &lt;!--增加audio标签支持--&gt;</span><br><span class="line">  &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;audio class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> src=<span class="string">"&#123;&#123;item.attr.src&#125;&#125;"</span> name=<span class="string">"&#123;&#123;item.attr.title&#125;&#125;"</span> author=<span class="string">"91教育"</span> id=<span class="string">"mpvoice"</span> controls loop&gt;&lt;/audio&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;template name=<span class="string">"wxParseImg"</span>&gt;</span><br><span class="line">  &lt;image class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-from=<span class="string">"&#123;&#123;item.from&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.src&#125;&#125;"</span> data-idx=<span class="string">"&#123;&#123;item.imgIndex&#125;&#125;"</span> src=<span class="string">"&#123;&#123;item.attr.src&#125;&#125;"</span> mode=<span class="string">"aspectFit"</span> bindload=<span class="string">"wxParseImgLoad"</span> bindtap=<span class="string">"wxParseImgTap"</span> mode=<span class="string">"widthFix"</span> style=<span class="string">"width:&#123;&#123;item.width&#125;&#125;px;"</span></span><br><span class="line">  /&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;template name=<span class="string">"WxEmojiView"</span>&gt;</span><br><span class="line">  &lt;view class=<span class="string">"WxEmojiView wxParse-inline"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.textArray&#125;&#125;"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">      &lt;block class=<span class="string">"&#123;&#123;item.text == '\\n' ? 'wxParse-hide':''&#125;&#125;"</span> wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;&#123;&#123;item.text&#125;&#125;&lt;/block&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;image class=<span class="string">"wxEmoji"</span> src=<span class="string">"&#123;&#123;item.baseSrc&#125;&#125;&#123;&#123;item.text&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">  &lt;/view&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;template name=<span class="string">"WxParseBr"</span>&gt;</span><br><span class="line">  &lt;text&gt;\n&lt;/text&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line">&lt;!--入口模版--&gt;</span><br><span class="line"></span><br><span class="line">&lt;template name=<span class="string">"wxParse"</span>&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;wxParseData&#125;&#125;"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">    &lt;template is=<span class="string">"wxParse0"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse0"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'table'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse1"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse1"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse2"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse2"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse3"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse3"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse4"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse4"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse5"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse5"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse6"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse6"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse7"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse7"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse8"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse8"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse9"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse9"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse10"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse10"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse11"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br><span class="line"></span><br><span class="line">&lt;!--循环模版--&gt;</span><br><span class="line">&lt;template name=<span class="string">"wxParse11"</span>&gt;</span><br><span class="line">  &lt;!--&lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;--&gt;</span><br><span class="line">  &lt;!--判断是否是标签节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.node == 'element'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">if</span>=<span class="string">"&#123;&#123;item.tag == 'button'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;button <span class="built_in">type</span>=<span class="string">"default"</span> size=<span class="string">"mini"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/button&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--li类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'li'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-inner"</span>&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-circle"</span>&gt;&lt;/view&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">          &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-li-text"</span>&gt;</span><br><span class="line">            &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">              &lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">            &lt;/block&gt;</span><br><span class="line">          &lt;/view&gt;</span><br><span class="line">        &lt;/view&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--video类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'video'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseVideo"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--audio--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'audio'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseAudio"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span>/&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--img类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'img'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"wxParseImg"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--a类型--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'a'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view bindtap=<span class="string">"wxParseTagATap"</span> class=<span class="string">"wxParse-inline &#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> data-src=<span class="string">"&#123;&#123;item.attr.href&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tag == 'br'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;template is=<span class="string">"WxParseBr"</span>&gt;&lt;/template&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line">    &lt;!--其他块级标签--&gt;</span><br><span class="line">    &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.tagType == 'block'&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;view class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">        &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">          &lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">        &lt;/block&gt;</span><br><span class="line">      &lt;/view&gt;</span><br><span class="line">    &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">    &lt;!--内联标签--&gt;</span><br><span class="line">    &lt;view wx:<span class="keyword">else</span> class=<span class="string">"&#123;&#123;item.classStr&#125;&#125; wxParse-&#123;&#123;item.tag&#125;&#125; wxParse-&#123;&#123;item.tagType&#125;&#125;"</span> style=<span class="string">"&#123;&#123;item.styleStr&#125;&#125;"</span>&gt;</span><br><span class="line">      &lt;block wx:<span class="keyword">for</span>=<span class="string">"&#123;&#123;item.nodes&#125;&#125;"</span> wx:<span class="keyword">for</span>-item=<span class="string">"item"</span> wx:key=<span class="string">""</span>&gt;</span><br><span class="line">        &lt;template is=<span class="string">"wxParse12"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">      &lt;/block&gt;</span><br><span class="line">    &lt;/view&gt;</span><br><span class="line"></span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">  &lt;!--判断是否是文本节点--&gt;</span><br><span class="line">  &lt;block wx:<span class="keyword">elif</span>=<span class="string">"&#123;&#123;item.node == 'text'&#125;&#125;"</span>&gt;</span><br><span class="line">    &lt;!--如果是，直接进行--&gt;</span><br><span class="line">    &lt;template is=<span class="string">"WxEmojiView"</span> data=<span class="string">"&#123;&#123;item&#125;&#125;"</span> /&gt;</span><br><span class="line">  &lt;/block&gt;</span><br><span class="line"></span><br><span class="line">&lt;/template&gt;</span><br></pre></td></tr></table></figure></p><p>iframe模式下视频标签处理方法<br>例如：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;iframe src=<span class="string">"https://v.qq.com/iframe/player.html?vid=i0326plycep&amp;amp;tiny=0&amp;amp;auto=0"</span> width=<span class="string">"345"</span> height=<span class="string">"194.0625"</span> frameborder=<span class="string">"0"</span> allowfullscreen=<span class="string">"allowfullscreen"</span> align=<span class="string">"none"</span>&gt;&lt;/iframe&gt;</span><br></pre></td></tr></table></figure></p><p>解决方法：把iframe标签直接换成video标签<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;video src=<span class="string">"https://v.qq.com/iframe/player.html?vid=i0326plycep&amp;amp;tiny=0&amp;amp;auto=0"</span> width=<span class="string">"345"</span> height=<span class="string">"194.0625"</span> frameborder=<span class="string">"0"</span> allowfullscreen=<span class="string">"allowfullscreen"</span> align=<span class="string">"none"</span>&gt;&lt;/video&gt;</span><br></pre></td></tr></table></figure></p><p>这样就能正常显示video标签，如果用的腾讯视频，可能播放不了，视频的分享地址不是视频的源地址，需要换成真正的源地址才能正常播放。下一篇介绍如何获取腾讯视频的源地址。</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><p>1、wxParse插件解析速度还是不错的，只是样式可能有点出入，这个需要针对性调整<br>2、支持表情标签<br>3、整个插件才150K左右，轻量化</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;小程序有自己本身的wxml解析器，但是不能直接支持html标签，如果想弄一个新闻资讯类的小程序是比较蛋疼的，幸好互联网有大神在，这个问题得到了解决。下面介绍的是这个html转wxml神器-wxParse。&lt;a href=&quot;https://github.com/icindy/
      
    
    </summary>
    
      <category term="weixin" scheme="http://whatcode.cn/categories/weixin/"/>
    
      <category term="wxapp" scheme="http://whatcode.cn/categories/weixin/wxapp/"/>
    
    
      <category term="weixin" scheme="http://whatcode.cn/tags/weixin/"/>
    
      <category term="wxapp" scheme="http://whatcode.cn/tags/wxapp/"/>
    
  </entry>
  
  <entry>
    <title>订阅号实现统计不同渠道的关注数的方法</title>
    <link href="http://whatcode.cn/2018/03/07/wechat-qrcode-subscribe/"/>
    <id>http://whatcode.cn/2018/03/07/wechat-qrcode-subscribe/</id>
    <published>2018-03-06T16:00:00.000Z</published>
    <updated>2018-03-07T08:02:16.000Z</updated>
    
    <content type="html"><![CDATA[<p>做过微信公众号开发的人应该都知道，只有认证服务号有生成带参数的二维码接口权限，可以统计不同渠道的二维码关注来源，其他类型的公众号都没有这个接口权限，有很多微信订阅公众号的运营者却又很需要这样的功能，那到底能不能实现这样的功能呢？或者说利用其他工具实现呢？答案是有的！提前条件是开发者账号+认证服务号。</p><h3 id="实现原理"><a href="#实现原理" class="headerlink" title="实现原理"></a>实现原理</h3><p><img src="http://oitxstie2.bkt.clouddn.com/WX20180307-155834.png" alt=""></p><h3 id="详细步骤"><a href="#详细步骤" class="headerlink" title="详细步骤"></a>详细步骤</h3><p>1、将认证公众号和订阅号同时绑定到同一个开发者账号，这一步的目的是获取用户的unionID，下面会用到这个unionID，这一步很关键。<br>2、利用认证服务号的网页授权权限，生成一个二维码给用户扫码授权<br><code>https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&amp;redirect_uri=REDIRECT_URI&amp;response_type=code&amp;scope=snsapi_userinfo&amp;state=STATE#wechat_redirect</code><br>这一步有两个参数很关键，scope=snsapi_userinfo这样才能获取到unionID，state参数可以随机一个字符串，但是需要唯一值，用于作为此二维码的唯一标识。至于生成二维码有很多方式，可以找第三方开源库生成，或者第三方平台生成都可以。<br>3、用户扫码授权后，会跳转到redirect_uri地址上，我们在这步里面可以获取到用户的openID和unionID，将state参数和unionID参数记录到数据库，后面的统计来源需要用到。（这一步的网页授权获取openID和unionID可以参考微信的开发文档）获取到用户的openID和unionID之后，我们需要跳转到一个引导用户关注的页面，比如是专门的引导关注的订阅号文章，直接点击公众号名字就可以直接关注，这样用户体验相对会好一些。这里看大家发挥了。<br>4、根据关注推送事件，后台就可以获取到每一个用户关注后的openID和unionID，然后通过unionID参数去查找state数据，这样就可以统计到每一个state值的关注用户数，也就是认证服务号的带参数二维码的功能。</p><h3 id="缺点"><a href="#缺点" class="headerlink" title="缺点"></a>缺点</h3><p>1、比较麻烦，需要准备开发者账号和认证服务号<br>2、用户体验也不好，不能直接扫码关注，这一步可能很多用户会跑掉<br>3、统计的数据不能百分百准确，用户可能授权之后可能在其他途径关注公众号，来源不能完全精准。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;做过微信公众号开发的人应该都知道，只有认证服务号有生成带参数的二维码接口权限，可以统计不同渠道的二维码关注来源，其他类型的公众号都没有这个接口权限，有很多微信订阅公众号的运营者却又很需要这样的功能，那到底能不能实现这样的功能呢？或者说利用其他工具实现呢？答案是有的！提前条件
      
    
    </summary>
    
      <category term="weixin" scheme="http://whatcode.cn/categories/weixin/"/>
    
      <category term="qrcode" scheme="http://whatcode.cn/categories/weixin/qrcode/"/>
    
    
      <category term="weixin" scheme="http://whatcode.cn/tags/weixin/"/>
    
      <category term="qrcode" scheme="http://whatcode.cn/tags/qrcode/"/>
    
  </entry>
  
  <entry>
    <title>Mac下安装php+mysql+nginx</title>
    <link href="http://whatcode.cn/2018/01/07/Mac-install-nginx/"/>
    <id>http://whatcode.cn/2018/01/07/Mac-install-nginx/</id>
    <published>2018-01-06T16:00:00.000Z</published>
    <updated>2018-01-09T01:26:55.000Z</updated>
    
    <content type="html"><![CDATA[<p>Mac下安装开发环境很简单，和ubuntu下面用apt命令安装开发环境一样，Mac可以用brew命令。</p><h3 id="安装-Homebrew"><a href="#安装-Homebrew" class="headerlink" title="安装 Homebrew"></a>安装 Homebrew</h3><p>如果已经安装了Homebrew可以跳过这一步。安装Homebrew就可以用brew命令安装软件了，这一点和Ubuntu不一样，Ubuntu自带apt命令，Mac需要自行安装。<br>打开终端，输入一下命令，回车<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">/usr/bin/ruby -e <span class="string">"<span class="variable">$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)</span>"</span></span><br></pre></td></tr></table></figure></p><p>安装完Homebrew就可以快乐的使用brew命令安装其他软件了</p><h3 id="brew安装php7"><a href="#brew安装php7" class="headerlink" title="brew安装php7"></a>brew安装php7</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## brew search 可以先查找一下有没有这个软件</span></span><br><span class="line">brew search php70</span><br><span class="line"><span class="comment">## 可以看到有一堆关于php7.0的软件，这里直接安装php70</span></span><br><span class="line">brew install php70</span><br></pre></td></tr></table></figure><p>安装完，我们可以用：php -v 查看是否已经成功安装了<br>brew启动php的命令,使用一次之后，下次都是自动启动的<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew services start homebrew/php/php70</span><br></pre></td></tr></table></figure></p><p>也可以用下面的命令查看怎么启动软件<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew info php70</span><br></pre></td></tr></table></figure></p><p>brew的其他用法可以用brew –help查看具体用法</p><h3 id="brew安装nginx"><a href="#brew安装nginx" class="headerlink" title="brew安装nginx"></a>brew安装nginx</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install nginx</span><br></pre></td></tr></table></figure><p>安装完，可以nginx -v 看看是否已经安装成功，或者直接在浏览器里面输入：localhost:8080(默认8080端口)</p><h3 id="brew安装mysql"><a href="#brew安装mysql" class="headerlink" title="brew安装mysql"></a>brew安装mysql</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">brew install mysql</span><br></pre></td></tr></table></figure><p>安装完，可以mysql -v 看看是否已经安装成功<br>启动MySQL服务，修改root的密码(默认是没密码)<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">brew services start mysql</span><br><span class="line"><span class="comment">## 进入MySQL的安全策略模式</span></span><br><span class="line">mysql_secure_installation</span><br><span class="line"><span class="comment">## 按照提示输入root密码，这一步看提示操作，不详讲</span></span><br></pre></td></tr></table></figure></p><h3 id="修改nginx默认端口"><a href="#修改nginx默认端口" class="headerlink" title="修改nginx默认端口"></a>修改nginx默认端口</h3><p>brew安装nginx的默认端口是8080，为什么默认是8080端口而不是80端口呢，有两个原因：1、Mac系统自带的Apache需要占用80端口 2、Mac系统不允许system级以外的服务使用1024以下的端口。<br>做开发的时，我们的习惯性用的80端口，不想每次调试时都需要多输入端口数<br>这里我们需要把nginx的homebrew.mxcl.nginx.plist文件复制到/Library/LaunchDaemons目录下,执行launchctl load -w<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo cp /usr/<span class="built_in">local</span>/opt/nginx/*.plist /Library/LaunchDaemons</span><br><span class="line">sudo launchctl load -w /Library/LaunchDaemons/homebrew.mxcl.nginx.plist</span><br></pre></td></tr></table></figure></p><p>修改nginx.conf文件，改为listen 80，启动nginx<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">vi /usr/<span class="built_in">local</span>/etc/nginx/nginx.conf</span><br><span class="line"><span class="comment">## 找到8080端口，修改为80端口,保存退出</span></span><br><span class="line"><span class="comment">## 启动nginx，这里的启动命令变了，不能用brew启动了</span></span><br><span class="line">sudo nginx</span><br><span class="line"><span class="comment">## 重启 sudo nginx -s reload</span></span><br><span class="line"><span class="comment">## 停止 sudo nginx -s stop</span></span><br></pre></td></tr></table></figure></p><p>打开浏览器，输入：localhost，应该可以看到nginx的欢迎界面了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;Mac下安装开发环境很简单，和ubuntu下面用apt命令安装开发环境一样，Mac可以用brew命令。&lt;/p&gt;
&lt;h3 id=&quot;安装-Homebrew&quot;&gt;&lt;a href=&quot;#安装-Homebrew&quot; class=&quot;headerlink&quot; title=&quot;安装 Homebrew
      
    
    </summary>
    
      <category term="Mac" scheme="http://whatcode.cn/categories/Mac/"/>
    
    
      <category term="Mac" scheme="http://whatcode.cn/tags/Mac/"/>
    
  </entry>
  
  <entry>
    <title>修改mysql5.7的用户密码</title>
    <link href="http://whatcode.cn/2018/01/07/Mac-mysql-password/"/>
    <id>http://whatcode.cn/2018/01/07/Mac-mysql-password/</id>
    <published>2018-01-06T16:00:00.000Z</published>
    <updated>2018-01-09T01:26:55.000Z</updated>
    
    <content type="html"><![CDATA[<p>MySQL5.7版本加入了密码安全策略机制，修改用户的密码必须符合安全策略的规则，否则无法修改。这对于本地开发来说，有点不方便，密码太长容易忘记，我本地的MySQL密码一般都是123456，这样就不会忘记了，下面我们通过修改MySQL的安全策略来修改用户的密码长度。</p><h3 id="查看现有的密码策略"><a href="#查看现有的密码策略" class="headerlink" title="查看现有的密码策略"></a>查看现有的密码策略</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW VARIABLES LIKE <span class="string">'validate_password%'</span>;</span><br><span class="line">+--------------------------------------+--------+</span><br><span class="line">| Variable_name                        | Value  |</span><br><span class="line">+--------------------------------------+--------+</span><br><span class="line">| validate_password_check_user_name    | OFF    |</span><br><span class="line">| validate_password_dictionary_file    |        |</span><br><span class="line">| validate_password_length             | 8      |</span><br><span class="line">| validate_password_mixed_case_count   | 1      |</span><br><span class="line">| validate_password_number_count       | 1      |</span><br><span class="line">| validate_password_policy             | MEDIUM |</span><br><span class="line">| validate_password_special_char_count | 1      |</span><br><span class="line">+--------------------------------------+--------+</span><br></pre></td></tr></table></figure><p>参数解释：<br>1).validate_password_dictionary_file 指定密码验证的文件路径;<br>2).validate_password_length  密码最小长度<br>3).validate_password_mixed_case_count  密码至少要包含的小写字母个数和大写字母个数;<br>4).validate_password_number_count  密码至少要包含的数字个数<br>5).validate_password_policy 密码强度检查等级，对应等级为：0/LOW、1/MEDIUM、2/STRONG,默认为1<br>注意：<br>0/LOW：只检查长度;<br>1/MEDIUM：检查长度、数字、大小写、特殊字符;<br>2/STRONG：检查长度、数字、大小写、特殊字符字典文件。<br>6).validate_password_special_char_count密码至少要包含的特殊字符数</p><h3 id="修改用户密码"><a href="#修改用户密码" class="headerlink" title="修改用户密码"></a>修改用户密码</h3><p>可以看到，现在MySQL的安全策略的等级是MEDIUM，也就是密码需要：数字、字母大小写、特殊字符这三种组合，并且不能少于8位。比如我现在想把root密码改为123456，是改不了的<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; <span class="built_in">set</span> password <span class="keyword">for</span> <span class="string">'root'</span>@<span class="string">'localhost'</span>=password(<span class="string">'123456'</span>);</span><br><span class="line">ERROR 1819 (HY000): Your password does not satisfy the current policy requirements</span><br></pre></td></tr></table></figure></p><p>MySQL直接报错，因为密码不符合安全策略的规则。所以我们需要通过修改安全策略规则来实现目的<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; <span class="built_in">set</span> global validate_password_policy=0;</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br><span class="line"></span><br><span class="line">mysql&gt; <span class="built_in">set</span> global validate_password_length=6;</span><br><span class="line">Query OK, 0 rows affected (0.00 sec)</span><br></pre></td></tr></table></figure></p><p>把MySQL的安全策略等级降为0，验证密码的长度改为6，我们再看一下现在的安全策略：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; SHOW VARIABLES LIKE <span class="string">'validate_password%'</span>;</span><br><span class="line">+--------------------------------------+-------+</span><br><span class="line">| Variable_name                        | Value |</span><br><span class="line">+--------------------------------------+-------+</span><br><span class="line">| validate_password_check_user_name    | OFF   |</span><br><span class="line">| validate_password_dictionary_file    |       |</span><br><span class="line">| validate_password_length             | 6     |</span><br><span class="line">| validate_password_mixed_case_count   | 1     |</span><br><span class="line">| validate_password_number_count       | 1     |</span><br><span class="line">| validate_password_policy             | LOW   |</span><br><span class="line">| validate_password_special_char_count | 1     |</span><br><span class="line">+--------------------------------------+-------+</span><br><span class="line">7 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure></p><p>可以看到，MySQL的安全策略已经符合我们的要求了，现在可以愉快的修改你密码了<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mysql&gt; <span class="built_in">set</span> password <span class="keyword">for</span> <span class="string">'root'</span>@<span class="string">'localhost'</span>=password(<span class="string">'123456'</span>);</span><br><span class="line">Query OK, 0 rows affected, 1 warning (0.00 sec)</span><br></pre></td></tr></table></figure></p><p>已经不报错了，大功告成！！<br><strong>注意：这里只能用于本地环境操作，切勿用于生产环境</strong></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;MySQL5.7版本加入了密码安全策略机制，修改用户的密码必须符合安全策略的规则，否则无法修改。这对于本地开发来说，有点不方便，密码太长容易忘记，我本地的MySQL密码一般都是123456，这样就不会忘记了，下面我们通过修改MySQL的安全策略来修改用户的密码长度。&lt;/p&gt;
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="mysql" scheme="http://whatcode.cn/categories/Linux/mysql/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="mysql" scheme="http://whatcode.cn/tags/mysql/"/>
    
  </entry>
  
  <entry>
    <title>微信支付--APP支付开发</title>
    <link href="http://whatcode.cn/2017/12/23/wechat-pay-3/"/>
    <id>http://whatcode.cn/2017/12/23/wechat-pay-3/</id>
    <published>2017-12-22T16:00:00.000Z</published>
    <updated>2017-12-25T02:29:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>微信APP支付开发的流程跟前面所讲的微信公众号支付开发、微信扫码开发基本一致，但是所需要的appid和mch_id不一样，这个是比较坑的地方，而且微信的开发文档并没有明显说明这一点，导致很多开发者在这一步掉坑。下面会在开发过程中特殊所遇到的坑与解决方法。</p><h3 id="一、前期准备工作"><a href="#一、前期准备工作" class="headerlink" title="一、前期准备工作"></a>一、前期准备工作</h3><p>1、申请一个微信开发者账号<br>2、创建APP应用<br>3、申请开通该APP应用支付功能（会开通一个新的微信商户后台，跟公众号的商户后台不是同一个，注意：商户号mch_id也不是同一个）<br>4、备案的域名+服务器（这个是必备的）</p><h3 id="二、微信公众号支付开发流程"><a href="#二、微信公众号支付开发流程" class="headerlink" title="二、微信公众号支付开发流程"></a>二、微信公众号支付开发流程</h3><p><img src="http://oitxstie2.bkt.clouddn.com/wxpay-3.png" alt=""><br>1、根据微信支付文档封装支付参数，调用微信支付统一下单接口向微信服务器发起请求，返回微信预支付交易会话标识。<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank" rel="noopener">微信文档链接</a><br>2、封装APP端需要的支付接口参数<br>3、APP应用接收支付参数，调起微信APP支付。</p><h3 id="三、代码开发流程"><a href="#三、代码开发流程" class="headerlink" title="三、代码开发流程"></a>三、代码开发流程</h3><p>前面粗略讲解了微信APP支付的开发流程，理解起来应该是相对简单。下面是示例代码(只是测试代码，不要用于生产环境)：<br>1、调用微信统一下单接口，获取微信预支付交易会话标识。<br>调用统一下单接口类 wxpay.class.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php </span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line">* 微信支付</span><br><span class="line">*/</span><br><span class="line">class WxPay</span><br><span class="line">&#123;</span><br><span class="line">private <span class="variable">$apiUrl</span> = <span class="string">'https://api.mch.weixin.qq.com/pay/unifiedorder'</span>;</span><br><span class="line">private <span class="variable">$key</span>;</span><br><span class="line">private <span class="variable">$mch_id</span>;</span><br><span class="line">private <span class="variable">$appid</span>;</span><br><span class="line">private <span class="variable">$openid</span>;</span><br><span class="line">private <span class="variable">$nonce_str</span>;</span><br><span class="line">private <span class="variable">$body</span>;</span><br><span class="line">private <span class="variable">$out_trade_no</span>;</span><br><span class="line">private <span class="variable">$total_fee</span>;</span><br><span class="line">private <span class="variable">$spbill_create_ip</span>;</span><br><span class="line">private <span class="variable">$notify_url</span>;</span><br><span class="line">private <span class="variable">$trade_type</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> __construct(<span class="variable">$attributes</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="variable">$this</span>-&gt;key = <span class="variable">$attributes</span>[<span class="string">'key'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;mch_id = <span class="variable">$attributes</span>[<span class="string">'mch_id'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;appid = <span class="variable">$attributes</span>[<span class="string">'appid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;openid = <span class="variable">$attributes</span>[<span class="string">'openid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;body = <span class="variable">$attributes</span>[<span class="string">'body'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;total_fee = <span class="variable">$attributes</span>[<span class="string">'total_fee'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;trade_type = <span class="variable">$attributes</span>[<span class="string">'trade_type'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;notify_url = <span class="variable">$attributes</span>[<span class="string">'notify_url'</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//发送post请求</span><br><span class="line"><span class="keyword">function</span> http_post(<span class="variable">$url</span>, <span class="variable">$param</span>) &#123;</span><br><span class="line">    <span class="variable">$header</span> [] = <span class="string">"content-type: application/json; charset=UTF-8"</span>;</span><br><span class="line">    <span class="variable">$ch</span> = curl_init ();</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_CUSTOMREQUEST, <span class="string">"POST"</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYPEER, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYHOST, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_HTTPHEADER, <span class="variable">$header</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_USERAGENT, <span class="string">'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_FOLLOWLOCATION, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_AUTOREFERER, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_POSTFIELDS, <span class="variable">$param</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="literal">true</span> );</span><br><span class="line">    <span class="variable">$res</span> = curl_exec ( <span class="variable">$ch</span> );</span><br><span class="line"></span><br><span class="line">    curl_close ( <span class="variable">$ch</span> );</span><br><span class="line">    </span><br><span class="line">    //<span class="variable">$res</span> = json_decode ( <span class="variable">$res</span>, <span class="literal">true</span> );</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//数组转换为xml格式</span><br><span class="line"><span class="keyword">function</span> arrayToXml(<span class="variable">$arr</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="variable">$xml</span> = <span class="string">"&lt;xml&gt;"</span>;</span><br><span class="line">    foreach (<span class="variable">$arr</span> as <span class="variable">$key</span>=&gt;<span class="variable">$val</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (is_numeric(<span class="variable">$val</span>))&#123;</span><br><span class="line">            <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>.<span class="variable">$val</span>.<span class="string">"&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">             <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;&lt;![CDATA["</span>.<span class="variable">$val</span>.<span class="string">"]]&gt;&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$xml</span>.=<span class="string">"&lt;/xml&gt;"</span>;</span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$xml</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//将XML转为数组</span><br><span class="line"><span class="keyword">function</span> xmlToArray(<span class="variable">$xml</span>)</span><br><span class="line">&#123;    </span><br><span class="line">    //禁止引用外部xml实体</span><br><span class="line">    libxml_disable_entity_loader(<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$values</span> = json_decode(json_encode(simplexml_load_string(<span class="variable">$xml</span>, <span class="string">'SimpleXMLElement'</span>, LIBXML_NOCDATA)), <span class="literal">true</span>);        </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$values</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//支付参数签名</span><br><span class="line"><span class="keyword">function</span> paySign(<span class="variable">$array</span>, <span class="variable">$key</span>)&#123;</span><br><span class="line">ksort(<span class="variable">$array</span>);</span><br><span class="line"><span class="variable">$str</span> = <span class="string">''</span>;</span><br><span class="line">foreach(<span class="variable">$array</span> as <span class="variable">$k</span> =&gt; <span class="variable">$value</span>)&#123;</span><br><span class="line"><span class="variable">$str</span> .= <span class="variable">$k</span>.<span class="string">'='</span>.<span class="variable">$value</span>.<span class="string">'&amp;'</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$str</span> .= <span class="string">"key="</span>.<span class="variable">$key</span>;</span><br><span class="line"><span class="variable">$str</span> = strtoupper(md5(<span class="variable">$str</span>));</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$str</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//生成随机字符串</span><br><span class="line"><span class="keyword">function</span> get_rand_char(<span class="variable">$length</span> = 6, <span class="variable">$type</span> = 1) &#123;</span><br><span class="line">    <span class="variable">$str1</span> = <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"</span>;</span><br><span class="line">    <span class="variable">$str2</span> = <span class="string">"0123456789"</span>;</span><br><span class="line">    <span class="variable">$strLength1</span> = 61;</span><br><span class="line">    <span class="variable">$strLength2</span> = 9;</span><br><span class="line">    <span class="variable">$res</span> = <span class="string">''</span>;</span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$type</span> == 1)&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str1</span> [rand ( 0, <span class="variable">$strLength1</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str2</span> [rand ( 0, <span class="variable">$strLength2</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//获取IP</span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">get_client_ip</span></span>() &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'REMOTE_ADDR'</span>];</span><br><span class="line"><span class="keyword">if</span> (isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>]) &amp;&amp; preg_match(<span class="string">'/^([0-9]&#123;1,3&#125;\.)&#123;3&#125;[0-9]&#123;1,3&#125;$/'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>])) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>];</span><br><span class="line">&#125; elseif(isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>]) AND preg_match_all(<span class="string">'#\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;#s'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>], <span class="variable">$matches</span>)) &#123;</span><br><span class="line">foreach (<span class="variable">$matches</span>[0] AS <span class="variable">$xip</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (!preg_match(<span class="string">'#^(10|172\.16|192\.168)\.#'</span>, <span class="variable">$xip</span>)) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$xip</span>;</span><br><span class="line"><span class="built_in">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">return</span> <span class="variable">$ip</span> == <span class="string">'::1'</span> ? <span class="string">'127.0.0.1'</span> : <span class="variable">$ip</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">prepare</span></span>()&#123;</span><br><span class="line"><span class="variable">$payConfig</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'openid'</span> =&gt; <span class="variable">$this</span>-&gt;openid,</span><br><span class="line"><span class="string">'nonce_str'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$this</span>-&gt;body,</span><br><span class="line"><span class="string">'out_trade_no'</span> =&gt; date(<span class="string">'YmdHis'</span>).<span class="variable">$this</span>-&gt;get_rand_char(6,1),</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$this</span>-&gt;total_fee,</span><br><span class="line"><span class="string">'spbill_create_ip'</span> =&gt; <span class="variable">$this</span>-&gt;get_client_ip(),</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$this</span>-&gt;notify_url,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$this</span>-&gt;trade_type,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$sign</span> = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$payConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="variable">$payConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$sign</span>;</span><br><span class="line"><span class="variable">$payXML</span> = <span class="variable">$this</span>-&gt;arrayToXml(<span class="variable">$payConfig</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$this</span>-&gt;apiUrl, <span class="variable">$payXML</span>);</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$this</span>-&gt;xmlToArray(<span class="variable">$result</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">qr_prepare</span></span>()&#123;</span><br><span class="line"><span class="variable">$payConfig</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'nonce_str'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$this</span>-&gt;body,</span><br><span class="line"><span class="string">'out_trade_no'</span> =&gt; date(<span class="string">'YmdHis'</span>).<span class="variable">$this</span>-&gt;get_rand_char(6,1),</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$this</span>-&gt;total_fee,</span><br><span class="line"><span class="string">'spbill_create_ip'</span> =&gt; <span class="variable">$this</span>-&gt;get_client_ip(),</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$this</span>-&gt;notify_url,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$this</span>-&gt;trade_type,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$sign</span> = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$payConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="variable">$payConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$sign</span>;</span><br><span class="line"><span class="variable">$payXML</span> = <span class="variable">$this</span>-&gt;arrayToXml(<span class="variable">$payConfig</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$this</span>-&gt;apiUrl, <span class="variable">$payXML</span>);</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$this</span>-&gt;xmlToArray(<span class="variable">$result</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> configForPayment(<span class="variable">$prepayId</span>)&#123;</span><br><span class="line"><span class="variable">$jsPayConfig</span> = [</span><br><span class="line"><span class="string">'appId'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'timeStamp'</span> =&gt; strval(time()),</span><br><span class="line"><span class="string">'nonceStr'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'package'</span> =&gt; <span class="string">"prepay_id=<span class="variable">$prepayId</span>"</span>,</span><br><span class="line"><span class="string">'signType'</span> =&gt; <span class="string">'MD5'</span>,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$jsPayConfig</span>[<span class="string">'paySign'</span>] = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$jsPayConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="built_in">return</span> json_encode(<span class="variable">$jsPayConfig</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> configForApp(<span class="variable">$prepayId</span>)&#123;</span><br><span class="line"><span class="variable">$PayConfig</span> = [</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'partnerid'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'prepayid'</span> =&gt; <span class="variable">$prepayId</span>,</span><br><span class="line"><span class="string">'package'</span> =&gt; <span class="string">'Sign=WXPay'</span>,</span><br><span class="line"><span class="string">'nonceStr'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'timestamp'</span> =&gt; strval(time()),</span><br><span class="line">];</span><br><span class="line"><span class="variable">$PayConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$PayConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="built_in">return</span> json_encode(<span class="variable">$PayConfig</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>测试代码 test.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">//引入微信支付类</span><br><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line"></span><br><span class="line">//APPID(微信开放平台审核通过的应用APPID)</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//商户号(微信开放平台对应的商户平台的商户号)</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'100'</span>;</span><br><span class="line">//微信支付类型(注意支付类型不要搞错，这里用APP)</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'APP'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;qr_prepare();</span><br><span class="line">//打印输出<span class="variable">$result</span></span><br><span class="line">print_r(<span class="variable">$result</span>);</span><br><span class="line">//如果提示“商户未开通此接口权限”，有两个可能：1、商户号mch_id填错了,appid填错了 2、该APP应用没用开通微信支付，第一种可能性最大</span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure></p><p>2、封装APP端需要的支付接口参数<br>测试代码：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">//引入微信支付类</span><br><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line"></span><br><span class="line">//APPID(微信开放平台审核通过的应用APPID)</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//商户号(微信开放平台对应的商户平台的商户号)</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'100'</span>;</span><br><span class="line">//微信支付类型(注意支付类型不要搞错，这里用APP)</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'APP'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;qr_prepare();</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$result</span>[<span class="string">'return_code'</span>] == <span class="string">'SUCCESS'</span> &amp;&amp; <span class="variable">$result</span>[<span class="string">'result_code'</span>] == <span class="string">'SUCCESS'</span>)&#123;</span><br><span class="line"><span class="variable">$appPayConfig</span> = <span class="variable">$wxpay</span>-&gt;configForApp(<span class="variable">$result</span>[<span class="string">'prepay_id'</span>]);</span><br><span class="line">//APP端需要的支付参数（安卓或者IOS）</span><br><span class="line">print_r(<span class="variable">$appPayConfig</span>)</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>如果到这一步都没问题，那么剩下的就是安卓端或者IOS端的事情了。</p><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>微信APP支付开发的流程跟前面所讲的微信公众号支付开发、微信扫码开发基本一致，但是所需要的appid和mch_id不一样，这里很容易搞错，加上微信的开发文档没有特殊说明，加上商户后台众多，很容易就掉坑。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;微信APP支付开发的流程跟前面所讲的微信公众号支付开发、微信扫码开发基本一致，但是所需要的appid和mch_id不一样，这个是比较坑的地方，而且微信的开发文档并没有明显说明这一点，导致很多开发者在这一步掉坑。下面会在开发过程中特殊所遇到的坑与解决方法。&lt;/p&gt;
&lt;h3 i
      
    
    </summary>
    
      <category term="weixin" scheme="http://whatcode.cn/categories/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/categories/weixin/pay/"/>
    
    
      <category term="weixin" scheme="http://whatcode.cn/tags/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/tags/pay/"/>
    
  </entry>
  
  <entry>
    <title>微信支付--扫码支付开发</title>
    <link href="http://whatcode.cn/2017/12/21/wechat-pay-2/"/>
    <id>http://whatcode.cn/2017/12/21/wechat-pay-2/</id>
    <published>2017-12-20T16:00:00.000Z</published>
    <updated>2017-12-25T02:29:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>微信扫码支付相对<a href="https://whatcode.cn/2017/12/20/wechat-pay/">微信公众号支付</a>来说，开发流程简单很多，不需要网页授权，不要调用微信内置WeixinJSBridge对象。只需要生成二维码，微信扫码即可直接调起微信支付。下面我们来讲解一下微信扫码的开发流程，包括简单的代码测试。</p><h3 id="一、前期准备工作"><a href="#一、前期准备工作" class="headerlink" title="一、前期准备工作"></a>一、前期准备工作</h3><p>1、申请一个认证服务号，并且开通支付功能<br>2、备案的域名+服务器（这个是必备的）</p><h3 id="二、微信公众号支付开发流程"><a href="#二、微信公众号支付开发流程" class="headerlink" title="二、微信公众号支付开发流程"></a>二、微信公众号支付开发流程</h3><p><img src="http://oitxstie2.bkt.clouddn.com/wxpay-2.png" alt=""><br>1、根据微信支付文档封装支付参数，调用微信支付统一下单接口向微信服务器发起请求，返回微信二维码链接。<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank" rel="noopener">微信文档链接</a><br>2、将微信二维码链接生成二维码图片</p><h3 id="三、代码开发流程"><a href="#三、代码开发流程" class="headerlink" title="三、代码开发流程"></a>三、代码开发流程</h3><p>前面粗略讲解了微信扫码支付的开发流程，理解起来应该是相对简单。下面是示例代码(只是测试代码，不要用于生产环境)：<br>1、调用微信统一下单接口，获取微信预支付交易会话标识和微信二维码链接。<br>调用统一下单接口类 wxpay.class.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php </span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line">* 微信支付</span><br><span class="line">*/</span><br><span class="line">class WxPay</span><br><span class="line">&#123;</span><br><span class="line">private <span class="variable">$apiUrl</span> = <span class="string">'https://api.mch.weixin.qq.com/pay/unifiedorder'</span>;</span><br><span class="line">private <span class="variable">$key</span>;</span><br><span class="line">private <span class="variable">$mch_id</span>;</span><br><span class="line">private <span class="variable">$appid</span>;</span><br><span class="line">private <span class="variable">$openid</span>;</span><br><span class="line">private <span class="variable">$nonce_str</span>;</span><br><span class="line">private <span class="variable">$body</span>;</span><br><span class="line">private <span class="variable">$out_trade_no</span>;</span><br><span class="line">private <span class="variable">$total_fee</span>;</span><br><span class="line">private <span class="variable">$spbill_create_ip</span>;</span><br><span class="line">private <span class="variable">$notify_url</span>;</span><br><span class="line">private <span class="variable">$trade_type</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> __construct(<span class="variable">$attributes</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="variable">$this</span>-&gt;key = <span class="variable">$attributes</span>[<span class="string">'key'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;mch_id = <span class="variable">$attributes</span>[<span class="string">'mch_id'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;appid = <span class="variable">$attributes</span>[<span class="string">'appid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;openid = <span class="variable">$attributes</span>[<span class="string">'openid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;body = <span class="variable">$attributes</span>[<span class="string">'body'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;total_fee = <span class="variable">$attributes</span>[<span class="string">'total_fee'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;trade_type = <span class="variable">$attributes</span>[<span class="string">'trade_type'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;notify_url = <span class="variable">$attributes</span>[<span class="string">'notify_url'</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//发送post请求</span><br><span class="line"><span class="keyword">function</span> http_post(<span class="variable">$url</span>, <span class="variable">$param</span>) &#123;</span><br><span class="line">    <span class="variable">$header</span> [] = <span class="string">"content-type: application/json; charset=UTF-8"</span>;</span><br><span class="line">    <span class="variable">$ch</span> = curl_init ();</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_CUSTOMREQUEST, <span class="string">"POST"</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYPEER, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYHOST, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_HTTPHEADER, <span class="variable">$header</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_USERAGENT, <span class="string">'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_FOLLOWLOCATION, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_AUTOREFERER, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_POSTFIELDS, <span class="variable">$param</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="literal">true</span> );</span><br><span class="line">    <span class="variable">$res</span> = curl_exec ( <span class="variable">$ch</span> );</span><br><span class="line"></span><br><span class="line">    curl_close ( <span class="variable">$ch</span> );</span><br><span class="line">    </span><br><span class="line">    //<span class="variable">$res</span> = json_decode ( <span class="variable">$res</span>, <span class="literal">true</span> );</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//数组转换为xml格式</span><br><span class="line"><span class="keyword">function</span> arrayToXml(<span class="variable">$arr</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="variable">$xml</span> = <span class="string">"&lt;xml&gt;"</span>;</span><br><span class="line">    foreach (<span class="variable">$arr</span> as <span class="variable">$key</span>=&gt;<span class="variable">$val</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (is_numeric(<span class="variable">$val</span>))&#123;</span><br><span class="line">            <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>.<span class="variable">$val</span>.<span class="string">"&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">             <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;&lt;![CDATA["</span>.<span class="variable">$val</span>.<span class="string">"]]&gt;&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$xml</span>.=<span class="string">"&lt;/xml&gt;"</span>;</span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$xml</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//将XML转为数组</span><br><span class="line"><span class="keyword">function</span> xmlToArray(<span class="variable">$xml</span>)</span><br><span class="line">&#123;    </span><br><span class="line">    //禁止引用外部xml实体</span><br><span class="line">    libxml_disable_entity_loader(<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$values</span> = json_decode(json_encode(simplexml_load_string(<span class="variable">$xml</span>, <span class="string">'SimpleXMLElement'</span>, LIBXML_NOCDATA)), <span class="literal">true</span>);        </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$values</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//支付参数签名</span><br><span class="line"><span class="keyword">function</span> paySign(<span class="variable">$array</span>, <span class="variable">$key</span>)&#123;</span><br><span class="line">ksort(<span class="variable">$array</span>);</span><br><span class="line"><span class="variable">$str</span> = <span class="string">''</span>;</span><br><span class="line">foreach(<span class="variable">$array</span> as <span class="variable">$k</span> =&gt; <span class="variable">$value</span>)&#123;</span><br><span class="line"><span class="variable">$str</span> .= <span class="variable">$k</span>.<span class="string">'='</span>.<span class="variable">$value</span>.<span class="string">'&amp;'</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$str</span> .= <span class="string">"key="</span>.<span class="variable">$key</span>;</span><br><span class="line"><span class="variable">$str</span> = strtoupper(md5(<span class="variable">$str</span>));</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$str</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//生成随机字符串</span><br><span class="line"><span class="keyword">function</span> get_rand_char(<span class="variable">$length</span> = 6, <span class="variable">$type</span> = 1) &#123;</span><br><span class="line">    <span class="variable">$str1</span> = <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"</span>;</span><br><span class="line">    <span class="variable">$str2</span> = <span class="string">"0123456789"</span>;</span><br><span class="line">    <span class="variable">$strLength1</span> = 61;</span><br><span class="line">    <span class="variable">$strLength2</span> = 9;</span><br><span class="line">    <span class="variable">$res</span> = <span class="string">''</span>;</span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$type</span> == 1)&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str1</span> [rand ( 0, <span class="variable">$strLength1</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str2</span> [rand ( 0, <span class="variable">$strLength2</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//获取IP</span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">get_client_ip</span></span>() &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'REMOTE_ADDR'</span>];</span><br><span class="line"><span class="keyword">if</span> (isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>]) &amp;&amp; preg_match(<span class="string">'/^([0-9]&#123;1,3&#125;\.)&#123;3&#125;[0-9]&#123;1,3&#125;$/'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>])) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>];</span><br><span class="line">&#125; elseif(isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>]) AND preg_match_all(<span class="string">'#\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;#s'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>], <span class="variable">$matches</span>)) &#123;</span><br><span class="line">foreach (<span class="variable">$matches</span>[0] AS <span class="variable">$xip</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (!preg_match(<span class="string">'#^(10|172\.16|192\.168)\.#'</span>, <span class="variable">$xip</span>)) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$xip</span>;</span><br><span class="line"><span class="built_in">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">return</span> <span class="variable">$ip</span> == <span class="string">'::1'</span> ? <span class="string">'127.0.0.1'</span> : <span class="variable">$ip</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">prepare</span></span>()&#123;</span><br><span class="line"><span class="variable">$payConfig</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'openid'</span> =&gt; <span class="variable">$this</span>-&gt;openid,</span><br><span class="line"><span class="string">'nonce_str'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$this</span>-&gt;body,</span><br><span class="line"><span class="string">'out_trade_no'</span> =&gt; date(<span class="string">'YmdHis'</span>).<span class="variable">$this</span>-&gt;get_rand_char(6,1),</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$this</span>-&gt;total_fee,</span><br><span class="line"><span class="string">'spbill_create_ip'</span> =&gt; <span class="variable">$this</span>-&gt;get_client_ip(),</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$this</span>-&gt;notify_url,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$this</span>-&gt;trade_type,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$sign</span> = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$payConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="variable">$payConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$sign</span>;</span><br><span class="line"><span class="variable">$payXML</span> = <span class="variable">$this</span>-&gt;arrayToXml(<span class="variable">$payConfig</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$this</span>-&gt;apiUrl, <span class="variable">$payXML</span>);</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$this</span>-&gt;xmlToArray(<span class="variable">$result</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">qr_prepare</span></span>()&#123;</span><br><span class="line"><span class="variable">$payConfig</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'nonce_str'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$this</span>-&gt;body,</span><br><span class="line"><span class="string">'out_trade_no'</span> =&gt; date(<span class="string">'YmdHis'</span>).<span class="variable">$this</span>-&gt;get_rand_char(6,1),</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$this</span>-&gt;total_fee,</span><br><span class="line"><span class="string">'spbill_create_ip'</span> =&gt; <span class="variable">$this</span>-&gt;get_client_ip(),</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$this</span>-&gt;notify_url,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$this</span>-&gt;trade_type,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$sign</span> = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$payConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="variable">$payConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$sign</span>;</span><br><span class="line"><span class="variable">$payXML</span> = <span class="variable">$this</span>-&gt;arrayToXml(<span class="variable">$payConfig</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$this</span>-&gt;apiUrl, <span class="variable">$payXML</span>);</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$this</span>-&gt;xmlToArray(<span class="variable">$result</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> configForPayment(<span class="variable">$prepayId</span>)&#123;</span><br><span class="line"><span class="variable">$jsPayConfig</span> = [</span><br><span class="line"><span class="string">'appId'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'timeStamp'</span> =&gt; strval(time()),</span><br><span class="line"><span class="string">'nonceStr'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'package'</span> =&gt; <span class="string">"prepay_id=<span class="variable">$prepayId</span>"</span>,</span><br><span class="line"><span class="string">'signType'</span> =&gt; <span class="string">'MD5'</span>,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$jsPayConfig</span>[<span class="string">'paySign'</span>] = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$jsPayConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="built_in">return</span> json_encode(<span class="variable">$jsPayConfig</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>测试代码 test.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">//引入微信支付类</span><br><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line"></span><br><span class="line">//APPID</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//商户号</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'100'</span>;</span><br><span class="line">//微信支付类型</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'NATIVE'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;qr_prepare();</span><br><span class="line">//打印输出<span class="variable">$result</span></span><br><span class="line">print_r(<span class="variable">$result</span>);</span><br><span class="line"></span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure></p><p>2、生成微信支付二维码<br>测试代码：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line"></span><br><span class="line">//APPID</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//商户号</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'1'</span>;</span><br><span class="line">//微信支付类型</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'NATIVE'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;qr_prepare();</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$result</span>[<span class="string">'return_code'</span>] == <span class="string">'SUCCESS'</span> &amp;&amp; <span class="variable">$result</span>[<span class="string">'result_code'</span>] == <span class="string">'SUCCESS'</span>)&#123;</span><br><span class="line">//利用微信提供的在线生成二维码功能</span><br><span class="line"><span class="variable">$wxpay_url</span> = urlencode(<span class="variable">$result</span>[<span class="string">'code_url'</span>]);</span><br><span class="line"><span class="built_in">echo</span> <span class="string">'&lt;img src="http://paysdk.weixin.qq.com/example/qrcode.php?data='</span>.<span class="variable">$wxpay_url</span>.<span class="string">'" style="width:150px;height:150px;"/&gt;'</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>这一步的生成二维码图片可以用第三方的类库，github上有很多，这里是为了方便测试就直接用微信提供的测试在线二维码接口。</p><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>微信扫码支付开发流程相对公众号支付开发少了用户授权登录一步，后台配置了也少了两步，不需要配置授权域名，支付目录。注意支付参数不要弄错，trade_type=NATIVE。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;微信扫码支付相对&lt;a href=&quot;https://whatcode.cn/2017/12/20/wechat-pay/&quot;&gt;微信公众号支付&lt;/a&gt;来说，开发流程简单很多，不需要网页授权，不要调用微信内置WeixinJSBridge对象。只需要生成二维码，微信扫码即可直接调起微
      
    
    </summary>
    
      <category term="weixin" scheme="http://whatcode.cn/categories/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/categories/weixin/pay/"/>
    
    
      <category term="weixin" scheme="http://whatcode.cn/tags/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/tags/pay/"/>
    
  </entry>
  
  <entry>
    <title>微信支付--公众号支付开发</title>
    <link href="http://whatcode.cn/2017/12/20/wechat-pay/"/>
    <id>http://whatcode.cn/2017/12/20/wechat-pay/</id>
    <published>2017-12-19T16:00:00.000Z</published>
    <updated>2017-12-21T08:11:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>微信支付分好几种支付场景，1、微信公众号内支付、2、微信扫码支付、3、H5支付（微信浏览器之外的其他浏览器）4、小程序支付、5、APP支付（第三方应用调起微信支付）、6、    刷卡支付（收银员用扫码设备扫描用户的二维码）。下面我们来讲解一下微信公众号支付的开发流程，包括简单的代码测试。</p><h3 id="一、前期准备工作"><a href="#一、前期准备工作" class="headerlink" title="一、前期准备工作"></a>一、前期准备工作</h3><p>1、申请一个认证服务号，并且开通支付功能<br>2、在公众号后台设置好网页授权域名，微信商户后台设置好支付授权目录<br><strong>这两步是整个公众号支付流程的关键步骤，确保正确设置。如果不清楚怎么设置，这一步可以先自行度娘。</strong><br>3、备案的域名+服务器（这个是必备的）</p><h3 id="二、微信公众号支付开发流程"><a href="#二、微信公众号支付开发流程" class="headerlink" title="二、微信公众号支付开发流程"></a>二、微信公众号支付开发流程</h3><p><img src="http://oitxstie2.bkt.clouddn.com/wxpay-1.png" alt=""><br>1、根据微信支付文档封装支付参数，调用微信支付统一下单接口向微信服务器发起请求，返回预支付交易会话标识。<a href="https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1" target="_blank" rel="noopener">微信文档链接</a><br>2、封装JS支付参数，调用微信浏览器内置WeixinJSBridge对象，直接调起微信支付。</p><h3 id="三、代码开发流程"><a href="#三、代码开发流程" class="headerlink" title="三、代码开发流程"></a>三、代码开发流程</h3><p>前面粗略讲解了微信公众号支付的开发流程，理解起来应该是相对简单。下面是示例代码(只是测试代码，不要用于生产环境)：<br>1、第一步先获取用户openid，openid是公众号支付的一个重要参数，这里我们用微信网页授权接口来获取用户openid。<br><strong>需要设置好网页域名授权，前期准备工作的第二步</strong><br>微信页面授权类 thirdAuth.class.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php </span><br><span class="line"></span><br><span class="line">class ThirdAuth&#123;</span><br><span class="line"></span><br><span class="line">    private <span class="variable">$code_url</span> = <span class="string">'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&amp;redirect_uri=%s&amp;response_type=code&amp;scope=%s&amp;state=%s#wechat_redirect'</span>;</span><br><span class="line">    private <span class="variable">$access_token_url</span> = <span class="string">'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&amp;secret=%s&amp;code=%s&amp;grant_type=authorization_code'</span>;</span><br><span class="line">    private <span class="variable">$redirect_url</span>;</span><br><span class="line">    private <span class="variable">$appid</span>;</span><br><span class="line">    private <span class="variable">$appsecret</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> __construct(<span class="variable">$appid</span>, <span class="variable">$appsecret</span>, <span class="variable">$redirect_url</span>)&#123;</span><br><span class="line">    <span class="variable">$this</span>-&gt;appid = <span class="variable">$appid</span>;</span><br><span class="line">    <span class="variable">$this</span>-&gt;appsecret = <span class="variable">$appsecret</span>;</span><br><span class="line">    <span class="variable">$this</span>-&gt;redirect_url = <span class="variable">$redirect_url</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public <span class="keyword">function</span> authCode(<span class="variable">$state</span> = <span class="string">''</span>)&#123;</span><br><span class="line">        <span class="variable">$makeUrl</span> = <span class="variable">$this</span>-&gt;makeCodeUrl(<span class="variable">$this</span>-&gt;code_url, <span class="variable">$this</span>-&gt;appid, urlencode(<span class="variable">$this</span>-&gt;redirect_url), <span class="string">'snsapi_base'</span>, <span class="variable">$state</span>);</span><br><span class="line">        header(<span class="string">'Location:'</span>.<span class="variable">$makeUrl</span>);</span><br><span class="line">        <span class="built_in">return</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">function</span> getCode(<span class="variable">$code</span>, <span class="variable">$state</span> = <span class="string">''</span>)&#123;</span><br><span class="line"></span><br><span class="line">        <span class="variable">$openid</span> = <span class="variable">$this</span>-&gt;getOpenid(<span class="variable">$code</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span>(empty(<span class="variable">$openid</span>))&#123;</span><br><span class="line">            <span class="variable">$this</span>-&gt;authCode(<span class="variable">$state</span>);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="built_in">return</span> <span class="variable">$openid</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public <span class="keyword">function</span> getOpenid(<span class="variable">$code</span>)&#123;</span><br><span class="line">        <span class="variable">$makeUrl</span> = <span class="variable">$this</span>-&gt;makeAccessTokenUrl(<span class="variable">$this</span>-&gt;access_token_url, <span class="variable">$this</span>-&gt;appid, <span class="variable">$this</span>-&gt;appsecret, <span class="variable">$code</span>);</span><br><span class="line">        <span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$makeUrl</span>);</span><br><span class="line">        <span class="keyword">if</span>(!empty(<span class="variable">$result</span>[<span class="string">'openid'</span>]))&#123;</span><br><span class="line">        <span class="built_in">return</span> <span class="variable">$result</span>[<span class="string">'openid'</span>];</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        <span class="built_in">return</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public <span class="keyword">function</span> makeCodeUrl(<span class="variable">$url</span>, <span class="variable">$appid</span>, <span class="variable">$redirect_uri</span>, <span class="variable">$scope</span>, <span class="variable">$state</span>)&#123;</span><br><span class="line">        <span class="built_in">return</span> sprintf(<span class="variable">$url</span>, <span class="variable">$appid</span>, <span class="variable">$redirect_uri</span>, <span class="variable">$scope</span>, <span class="variable">$state</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    public <span class="keyword">function</span> makeAccessTokenUrl(<span class="variable">$url</span>, <span class="variable">$appid</span>, <span class="variable">$secret</span>, <span class="variable">$code</span>)&#123;</span><br><span class="line">        <span class="built_in">return</span> sprintf(<span class="variable">$url</span>, <span class="variable">$appid</span>, <span class="variable">$secret</span>, <span class="variable">$code</span>);</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    //发送post请求</span><br><span class="line"><span class="keyword">function</span> http_post(<span class="variable">$url</span>, <span class="variable">$param</span>) &#123;</span><br><span class="line"><span class="variable">$header</span> [] = <span class="string">"content-type: application/json; charset=UTF-8"</span>;</span><br><span class="line"><span class="variable">$ch</span> = curl_init ();</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_CUSTOMREQUEST, <span class="string">"POST"</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYPEER, FALSE );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYHOST, FALSE );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_HTTPHEADER, <span class="variable">$header</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_USERAGENT, <span class="string">'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_FOLLOWLOCATION, 1 );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_AUTOREFERER, 1 );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_POSTFIELDS, <span class="variable">$param</span> );</span><br><span class="line">curl_setopt ( <span class="variable">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="literal">true</span> );</span><br><span class="line"><span class="variable">$res</span> = curl_exec ( <span class="variable">$ch</span> );</span><br><span class="line"></span><br><span class="line">curl_close ( <span class="variable">$ch</span> );</span><br><span class="line">    </span><br><span class="line"><span class="variable">$res</span> = json_decode ( <span class="variable">$res</span>, <span class="literal">true</span> );</span><br><span class="line">    </span><br><span class="line"><span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">？&gt;</span><br></pre></td></tr></table></figure></p><p>测试脚本 test.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">//引入微信页面授权类</span><br><span class="line">include <span class="string">'thirdAuth.class.php'</span>;</span><br><span class="line">//公众号appid</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//公众号appsecret</span><br><span class="line"><span class="variable">$appsecret</span> = <span class="string">'APPSECRET'</span>;</span><br><span class="line">//页面回调域名</span><br><span class="line"><span class="variable">$redirect_url</span> = <span class="string">'http://whatcode.cn/test.php'</span>;</span><br><span class="line"><span class="variable">$thirdAuth</span> = new ThirdAuth(<span class="variable">$appid</span>, <span class="variable">$appsecret</span>, <span class="variable">$redirect_url</span>);</span><br><span class="line"><span class="variable">$state</span> = <span class="string">'test'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(isset(<span class="variable">$_GET</span>[<span class="string">'code'</span>]) &amp;&amp; !empty(<span class="variable">$_GET</span>[<span class="string">'code'</span>]))&#123;</span><br><span class="line"><span class="variable">$code</span> = <span class="variable">$_GET</span>[<span class="string">'code'</span>];</span><br><span class="line"><span class="variable">$state</span> = <span class="variable">$_GET</span>[<span class="string">'state'</span>];</span><br><span class="line"><span class="variable">$openid</span> = <span class="variable">$thirdAuth</span>-&gt;getCode(<span class="variable">$code</span>, <span class="variable">$state</span>);</span><br><span class="line">//打印openid看看输出结果</span><br><span class="line">print_r(<span class="variable">$openid</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"><span class="variable">$thirdAuth</span>-&gt;authCode(<span class="variable">$state</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure></p><p>2、调用微信统一下单接口，获取微信预支付交易会话标识。<br>调用统一下单接口类 wxpay.class.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php </span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line">* 微信支付</span><br><span class="line">*/</span><br><span class="line">class WxPay</span><br><span class="line">&#123;</span><br><span class="line">private <span class="variable">$apiUrl</span> = <span class="string">'https://api.mch.weixin.qq.com/pay/unifiedorder'</span>;</span><br><span class="line">private <span class="variable">$key</span>;</span><br><span class="line">private <span class="variable">$mch_id</span>;</span><br><span class="line">private <span class="variable">$appid</span>;</span><br><span class="line">private <span class="variable">$openid</span>;</span><br><span class="line">private <span class="variable">$nonce_str</span>;</span><br><span class="line">private <span class="variable">$body</span>;</span><br><span class="line">private <span class="variable">$out_trade_no</span>;</span><br><span class="line">private <span class="variable">$total_fee</span>;</span><br><span class="line">private <span class="variable">$spbill_create_ip</span>;</span><br><span class="line">private <span class="variable">$notify_url</span>;</span><br><span class="line">private <span class="variable">$trade_type</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> __construct(<span class="variable">$attributes</span>)</span><br><span class="line">&#123;</span><br><span class="line"><span class="variable">$this</span>-&gt;key = <span class="variable">$attributes</span>[<span class="string">'key'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;mch_id = <span class="variable">$attributes</span>[<span class="string">'mch_id'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;appid = <span class="variable">$attributes</span>[<span class="string">'appid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;openid = <span class="variable">$attributes</span>[<span class="string">'openid'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;body = <span class="variable">$attributes</span>[<span class="string">'body'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;total_fee = <span class="variable">$attributes</span>[<span class="string">'total_fee'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;trade_type = <span class="variable">$attributes</span>[<span class="string">'trade_type'</span>];</span><br><span class="line"><span class="variable">$this</span>-&gt;notify_url = <span class="variable">$attributes</span>[<span class="string">'notify_url'</span>];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//发送post请求</span><br><span class="line"><span class="keyword">function</span> http_post(<span class="variable">$url</span>, <span class="variable">$param</span>) &#123;</span><br><span class="line">    <span class="variable">$header</span> [] = <span class="string">"content-type: application/json; charset=UTF-8"</span>;</span><br><span class="line">    <span class="variable">$ch</span> = curl_init ();</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_URL, <span class="variable">$url</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_CUSTOMREQUEST, <span class="string">"POST"</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYPEER, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_SSL_VERIFYHOST, FALSE );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_HTTPHEADER, <span class="variable">$header</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_USERAGENT, <span class="string">'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)'</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_FOLLOWLOCATION, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_AUTOREFERER, 1 );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_POSTFIELDS, <span class="variable">$param</span> );</span><br><span class="line">    curl_setopt ( <span class="variable">$ch</span>, CURLOPT_RETURNTRANSFER, <span class="literal">true</span> );</span><br><span class="line">    <span class="variable">$res</span> = curl_exec ( <span class="variable">$ch</span> );</span><br><span class="line"></span><br><span class="line">    curl_close ( <span class="variable">$ch</span> );</span><br><span class="line">    </span><br><span class="line">    //<span class="variable">$res</span> = json_decode ( <span class="variable">$res</span>, <span class="literal">true</span> );</span><br><span class="line">    </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//数组转换为xml格式</span><br><span class="line"><span class="keyword">function</span> arrayToXml(<span class="variable">$arr</span>)</span><br><span class="line">&#123;</span><br><span class="line">    <span class="variable">$xml</span> = <span class="string">"&lt;xml&gt;"</span>;</span><br><span class="line">    foreach (<span class="variable">$arr</span> as <span class="variable">$key</span>=&gt;<span class="variable">$val</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (is_numeric(<span class="variable">$val</span>))&#123;</span><br><span class="line">            <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>.<span class="variable">$val</span>.<span class="string">"&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">             <span class="variable">$xml</span>.=<span class="string">"&lt;"</span>.<span class="variable">$key</span>.<span class="string">"&gt;&lt;![CDATA["</span>.<span class="variable">$val</span>.<span class="string">"]]&gt;&lt;/"</span>.<span class="variable">$key</span>.<span class="string">"&gt;"</span>;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="variable">$xml</span>.=<span class="string">"&lt;/xml&gt;"</span>;</span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$xml</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//将XML转为数组</span><br><span class="line"><span class="keyword">function</span> xmlToArray(<span class="variable">$xml</span>)</span><br><span class="line">&#123;    </span><br><span class="line">    //禁止引用外部xml实体</span><br><span class="line">    libxml_disable_entity_loader(<span class="literal">true</span>);</span><br><span class="line">    <span class="variable">$values</span> = json_decode(json_encode(simplexml_load_string(<span class="variable">$xml</span>, <span class="string">'SimpleXMLElement'</span>, LIBXML_NOCDATA)), <span class="literal">true</span>);        </span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$values</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//支付参数签名</span><br><span class="line"><span class="keyword">function</span> paySign(<span class="variable">$array</span>, <span class="variable">$key</span>)&#123;</span><br><span class="line">ksort(<span class="variable">$array</span>);</span><br><span class="line"><span class="variable">$str</span> = <span class="string">''</span>;</span><br><span class="line">foreach(<span class="variable">$array</span> as <span class="variable">$k</span> =&gt; <span class="variable">$value</span>)&#123;</span><br><span class="line"><span class="variable">$str</span> .= <span class="variable">$k</span>.<span class="string">'='</span>.<span class="variable">$value</span>.<span class="string">'&amp;'</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$str</span> .= <span class="string">"key="</span>.<span class="variable">$key</span>;</span><br><span class="line"><span class="variable">$str</span> = strtoupper(md5(<span class="variable">$str</span>));</span><br><span class="line"><span class="built_in">return</span> <span class="variable">$str</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//生成随机字符串</span><br><span class="line"><span class="keyword">function</span> get_rand_char(<span class="variable">$length</span> = 6, <span class="variable">$type</span> = 1) &#123;</span><br><span class="line">    <span class="variable">$str1</span> = <span class="string">"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"</span>;</span><br><span class="line">    <span class="variable">$str2</span> = <span class="string">"0123456789"</span>;</span><br><span class="line">    <span class="variable">$strLength1</span> = 61;</span><br><span class="line">    <span class="variable">$strLength2</span> = 9;</span><br><span class="line">    <span class="variable">$res</span> = <span class="string">''</span>;</span><br><span class="line">    <span class="keyword">if</span>(<span class="variable">$type</span> == 1)&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str1</span> [rand ( 0, <span class="variable">$strLength1</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="variable">$i</span> = 0; <span class="variable">$i</span> &lt; <span class="variable">$length</span>; <span class="variable">$i</span> ++) &#123;</span><br><span class="line">            <span class="variable">$res</span> .= <span class="variable">$str2</span> [rand ( 0, <span class="variable">$strLength2</span> )];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="built_in">return</span> <span class="variable">$res</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//获取IP</span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">get_client_ip</span></span>() &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'REMOTE_ADDR'</span>];</span><br><span class="line"><span class="keyword">if</span> (isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>]) &amp;&amp; preg_match(<span class="string">'/^([0-9]&#123;1,3&#125;\.)&#123;3&#125;[0-9]&#123;1,3&#125;$/'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>])) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$_SERVER</span>[<span class="string">'HTTP_CLIENT_IP'</span>];</span><br><span class="line">&#125; elseif(isset(<span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>]) AND preg_match_all(<span class="string">'#\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;\.\d&#123;1,3&#125;#s'</span>, <span class="variable">$_SERVER</span>[<span class="string">'HTTP_X_FORWARDED_FOR'</span>], <span class="variable">$matches</span>)) &#123;</span><br><span class="line">foreach (<span class="variable">$matches</span>[0] AS <span class="variable">$xip</span>) &#123;</span><br><span class="line"><span class="keyword">if</span> (!preg_match(<span class="string">'#^(10|172\.16|192\.168)\.#'</span>, <span class="variable">$xip</span>)) &#123;</span><br><span class="line"><span class="variable">$ip</span> = <span class="variable">$xip</span>;</span><br><span class="line"><span class="built_in">break</span>;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="built_in">return</span> <span class="variable">$ip</span> == <span class="string">'::1'</span> ? <span class="string">'127.0.0.1'</span> : <span class="variable">$ip</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="function"><span class="title">prepare</span></span>()&#123;</span><br><span class="line"><span class="variable">$payConfig</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$this</span>-&gt;mch_id,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'openid'</span> =&gt; <span class="variable">$this</span>-&gt;openid,</span><br><span class="line"><span class="string">'nonce_str'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$this</span>-&gt;body,</span><br><span class="line"><span class="string">'out_trade_no'</span> =&gt; date(<span class="string">'YmdHis'</span>).<span class="variable">$this</span>-&gt;get_rand_char(6,1),</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$this</span>-&gt;total_fee,</span><br><span class="line"><span class="string">'spbill_create_ip'</span> =&gt; <span class="variable">$this</span>-&gt;get_client_ip(),</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$this</span>-&gt;notify_url,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$this</span>-&gt;trade_type,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$sign</span> = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$payConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"></span><br><span class="line"><span class="variable">$payConfig</span>[<span class="string">'sign'</span>] = <span class="variable">$sign</span>;</span><br><span class="line"></span><br><span class="line"><span class="variable">$payXML</span> = <span class="variable">$this</span>-&gt;arrayToXml(<span class="variable">$payConfig</span>);</span><br><span class="line"></span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$this</span>-&gt;http_post(<span class="variable">$this</span>-&gt;apiUrl, <span class="variable">$payXML</span>);</span><br><span class="line"></span><br><span class="line"><span class="built_in">return</span> <span class="variable">$this</span>-&gt;xmlToArray(<span class="variable">$result</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> configForPayment(<span class="variable">$prepayId</span>)&#123;</span><br><span class="line"><span class="variable">$jsPayConfig</span> = [</span><br><span class="line"><span class="string">'appId'</span> =&gt; <span class="variable">$this</span>-&gt;appid,</span><br><span class="line"><span class="string">'timeStamp'</span> =&gt; strval(time()),</span><br><span class="line"><span class="string">'nonceStr'</span> =&gt; <span class="variable">$this</span>-&gt;get_rand_char(32,2),</span><br><span class="line"><span class="string">'package'</span> =&gt; <span class="string">"prepay_id=<span class="variable">$prepayId</span>"</span>,</span><br><span class="line"><span class="string">'signType'</span> =&gt; <span class="string">'MD5'</span>,</span><br><span class="line">];</span><br><span class="line"><span class="variable">$jsPayConfig</span>[<span class="string">'paySign'</span>] = <span class="variable">$this</span>-&gt;paySign(<span class="variable">$jsPayConfig</span>, <span class="variable">$this</span>-&gt;key);</span><br><span class="line"><span class="built_in">return</span> json_encode(<span class="variable">$jsPayConfig</span>);</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>测试脚本 test.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">//引入微信页面授权类</span><br><span class="line">include <span class="string">'thirdAuth.class.php'</span>;</span><br><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line">//公众号appid</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//公众号appsecret</span><br><span class="line"><span class="variable">$appsecret</span> = <span class="string">'APPSECRET'</span>;</span><br><span class="line">//页面回调域名</span><br><span class="line"><span class="variable">$redirect_url</span> = <span class="string">'http://whatcode.cn/test.php'</span>;</span><br><span class="line"><span class="variable">$thirdAuth</span> = new ThirdAuth(<span class="variable">$appid</span>, <span class="variable">$appsecret</span>, <span class="variable">$redirect_url</span>);</span><br><span class="line"><span class="variable">$state</span> = <span class="string">'test'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(isset(<span class="variable">$_GET</span>[<span class="string">'code'</span>]) &amp;&amp; !empty(<span class="variable">$_GET</span>[<span class="string">'code'</span>]))&#123;</span><br><span class="line"><span class="variable">$code</span> = <span class="variable">$_GET</span>[<span class="string">'code'</span>];</span><br><span class="line"><span class="variable">$state</span> = <span class="variable">$_GET</span>[<span class="string">'state'</span>];</span><br><span class="line"><span class="variable">$openid</span> = <span class="variable">$thirdAuth</span>-&gt;getCode(<span class="variable">$code</span>, <span class="variable">$state</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"><span class="variable">$thirdAuth</span>-&gt;authCode(<span class="variable">$state</span>);</span><br><span class="line"><span class="built_in">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//商户号</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'100'</span>;</span><br><span class="line">//微信支付类型</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'JSAPI'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'openid'</span> =&gt; <span class="variable">$openid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;prepare();</span><br><span class="line">//打印输出<span class="variable">$result</span></span><br><span class="line">print_r(<span class="variable">$result</span>);</span><br><span class="line"></span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure></p><p>3、封装JS支付参数，调用微信浏览器内置WeixinJSBridge对象，直接调起微信支付。<br>测试脚本 test.php<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line">&lt;?php</span><br><span class="line">//引入微信页面授权类</span><br><span class="line">include <span class="string">'thirdAuth.class.php'</span>;</span><br><span class="line">include <span class="string">'wxpay.class.php'</span>;</span><br><span class="line">//公众号appid</span><br><span class="line"><span class="variable">$appid</span> = <span class="string">'APPID'</span>;</span><br><span class="line">//公众号appsecret</span><br><span class="line"><span class="variable">$appsecret</span> = <span class="string">'APPSECRET'</span>;</span><br><span class="line">//页面回调域名</span><br><span class="line"><span class="variable">$redirect_url</span> = <span class="string">'http://whatcode.cn/test.php'</span>;</span><br><span class="line"><span class="variable">$thirdAuth</span> = new ThirdAuth(<span class="variable">$appid</span>, <span class="variable">$appsecret</span>, <span class="variable">$redirect_url</span>);</span><br><span class="line"><span class="variable">$state</span> = <span class="string">'test'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(isset(<span class="variable">$_GET</span>[<span class="string">'code'</span>]) &amp;&amp; !empty(<span class="variable">$_GET</span>[<span class="string">'code'</span>]))&#123;</span><br><span class="line"><span class="variable">$code</span> = <span class="variable">$_GET</span>[<span class="string">'code'</span>];</span><br><span class="line"><span class="variable">$state</span> = <span class="variable">$_GET</span>[<span class="string">'state'</span>];</span><br><span class="line"><span class="variable">$openid</span> = <span class="variable">$thirdAuth</span>-&gt;getCode(<span class="variable">$code</span>, <span class="variable">$state</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"><span class="variable">$thirdAuth</span>-&gt;authCode(<span class="variable">$state</span>);</span><br><span class="line"><span class="built_in">exit</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//商户号</span><br><span class="line"><span class="variable">$mch_id</span> = <span class="string">'MCH_ID'</span>;</span><br><span class="line">//API KEY</span><br><span class="line"><span class="variable">$key</span> = <span class="string">'KEY'</span>;</span><br><span class="line">//支付回调地址</span><br><span class="line"><span class="variable">$notify_url</span> = <span class="string">'http://whatcode.cn/notify.php'</span>;</span><br><span class="line">//商品描述</span><br><span class="line"><span class="variable">$body</span> = <span class="string">'微信测试'</span>;</span><br><span class="line">//商品价格</span><br><span class="line"><span class="variable">$total_fee</span> = <span class="string">'100'</span>;</span><br><span class="line">//微信支付类型</span><br><span class="line"><span class="variable">$trade_type</span> = <span class="string">'JSAPI'</span>;</span><br><span class="line"></span><br><span class="line">//支付配置参数</span><br><span class="line"><span class="variable">$attributes</span> = [</span><br><span class="line"><span class="string">'mch_id'</span> =&gt; <span class="variable">$mch_id</span>,</span><br><span class="line"><span class="string">'key'</span> =&gt; <span class="variable">$key</span>,</span><br><span class="line"><span class="string">'appid'</span> =&gt; <span class="variable">$appid</span>,</span><br><span class="line"><span class="string">'openid'</span> =&gt; <span class="variable">$openid</span>,</span><br><span class="line"><span class="string">'body'</span> =&gt; <span class="variable">$body</span>,</span><br><span class="line"><span class="string">'total_fee'</span> =&gt; <span class="variable">$total_fee</span>,</span><br><span class="line"><span class="string">'notify_url'</span> =&gt; <span class="variable">$notify_url</span>,</span><br><span class="line"><span class="string">'trade_type'</span> =&gt; <span class="variable">$trade_type</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="variable">$wxpay</span> = new WxPay(<span class="variable">$attributes</span>);</span><br><span class="line"><span class="variable">$result</span> = <span class="variable">$wxpay</span>-&gt;prepare();</span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$result</span>[<span class="string">'return_code'</span>] == <span class="string">'SUCCESS'</span> &amp;&amp; <span class="variable">$result</span>[<span class="string">'result_code'</span>] == <span class="string">'SUCCESS'</span>)&#123;</span><br><span class="line"><span class="variable">$prepayId</span> = <span class="variable">$result</span>[<span class="string">'prepay_id'</span>];</span><br><span class="line"><span class="variable">$jsapi</span> = <span class="variable">$wxpay</span>-&gt;configForPayment(<span class="variable">$prepayId</span>);</span><br><span class="line">//调用微信WeixinJSBridge对象</span><br><span class="line"><span class="built_in">echo</span>  &lt;&lt;&lt;EOT</span><br><span class="line">&lt;html&gt;</span><br><span class="line">&lt;head&gt;</span><br><span class="line">    &lt;meta http-equiv=<span class="string">"content-type"</span> content=<span class="string">"text/html;charset=utf-8"</span>/&gt;</span><br><span class="line">    &lt;meta name=<span class="string">"viewport"</span> content=<span class="string">"width=device-width, initial-scale=1"</span>/&gt; </span><br><span class="line">    &lt;title&gt;微信支付-支付&lt;/title&gt;</span><br><span class="line">    &lt;script <span class="built_in">type</span>=<span class="string">"text/javascript"</span>&gt;</span><br><span class="line"><span class="keyword">function</span> jsApiCall()</span><br><span class="line">&#123;</span><br><span class="line">WeixinJSBridge.invoke(</span><br><span class="line"><span class="string">'getBrandWCPayRequest'</span>,</span><br><span class="line">&#123;<span class="variable">$jsapi</span>&#125;,</span><br><span class="line"><span class="keyword">function</span>(res)&#123;</span><br><span class="line"><span class="keyword">if</span>(res.err_msg == <span class="string">"get_brand_wcpay_request:ok"</span>)&#123;</span><br><span class="line">alert(<span class="string">'支付成功'</span>);</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">alert(<span class="string">'支付失败'</span>)；</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line">);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">function</span> callpay()</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">if</span> (typeof WeixinJSBridge == <span class="string">"undefined"</span>)&#123;</span><br><span class="line">    <span class="keyword">if</span>( document.addEventListener )&#123;</span><br><span class="line">        document.addEventListener(<span class="string">'WeixinJSBridgeReady'</span>, jsApiCall, <span class="literal">false</span>);</span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span> (document.attachEvent)&#123;</span><br><span class="line">        document.attachEvent(<span class="string">'WeixinJSBridgeReady'</span>, jsApiCall); </span><br><span class="line">        document.attachEvent(<span class="string">'onWeixinJSBridgeReady'</span>, jsApiCall);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line">    jsApiCall();</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">&lt;/script&gt;</span><br><span class="line">&lt;/head&gt;</span><br><span class="line">&lt;body onload=<span class="string">"callpay()"</span>&gt;&lt;/body&gt;</span><br><span class="line">&lt;/html&gt;</span><br><span class="line">EOT;</span><br><span class="line"></span><br><span class="line">&#125;<span class="keyword">else</span>&#123;</span><br><span class="line"><span class="built_in">exit</span>(<span class="string">'调用统一下单接口出错'</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">?&gt;</span><br></pre></td></tr></table></figure></p><p>到这里应该可以正常调起微信支付了。</p><h3 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h3><p>1、如果没能正常调起微信支付，最好是对照着微信的错误码来查找原因，尽量避免配置上的失误。<br>2、支付目录如果没设置正确，是没有错误码提示的，一定要看清楚你的支付路由的上一级目录就是支付目录。<br>3、根据我的示例代码，一步一步来，应该能成功调起微信支付，当然这只是示例代码，代码逻辑还不够严谨，这里只是用来讲解微信支付的开发流程。后面我会整理一个通用版的微信支付类。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;微信支付分好几种支付场景，1、微信公众号内支付、2、微信扫码支付、3、H5支付（微信浏览器之外的其他浏览器）4、小程序支付、5、APP支付（第三方应用调起微信支付）、6、    刷卡支付（收银员用扫码设备扫描用户的二维码）。下面我们来讲解一下微信公众号支付的开发流程，包括简
      
    
    </summary>
    
      <category term="weixin" scheme="http://whatcode.cn/categories/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/categories/weixin/pay/"/>
    
    
      <category term="weixin" scheme="http://whatcode.cn/tags/weixin/"/>
    
      <category term="pay" scheme="http://whatcode.cn/tags/pay/"/>
    
  </entry>
  
  <entry>
    <title>ubuntu 16.04解决sublime_text 3无法输入中文问题</title>
    <link href="http://whatcode.cn/2017/12/04/Linux-sublime/"/>
    <id>http://whatcode.cn/2017/12/04/Linux-sublime/</id>
    <published>2017-12-03T16:00:00.000Z</published>
    <updated>2017-12-22T02:27:38.000Z</updated>
    
    <content type="html"><![CDATA[<p>sublime_text3在ubuntu下是不支持中文输入的，这个有点蛋疼，网上有好几种方案解决，这里用其中最方便解决问题的方法（这个修复仅当在终端中使用 subl . 调用 Sublime Text 的时有效）</p><h3 id="更新并升级系统为最新-较新的系统会解决很多可能出现的问题"><a href="#更新并升级系统为最新-较新的系统会解决很多可能出现的问题" class="headerlink" title="更新并升级系统为最新(较新的系统会解决很多可能出现的问题)"></a>更新并升级系统为最新(较新的系统会解决很多可能出现的问题)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo apt-get update &amp;&amp; sudo apt-get upgrade</span><br></pre></td></tr></table></figure><h3 id="克隆项目到本地"><a href="#克隆项目到本地" class="headerlink" title="克隆项目到本地"></a>克隆项目到本地</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> https://github.com/lyfeyaj/sublime-text-imfix.git</span><br></pre></td></tr></table></figure><h3 id="运行脚本"><a href="#运行脚本" class="headerlink" title="运行脚本"></a>运行脚本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> sublime-text-imfix &amp;&amp; ./sublime-imfix</span><br></pre></td></tr></table></figure><p>完成! 重新启动后就可以在 Sublime Text 3 中输入中文了</p><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><p>1、ubuntu需要提前安装好fcitx，并且设置好键盘输入系统为:fcitx<br>2、把sublime_text3的启动脚本加入到环境变量，如：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ln -s /opt/sublime_text/sublime_text /usr/bin/subl</span><br></pre></td></tr></table></figure></p><p><strong>原链接</strong><br><a href="https://github.com/lyfeyaj/sublime-text-imfix" target="_blank" rel="noopener">https://github.com/lyfeyaj/sublime-text-imfix</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;sublime_text3在ubuntu下是不支持中文输入的，这个有点蛋疼，网上有好几种方案解决，这里用其中最方便解决问题的方法（这个修复仅当在终端中使用 subl . 调用 Sublime Text 的时有效）&lt;/p&gt;
&lt;h3 id=&quot;更新并升级系统为最新-较新的系统会解
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="tools" scheme="http://whatcode.cn/categories/Linux/tools/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="tools" scheme="http://whatcode.cn/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>ubuntu 16.04关闭sublime_text3升级提醒</title>
    <link href="http://whatcode.cn/2017/12/04/Linux-sublime-1/"/>
    <id>http://whatcode.cn/2017/12/04/Linux-sublime-1/</id>
    <published>2017-12-03T16:00:00.000Z</published>
    <updated>2017-12-22T02:27:53.000Z</updated>
    
    <content type="html"><![CDATA[<p>在ubuntu下，每次打开sublime_text3都有一个升级提醒，每次都要手动关闭，很烦人，网上google了一圈，终于找到完美的解决方案。</p><h3 id="打开Submine-Text，找到Preferences-gt-Settings-写入“update-check”-false"><a href="#打开Submine-Text，找到Preferences-gt-Settings-写入“update-check”-false" class="headerlink" title="打开Submine Text，找到Preferences -&gt; Settings,写入“update_check”:false"></a>打开Submine Text，找到Preferences -&gt; Settings,写入“update_check”:false</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"><span class="string">"color_scheme"</span>: <span class="string">"Packages/User/SublimeLinter/LAZY (SL).tmTheme"</span>,</span><br><span class="line"><span class="string">"font_size"</span>: 12,</span><br><span class="line"><span class="string">"ignored_packages"</span>:</span><br><span class="line">[</span><br><span class="line"><span class="string">"Vintage"</span></span><br><span class="line">],</span><br><span class="line"><span class="string">"update_check"</span>: <span class="literal">false</span>,</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>网上很多人就只说到这一点，但是实际上还不能解决升级提醒的问题，还需加入注册码</p><h3 id="找到-Help-gt-Enter-license-输入下面的注册码"><a href="#找到-Help-gt-Enter-license-输入下面的注册码" class="headerlink" title="找到 Help-&gt;Enter license ,输入下面的注册码"></a>找到 Help-&gt;Enter license ,输入下面的注册码</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">—– BEGIN LICENSE —–</span><br><span class="line">Michael Barnes</span><br><span class="line">Single User License</span><br><span class="line">EA7E-821385</span><br><span class="line">8A353C41 872A0D5C DF9B2950 AFF6F667</span><br><span class="line">C458EA6D 8EA3C286 98D1D650 131A97AB</span><br><span class="line">AA919AEC EF20E143 B361B1E7 4C8B7F04</span><br><span class="line">B085E65E 2F5F5360 8489D422 FB8FC1AA</span><br><span class="line">93F6323C FD7F7544 3F39C318 D95E6480</span><br><span class="line">FCCC7561 8A4A1741 68FA4223 ADCEDE07</span><br><span class="line">200C25BE DBBC4855 C4CFB774 C5EC138C</span><br><span class="line">0FEC1CEF D9DCECEC D3A5DAD1 01316C36</span><br><span class="line">—— END LICENSE ——</span><br></pre></td></tr></table></figure><p>重启sublime_text3，应该不会再弹出提醒升级框了。如果注册码失效了，可以在网上搜一个其他的来试试，完成这两步应该可以关闭升级提醒了。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;在ubuntu下，每次打开sublime_text3都有一个升级提醒，每次都要手动关闭，很烦人，网上google了一圈，终于找到完美的解决方案。&lt;/p&gt;
&lt;h3 id=&quot;打开Submine-Text，找到Preferences-gt-Settings-写入“update-c
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="tools" scheme="http://whatcode.cn/categories/Linux/tools/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="tools" scheme="http://whatcode.cn/tags/tools/"/>
    
  </entry>
  
  <entry>
    <title>修改Linux默认编辑器</title>
    <link href="http://whatcode.cn/2017/11/28/Linux-vim/"/>
    <id>http://whatcode.cn/2017/11/28/Linux-vim/</id>
    <published>2017-11-27T16:00:00.000Z</published>
    <updated>2017-12-22T02:26:33.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="修改Linux-crontab默认编辑器"><a href="#修改Linux-crontab默认编辑器" class="headerlink" title="修改Linux crontab默认编辑器"></a>修改Linux crontab默认编辑器</h3><p>第一次crontab （定时执行任务） 选择编辑器的时候就会提醒你：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Select an editor.  To change later, run ‘select-editor‘.</span><br><span class="line">  1. /bin/ed</span><br><span class="line">  2. /bin/nano        &lt;---- easiest</span><br><span class="line">  3. /usr/bin/vim.basic</span><br><span class="line">  4. /usr/bin/vim.tiny</span><br><span class="line">Choose 1-4 [2]:</span><br></pre></td></tr></table></figure></p><p>如果第一没选正确，可以用以下命令修改：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo select-editor</span><br></pre></td></tr></table></figure></p><p>然后选择vim.basic</p><h3 id="修改git默认的编辑器nano为vim"><a href="#修改git默认的编辑器nano为vim" class="headerlink" title="修改git默认的编辑器nano为vim"></a>修改git默认的编辑器nano为vim</h3><p>git默认的编辑器是nano，使用起来感觉很别扭，通过下面命令可以将git默认的编辑器变为vim<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.editor vim</span><br></pre></td></tr></table></figure></p><p>或者打开.git/config文件，在core中添加 editor=vim即可</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;修改Linux-crontab默认编辑器&quot;&gt;&lt;a href=&quot;#修改Linux-crontab默认编辑器&quot; class=&quot;headerlink&quot; title=&quot;修改Linux crontab默认编辑器&quot;&gt;&lt;/a&gt;修改Linux crontab默认编辑器&lt;/h3&gt;&lt;
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="vim" scheme="http://whatcode.cn/categories/Linux/vim/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="vim" scheme="http://whatcode.cn/tags/vim/"/>
    
  </entry>
  
  <entry>
    <title>ubuntu 16.04LTS修复CVE-2017-1000364、CVE-2017-1000366等漏洞</title>
    <link href="http://whatcode.cn/2017/11/27/linux-update-kernel-2/"/>
    <id>http://whatcode.cn/2017/11/27/linux-update-kernel-2/</id>
    <published>2017-11-26T16:00:00.000Z</published>
    <updated>2017-12-22T02:27:19.000Z</updated>
    
    <content type="html"><![CDATA[<p>2017年6月19日,国外安全公司研究人员发现Unix的操作系统（包括Linux、OpenBSD和FreeBSD）爆出存在提权漏洞漏洞，该漏洞让攻击者可以通过执行代码提权到root权限。该漏洞几乎影响了所有Linux系统。</p><p>刚刚买了一台阿里云的ubuntu云服务器就报了21个服务器内核漏洞，类似：CVE-2017-1000364、CVE-2017-1000366等，google一下发现还是很容易解决的。<br>下面是ubuntu 16.04LTS版本解决方案</p><p><strong>1、查看当前系统内核版本</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[ghost@localhost ~]$ uname -r</span><br><span class="line">Linux 4.4.0-78-generic x86_64</span><br></pre></td></tr></table></figure></p><p>内核版本小于4.4.0-81-generic都需要升级内核修复漏洞<br><strong>2、通过apt命令升级系统</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ghost@localhost ~]$ sudo apt-get update &amp;&amp; sudo apt-get upgrade &amp;&amp; sudo apt-get dist-upgrade</span><br></pre></td></tr></table></figure></p><p><strong>3、重启系统</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[ghost@localhost ~]$ sudo reboot</span><br></pre></td></tr></table></figure></p><p><strong>4、检查是否升级成功</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[ghost@localhost ~] uname -r</span><br><span class="line">4.4.0-98-generic</span><br></pre></td></tr></table></figure></p><p>再用阿里云的安骑士检查，已经不报漏洞了，修复成功！！！</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;2017年6月19日,国外安全公司研究人员发现Unix的操作系统（包括Linux、OpenBSD和FreeBSD）爆出存在提权漏洞漏洞，该漏洞让攻击者可以通过执行代码提权到root权限。该漏洞几乎影响了所有Linux系统。&lt;/p&gt;
&lt;p&gt;刚刚买了一台阿里云的ubuntu云服
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="kernel" scheme="http://whatcode.cn/categories/Linux/kernel/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="kernel" scheme="http://whatcode.cn/tags/kernel/"/>
    
  </entry>
  
  <entry>
    <title>nginx配置https</title>
    <link href="http://whatcode.cn/2017/11/27/Linux-nginx-https/"/>
    <id>http://whatcode.cn/2017/11/27/Linux-nginx-https/</id>
    <published>2017-11-26T16:00:00.000Z</published>
    <updated>2017-12-22T02:29:50.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="购买ssl证书"><a href="#购买ssl证书" class="headerlink" title="购买ssl证书"></a>购买ssl证书</h3><p>阿里云有提供免费版ssl证书，这里以阿里云的免费ssl证书为例子。一个阿里云帐户最多签发20张免费证书，具体如何申请免费证书请自行百度，这里不具体介绍。<br>下载ssl证书，并且放到/etc/nginx/cert（nginx的配置目录）目录下，并且命名为test.pem(公钥),test.key(私钥)</p><h3 id="配置nginx"><a href="#配置nginx" class="headerlink" title="配置nginx"></a>配置nginx</h3><p>这里以test.com为例子配置https,具体配置如下：<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 443;</span><br><span class="line">    server_name test.com; <span class="comment">#监听test.com域名</span></span><br><span class="line">    root /wwwroot/<span class="built_in">test</span>;</span><br><span class="line">    index index.html index.htm;</span><br><span class="line">    <span class="comment">#https的配置项</span></span><br><span class="line">    ssl on;</span><br><span class="line">    ssl_certificate   cert/test.pem; <span class="comment">#证书路径</span></span><br><span class="line">    ssl_certificate_key  cert/test.key; <span class="comment">#证书路径</span></span><br><span class="line">    ssl_session_timeout 5m;</span><br><span class="line">    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;</span><br><span class="line">    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;</span><br><span class="line">    ssl_prefer_server_ciphers on;</span><br><span class="line"></span><br><span class="line">    access_log /var/<span class="built_in">log</span>/nginx/test_access.log;</span><br><span class="line">    error_log /var/<span class="built_in">log</span>/nginx/test_error.log;</span><br><span class="line">    location / &#123;</span><br><span class="line">try_files <span class="variable">$uri</span> <span class="variable">$uri</span>/ =404;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>修改好nginx的配置，开启443端口，然后重启nginx，service nginx restart<br>测试浏览器访问：<a href="https://test.com是否能访问" target="_blank" rel="noopener">https://test.com是否能访问</a></p><h3 id="配置全网https"><a href="#配置全网https" class="headerlink" title="配置全网https"></a>配置全网https</h3><p>实现全网https可以在nginx里面增加以下配置，让http协议强制跳转到https协议<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">server &#123;</span><br><span class="line">    listen 80;</span><br><span class="line">    server_name test.com; </span><br><span class="line">    rewrite ^ https://<span class="variable">$http_host</span><span class="variable">$request_uri</span>? permanent;</span><br><span class="line">    <span class="comment">#return 301 https://$server_name$request_uri; </span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p><p>修改好nginx的配置，重启nginx，service nginx restart<br>测试浏览器访问：<a href="http://test.com是否成功跳转到https://test.com" target="_blank" rel="noopener">http://test.com是否成功跳转到https://test.com</a></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;购买ssl证书&quot;&gt;&lt;a href=&quot;#购买ssl证书&quot; class=&quot;headerlink&quot; title=&quot;购买ssl证书&quot;&gt;&lt;/a&gt;购买ssl证书&lt;/h3&gt;&lt;p&gt;阿里云有提供免费版ssl证书，这里以阿里云的免费ssl证书为例子。一个阿里云帐户最多签发20张免费证
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="nginx" scheme="http://whatcode.cn/categories/Linux/nginx/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="nginx" scheme="http://whatcode.cn/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>mysql自动备份脚本</title>
    <link href="http://whatcode.cn/2017/11/20/Linux-mysql-backup/"/>
    <id>http://whatcode.cn/2017/11/20/Linux-mysql-backup/</id>
    <published>2017-11-19T16:00:00.000Z</published>
    <updated>2017-12-22T02:30:52.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="mysql的备份有两种方式："><a href="#mysql的备份有两种方式：" class="headerlink" title="mysql的备份有两种方式："></a>mysql的备份有两种方式：</h3><p>1、直接备份mysql的datadir目录<br>2、通过mysqldump命令导出sql文件<br>因为第一种方法无法在其他版本的mysql中使用，所以一般都是通过第二种方式备份。下面我们来写一个shell脚本来自动化备份mysql数据</p><p><strong>创建备份目录</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">###创建备份目录</span></span><br><span class="line">mkdir -p /backup/mysql</span><br><span class="line"></span><br><span class="line"><span class="comment">###创建备份脚本的目录</span></span><br><span class="line">mkdir -p /backup/shell</span><br><span class="line"></span><br><span class="line"><span class="comment">###创建备份脚本</span></span><br><span class="line"><span class="built_in">cd</span> /backup/shell</span><br><span class="line">touch mysql_backup.sh</span><br><span class="line"><span class="comment">###添加可执行权限</span></span><br><span class="line">chmod +x mysql_backup.sh</span><br><span class="line">vi mysql_backup.sh</span><br></pre></td></tr></table></figure></p><p><strong>输入备份代码</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line">fulldate=`date +%Y%m%d%H%M%S`</span><br><span class="line">backup_root=<span class="string">"/backup/mysql"</span></span><br><span class="line"><span class="comment">###这里用test数据库做举例</span></span><br><span class="line">test_backup_path=<span class="string">"test_"</span><span class="variable">$&#123;fulldate&#125;</span><span class="string">".dump"</span></span><br><span class="line">test_backup_tar=<span class="string">"test_"</span><span class="variable">$&#123;fulldate&#125;</span><span class="string">".tar.gz"</span></span><br><span class="line">mysqldump -hlocalhost -uroot -pPASSWD --databases <span class="built_in">test</span> &gt; <span class="variable">$&#123;backup_root&#125;</span><span class="string">"/"</span><span class="variable">$&#123;test_backup_path&#125;</span></span><br><span class="line"><span class="built_in">cd</span> <span class="variable">$&#123;backup_root&#125;</span></span><br><span class="line">tar czPf <span class="variable">$&#123;test_backup_tar&#125;</span> <span class="variable">$&#123;test_backup_path&#125;</span></span><br><span class="line">rm -f <span class="variable">$&#123;test_backup_path&#125;</span></span><br><span class="line"><span class="comment">###只保留十天的数据</span></span><br><span class="line">find <span class="variable">$&#123;backup_root&#125;</span> -<span class="built_in">type</span> f -mtime +10 -<span class="built_in">exec</span> rm &#123;&#125; \;</span><br></pre></td></tr></table></figure></p><p><strong>添加定时任务</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">crontab -e</span><br><span class="line"><span class="comment">###输入一下命令</span></span><br><span class="line">0 3 * * * /backup/shell/mysql_backup.sh</span><br></pre></td></tr></table></figure></p><p><strong>测试</strong><br>可以先直接执行mysql_backup.sh脚本，看看是否已经能成功备份，如果没问题，再测试定时任务</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;mysql的备份有两种方式：&quot;&gt;&lt;a href=&quot;#mysql的备份有两种方式：&quot; class=&quot;headerlink&quot; title=&quot;mysql的备份有两种方式：&quot;&gt;&lt;/a&gt;mysql的备份有两种方式：&lt;/h3&gt;&lt;p&gt;1、直接备份mysql的datadir目录&lt;
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="shell" scheme="http://whatcode.cn/categories/Linux/shell/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="shell" scheme="http://whatcode.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Git配置多个ssh key</title>
    <link href="http://whatcode.cn/2017/11/16/Linux-git-ssh/"/>
    <id>http://whatcode.cn/2017/11/16/Linux-git-ssh/</id>
    <published>2017-11-15T16:00:00.000Z</published>
    <updated>2017-12-22T02:31:44.000Z</updated>
    
    <content type="html"><![CDATA[<p>配置单个git ssh-key很简单，直接用命令’ssh-keygen -t rsa’生成private key 和public key,然后在git服务器上配置好public key(id_rsa.pub)一般就可以成功连接git服务器了。但是如果有多个id_rsa private key，如何配置呢？如何指定不同git服务器用不同的id_rsa private key呢？下面简单介绍用两个不同的id_rsa private key分别连接github和gitee(码云)</p><p><strong>1、首先生成两个id_rsa文件</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## 生成github的ssh-key</span></span><br><span class="line">ssh-keygen -t rsa -C <span class="string">"tenke@gmail.com"</span> -f ~/.ssh/github_id_rsa</span><br><span class="line"></span><br><span class="line"><span class="comment">## 生成gitee的ssh-key</span></span><br><span class="line">ssh-keygen -t rsa -C <span class="string">"tenke@gmail.com"</span> -f ~/.ssh/gitee_id_rsa</span><br><span class="line"></span><br><span class="line"><span class="comment">## 查看ssh-key</span></span><br><span class="line">ls ~/.ssh/</span><br></pre></td></tr></table></figure></p><p><strong>2、分别到github和gitee上面配置好public key</strong><br>这一步省略，配置public key没有什么好说的，都是图形界面，只要把id_rsa.pub的内容复制进去保存就ok了</p><p><strong>3、配置config文件</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## 在~/.ssh/目录下创建config文件</span></span><br><span class="line">touch ~/.ssh/config</span><br><span class="line"><span class="comment">## 增加配置项</span></span><br><span class="line">vi ~/.ssh/config</span><br><span class="line"><span class="comment">## 分别添加github和gitee的配置(如果还有多个，对照下面的配置即可)</span></span><br><span class="line">Host gitee.com</span><br><span class="line">HostName gitee.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/gitee_id_rsa</span><br><span class="line"></span><br><span class="line">Host github.com</span><br><span class="line">HostName github.com</span><br><span class="line">PreferredAuthentications publickey</span><br><span class="line">IdentityFile ~/.ssh/github_id_rsa</span><br><span class="line"></span><br><span class="line"><span class="comment">## 配置参数说明</span></span><br><span class="line"><span class="comment"># Host : 用来指定该key的Host名字，此处必须使用本地repo的hostname github.com</span></span><br><span class="line"><span class="comment"># HostName : 此处指定Host对应的具体域名，这里跟Host保持一致。</span></span><br><span class="line"><span class="comment"># User : 登录名（这可以不用配置）</span></span><br><span class="line"><span class="comment"># IdentityFile : 私钥identityFile路径（id_rsa的位置）</span></span><br><span class="line"></span><br><span class="line"><span class="comment">## 修改config、id_rsa文件的权限</span></span><br><span class="line">chmod 600 github_id_rsa</span><br><span class="line">chmod 600 gitee_id_rsa</span><br><span class="line">chmod 664 config</span><br></pre></td></tr></table></figure></p><p><strong>4、测试</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh -Tv git@github.com</span><br><span class="line">ssh -Tv git@gitee.com</span><br></pre></td></tr></table></figure></p><p>如果出现以下内容说明已经成功<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Welcome to Gitee.com, Tenken!</span><br><span class="line">debug1: client_input_channel_req: channel 0 rtype <span class="built_in">exit</span>-status reply 0</span><br><span class="line">debug1: channel 0: free: client-session, nchannels 1</span><br><span class="line">Transferred: sent 2648, received 1408 bytes, <span class="keyword">in</span> 0.2 seconds</span><br><span class="line">Bytes per second: sent 13665.1, received 7266.0</span><br><span class="line">debug1: Exit status 0</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;配置单个git ssh-key很简单，直接用命令’ssh-keygen -t rsa’生成private key 和public key,然后在git服务器上配置好public key(id_rsa.pub)一般就可以成功连接git服务器了。但是如果有多个id_rsa pr
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/categories/Linux/git/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Linux scp命令操作说明</title>
    <link href="http://whatcode.cn/2017/11/16/Linux-scp/"/>
    <id>http://whatcode.cn/2017/11/16/Linux-scp/</id>
    <published>2017-11-15T16:00:00.000Z</published>
    <updated>2017-12-22T02:28:53.000Z</updated>
    
    <content type="html"><![CDATA[<p>scp命令用于在Linux下进行远程拷贝文件的命令，和它类似的命令有cp，不过cp只是在本机进行拷贝不能跨服务器，而且scp传输是加密的。</p><p><strong>1、复制远程文件到本地目录</strong></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp root@remote:/usr/<span class="built_in">local</span>/test.txt  /usr/<span class="built_in">local</span>/</span><br></pre></td></tr></table></figure><p><strong>2、复制远程目录到本地</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -r root@remote:/usr/<span class="built_in">local</span>/wwwroot  /usr/<span class="built_in">local</span>/</span><br></pre></td></tr></table></figure></p><p><strong>3、上传本地文件到远程机器指定目录</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp /usr/<span class="built_in">local</span>/test.txt  root@remote:/usr/<span class="built_in">local</span>/</span><br></pre></td></tr></table></figure></p><p><strong>4、上传本地目录到远程机器指定目录</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">scp -r /usr/<span class="built_in">local</span>/wwwroot  root@remote:/usr/<span class="built_in">local</span>/</span><br></pre></td></tr></table></figure></p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;scp命令用于在Linux下进行远程拷贝文件的命令，和它类似的命令有cp，不过cp只是在本机进行拷贝不能跨服务器，而且scp传输是加密的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、复制远程文件到本地目录&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight 
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="shell" scheme="http://whatcode.cn/categories/Linux/shell/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="shell" scheme="http://whatcode.cn/tags/shell/"/>
    
  </entry>
  
  <entry>
    <title>Git常用命令大全</title>
    <link href="http://whatcode.cn/2017/11/15/Linux-git-cmd/"/>
    <id>http://whatcode.cn/2017/11/15/Linux-git-cmd/</id>
    <published>2017-11-14T16:00:00.000Z</published>
    <updated>2017-12-22T02:32:01.000Z</updated>
    
    <content type="html"><![CDATA[<h3 id="查看、添加、提交、删除、找回，重置修改文件"><a href="#查看、添加、提交、删除、找回，重置修改文件" class="headerlink" title="查看、添加、提交、删除、找回，重置修改文件"></a>查看、添加、提交、删除、找回，重置修改文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">help</span> &lt;<span class="built_in">command</span>&gt; <span class="comment"># 显示command的help</span></span><br><span class="line"></span><br><span class="line">git show <span class="comment"># 显示某次提交的内容 git show $id</span></span><br><span class="line"></span><br><span class="line">git checkout -- &lt;file&gt; <span class="comment"># 抛弃工作区修改</span></span><br><span class="line"></span><br><span class="line">git checkout . <span class="comment"># 抛弃工作区修改</span></span><br><span class="line"></span><br><span class="line">git add &lt;file&gt; <span class="comment"># 将工作文件修改提交到本地暂存区</span></span><br><span class="line"></span><br><span class="line">git add . <span class="comment"># 将所有修改过的工作文件提交暂存区</span></span><br><span class="line"></span><br><span class="line">git rm &lt;file&gt; <span class="comment"># 从版本库中删除文件</span></span><br><span class="line"></span><br><span class="line">git rm &lt;file&gt; --cached <span class="comment"># 从版本库中删除文件，但不删除文件</span></span><br><span class="line"></span><br><span class="line">git reset &lt;file&gt; <span class="comment"># 从暂存区恢复到工作文件</span></span><br><span class="line"></span><br><span class="line">git reset -- . <span class="comment"># 从暂存区恢复到工作文件</span></span><br><span class="line"></span><br><span class="line">git reset --hard <span class="comment"># 恢复最近一次提交过的状态，即放弃上次提交后的所有本次修改</span></span><br><span class="line">　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　　</span><br><span class="line">git commit -am <span class="string">"some comments"</span> <span class="comment">#提交修改</span></span><br><span class="line"></span><br><span class="line">git commit --amend <span class="comment"># 修改最后一次提交记录</span></span><br><span class="line"></span><br><span class="line">git revert &lt;<span class="variable">$id</span>&gt; <span class="comment"># 恢复某次提交的状态，恢复动作本身也创建次提交对象</span></span><br><span class="line"></span><br><span class="line">git revert HEAD <span class="comment"># 恢复最后一次提交的状态</span></span><br></pre></td></tr></table></figure><h3 id="查看文件diff"><a href="#查看文件diff" class="headerlink" title="查看文件diff"></a>查看文件diff</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">git diff &lt;file&gt; <span class="comment"># 比较当前文件和暂存区文件差异 git diff</span></span><br><span class="line"></span><br><span class="line">git diff &lt;id1&gt;&lt;id2&gt; <span class="comment"># 比较两次提交之间的差异</span></span><br><span class="line"></span><br><span class="line">git diff &lt;branch1&gt;..&lt;branch2&gt; <span class="comment"># 在两个分支之间比较</span></span><br><span class="line"></span><br><span class="line">git diff --staged <span class="comment"># 比较暂存区和版本库差异</span></span><br><span class="line"></span><br><span class="line">git diff --cached <span class="comment"># 比较暂存区和版本库差异</span></span><br><span class="line"></span><br><span class="line">git diff --<span class="built_in">stat</span> <span class="comment"># 仅仅比较统计信息</span></span><br></pre></td></tr></table></figure><h3 id="查看提交记录"><a href="#查看提交记录" class="headerlink" title="查看提交记录"></a>查看提交记录</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">log</span> git <span class="built_in">log</span> &lt;file&gt; <span class="comment"># 查看该文件每次提交记录</span></span><br><span class="line"></span><br><span class="line">git <span class="built_in">log</span> -p &lt;file&gt; <span class="comment"># 查看每次详细修改内容的diff</span></span><br><span class="line"></span><br><span class="line">git <span class="built_in">log</span> -p -2 <span class="comment"># 查看最近两次详细修改内容的diff</span></span><br><span class="line"></span><br><span class="line">git <span class="built_in">log</span> --<span class="built_in">stat</span> <span class="comment">#查看提交统计信息</span></span><br></pre></td></tr></table></figure><h3 id="Git查看、切换、创建和删除分支"><a href="#Git查看、切换、创建和删除分支" class="headerlink" title="Git查看、切换、创建和删除分支"></a>Git查看、切换、创建和删除分支</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">git branch -r <span class="comment"># 查看远程分支</span></span><br><span class="line"></span><br><span class="line">git branch &lt;new_branch&gt; <span class="comment"># 创建新的分支</span></span><br><span class="line"></span><br><span class="line">git branch -v <span class="comment"># 查看各个分支最后提交信息</span></span><br><span class="line"></span><br><span class="line">git branch --merged <span class="comment"># 查看已经被合并到当前分支的分支</span></span><br><span class="line"></span><br><span class="line">git branch --no-merged <span class="comment"># 查看尚未被合并到当前分支的分支</span></span><br><span class="line"></span><br><span class="line">git checkout &lt;branch&gt; <span class="comment"># 切换到某个分支</span></span><br><span class="line"></span><br><span class="line">git checkout -b &lt;new_branch&gt; <span class="comment"># 创建新的分支，并且切换过去</span></span><br><span class="line"></span><br><span class="line">git checkout -b &lt;new_branch&gt; &lt;branch&gt; <span class="comment"># 基于branch创建新的new_branch</span></span><br><span class="line"></span><br><span class="line">git checkout <span class="variable">$id</span> <span class="comment"># 把某次历史提交记录checkout出来，但无分支信息，切换到其他分支会自动删除</span></span><br><span class="line"></span><br><span class="line">git checkout <span class="variable">$id</span> -b &lt;new_branch&gt; <span class="comment"># 把某次历史提交记录checkout出来，创建成一个分支</span></span><br><span class="line"></span><br><span class="line">git branch -d &lt;branch&gt; <span class="comment"># 删除某个分支</span></span><br><span class="line"></span><br><span class="line">git branch -D &lt;branch&gt; <span class="comment"># 强制删除某个分支 (未被合并的分支被删除的时候需要强制)</span></span><br></pre></td></tr></table></figure><h3 id="分支合并和rebase"><a href="#分支合并和rebase" class="headerlink" title="分支合并和rebase"></a>分支合并和rebase</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git merge &lt;branch&gt; <span class="comment"># 将branch分支合并到当前分支</span></span><br><span class="line"></span><br><span class="line">git merge origin/master --no-ff <span class="comment"># 不要Fast-Foward合并，这样可以生成merge提交</span></span><br><span class="line"></span><br><span class="line">git rebase master &lt;branch&gt; <span class="comment"># 将master rebase到branch，相当于： git checkout &lt;branch&gt; &amp;&amp; git rebase master &amp;&amp; git checkout master &amp;&amp; git merge &lt;branch&gt;</span></span><br></pre></td></tr></table></figure><h3 id="Git补丁管理-方便在多台机器上开发同步时用"><a href="#Git补丁管理-方便在多台机器上开发同步时用" class="headerlink" title="Git补丁管理(方便在多台机器上开发同步时用)"></a>Git补丁管理(方便在多台机器上开发同步时用)</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git diff &gt; ../sync.patch <span class="comment"># 生成补丁</span></span><br><span class="line"></span><br><span class="line">git apply ../sync.patch <span class="comment"># 打补丁</span></span><br><span class="line"></span><br><span class="line">git apply --check ../sync.patch <span class="comment">#测试补丁能否成功</span></span><br></pre></td></tr></table></figure><h3 id="Git暂存管理"><a href="#Git暂存管理" class="headerlink" title="Git暂存管理"></a>Git暂存管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">git stash <span class="comment"># 暂存</span></span><br><span class="line"></span><br><span class="line">git stash list <span class="comment"># 列所有stash</span></span><br><span class="line"></span><br><span class="line">git stash apply <span class="comment"># 恢复暂存的内容</span></span><br><span class="line"></span><br><span class="line">git stash drop <span class="comment"># 删除暂存区</span></span><br></pre></td></tr></table></figure><h3 id="Git远程分支管理"><a href="#Git远程分支管理" class="headerlink" title="Git远程分支管理"></a>Git远程分支管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">git pull <span class="comment"># 抓取远程仓库所有分支更新并合并到本地</span></span><br><span class="line"></span><br><span class="line">git pull --no-ff <span class="comment"># 抓取远程仓库所有分支更新并合并到本地，不要快进合并</span></span><br><span class="line"></span><br><span class="line">git fetch origin <span class="comment"># 抓取远程仓库更新</span></span><br><span class="line"></span><br><span class="line">git merge origin/master <span class="comment"># 将远程主分支合并到本地当前分支</span></span><br><span class="line"></span><br><span class="line">git checkout --track origin/branch <span class="comment"># 跟踪某个远程分支创建相应的本地分支</span></span><br><span class="line"></span><br><span class="line">git checkout -b &lt;local_branch&gt; origin/&lt;remote_branch&gt; <span class="comment"># 基于远程分支创建本地分支，功能同上</span></span><br><span class="line"></span><br><span class="line">git push <span class="comment"># push所有分支</span></span><br><span class="line"></span><br><span class="line">git push origin master <span class="comment"># 将本地主分支推到远程主分支</span></span><br><span class="line"></span><br><span class="line">git push -u origin master <span class="comment"># 将本地主分支推到远程(如无远程主分支则创建，用于初始化远程仓库)</span></span><br><span class="line"></span><br><span class="line">git push origin &lt;local_branch&gt; <span class="comment"># 创建远程分支， origin是远程仓库名</span></span><br><span class="line"></span><br><span class="line">git push origin &lt;local_branch&gt;:&lt;remote_branch&gt; <span class="comment"># 创建远程分支</span></span><br><span class="line"></span><br><span class="line">git push origin :&lt;remote_branch&gt; <span class="comment">#先删除本地分支(git branch -d &lt;branch&gt;)，然后再push删除远程分支</span></span><br></pre></td></tr></table></figure><h3 id="Git远程仓库管理"><a href="#Git远程仓库管理" class="headerlink" title="Git远程仓库管理"></a>Git远程仓库管理</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">git remote -v <span class="comment"># 查看远程服务器地址和仓库名称</span></span><br><span class="line"></span><br><span class="line">git remote show origin <span class="comment"># 查看远程服务器仓库状态</span></span><br><span class="line"></span><br><span class="line">git remote add origin git@ github:robbin/robbin_site.git <span class="comment"># 添加远程仓库地址</span></span><br><span class="line"></span><br><span class="line">git remote <span class="built_in">set</span>-url origin git@ github.com:robbin/robbin_site.git <span class="comment"># 设置远程仓库地址(用于修改远程仓库地址) git remote rm &lt;repository&gt; # 删除远程仓库</span></span><br></pre></td></tr></table></figure><h3 id="创建远程仓库"><a href="#创建远程仓库" class="headerlink" title="创建远程仓库"></a>创建远程仓库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --bare robbin_site robbin_site.git <span class="comment"># 用带版本的项目创建纯版本仓库</span></span><br><span class="line"></span><br><span class="line">scp -r my_project.git git@ git.csdn.net:~ <span class="comment"># 将纯仓库上传到服务器上</span></span><br><span class="line"></span><br><span class="line">mkdir robbin_site.git &amp;&amp; <span class="built_in">cd</span> robbin_site.git &amp;&amp; git --bare init <span class="comment"># 在服务器创建纯仓库</span></span><br><span class="line"></span><br><span class="line">git remote add origin git@ github.com:robbin/robbin_site.git <span class="comment"># 设置远程仓库地址</span></span><br><span class="line"></span><br><span class="line">git push -u origin master <span class="comment"># 客户端首次提交</span></span><br><span class="line"></span><br><span class="line">git push -u origin develop <span class="comment"># 首次将本地develop分支提交到远程develop分支，并且track</span></span><br><span class="line"></span><br><span class="line">git remote <span class="built_in">set</span>-head origin master <span class="comment"># 设置远程仓库的HEAD指向master分支</span></span><br><span class="line"></span><br><span class="line">也可以命令设置跟踪远程库和本地库</span><br><span class="line"></span><br><span class="line">git branch --<span class="built_in">set</span>-upstream master origin/master</span><br><span class="line"></span><br><span class="line">git branch --<span class="built_in">set</span>-upstream develop origin/develop</span><br></pre></td></tr></table></figure><h3 id="git删除未跟踪文件"><a href="#git删除未跟踪文件" class="headerlink" title="git删除未跟踪文件"></a>git删除未跟踪文件</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 删除 untracked files</span></span><br><span class="line">git clean -f</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 连 untracked 的目录也一起删掉</span></span><br><span class="line">git clean -fd</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 连 gitignore 的untrack 文件/目录也一起删掉 （慎用，一般这个是用来删掉编译出来的 .o之类的文件用的）</span></span><br><span class="line">git clean -xfd</span><br><span class="line"> </span><br><span class="line"><span class="comment"># 在用上述 git clean 前，墙裂建议加上 -n 参数来先看看会删掉哪些文件，防止重要文件被误删</span></span><br><span class="line">git clean -nxfd</span><br><span class="line">git clean -nf</span><br><span class="line">git clean -nfd</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      
      
        &lt;h3 id=&quot;查看、添加、提交、删除、找回，重置修改文件&quot;&gt;&lt;a href=&quot;#查看、添加、提交、删除、找回，重置修改文件&quot; class=&quot;headerlink&quot; title=&quot;查看、添加、提交、删除、找回，重置修改文件&quot;&gt;&lt;/a&gt;查看、添加、提交、删除、找回，重置修改文件&lt;/
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/categories/Linux/git/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Linux配置ssh key免密登录</title>
    <link href="http://whatcode.cn/2017/11/14/Linux-ssh-rsa/"/>
    <id>http://whatcode.cn/2017/11/14/Linux-ssh-rsa/</id>
    <published>2017-11-13T16:00:00.000Z</published>
    <updated>2017-12-25T02:29:52.000Z</updated>
    
    <content type="html"><![CDATA[<p>linux配置ssh key有两个好处：<br>1、可以免密登录服务器<br>2、增加服务器安全性，避免黑客暴力破解密码。<br>原理：首先由用户生成一对密钥，然后将公钥保存在SSH服务器用户的目录下.ssh子目录中的authorized_key文件里(/root/.ssh/authorized_key).私钥保存在本地计算机.当用户登陆时,服务器检查authorized_key文件的公钥是否与用户的私钥对应,如果相符则允许登入,否则拒绝.由于私钥只有保存在用户的本地计算机中,因此入侵者就算得到用户口令,也不能登陆到服务器.</p><p><strong>1、首先新增一个普通用户</strong><br>为了服务器更加安全，一般都是禁止root账号直接登录，所以要创建一个普通账号用于登录服务器，然后再切换root账号管理服务器，即使authorized_key泄露，也能避免root权限被使用。<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">###创建tenke用户，并且创建/home/tenke目录</span></span><br><span class="line">root@ubuntu:~/.ssh$ useradd tenke -d /home/tenke -m -s /bin/bash</span><br><span class="line"><span class="comment">###添加用户密码</span></span><br><span class="line">root@ubuntu:~/.ssh$ passwd tenke</span><br></pre></td></tr></table></figure></p><p><strong>2、首先生成ssh密钥</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">root@ubuntu:~/.ssh$ ssh-keygen -t rsa</span><br><span class="line"><span class="comment">###直接回车3次</span></span><br><span class="line"><span class="comment">###key文件会保存在/root/.ssh目录下</span></span><br><span class="line"><span class="comment">###这时候.ssh目下会多出几个文件</span></span><br><span class="line"><span class="comment">###id_rsa   私钥文件，放在自己电脑</span></span><br><span class="line"><span class="comment">###id_rsa.pub  公钥文件,放在/home/tenke/.ssh下，并且修改名字为：authorized_keys</span></span><br><span class="line">root@ubuntu:~/.ssh$ mkdir -p /home/tenke/.ssh</span><br><span class="line">root@ubuntu:~/.ssh$ mv id_rsa.pub /home/tenke/.ssh/authorized_keys</span><br><span class="line"><span class="comment">###修改.ssh目录的权限 700</span></span><br><span class="line">root@ubuntu:~/.ssh$ chmod 700 /home/tenke/.ssh</span><br><span class="line"><span class="comment">###修改authorized_keys文件权限 600</span></span><br><span class="line">root@ubuntu:~/.ssh$ chmod 600 /home/tenke/.ssh/authorized_keys</span><br></pre></td></tr></table></figure></p><p><strong>3、修改服务器sshd配置</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">###打开sshd_config文件</span></span><br><span class="line">root@ubuntu:~/.ssh$ vi /etc/ssh/sshd_config</span><br></pre></td></tr></table></figure></p><p>修改ssh默认端口，禁止root账号登录，禁止密码登录<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Package generated configuration file</span></span><br><span class="line"><span class="comment"># See the sshd_config(5) manpage for details</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># What ports, IPs and protocols we listen for</span></span><br><span class="line">Port 20000 <span class="comment">###修改默认22端口</span></span><br><span class="line"><span class="comment"># Use these options to restrict which interfaces/protocols sshd will bind to</span></span><br><span class="line"><span class="comment">#ListenAddress ::</span></span><br><span class="line"><span class="comment">#ListenAddress 0.0.0.0</span></span><br><span class="line">Protocol 2</span><br><span class="line"><span class="comment"># HostKeys for protocol version 2</span></span><br><span class="line">HostKey /etc/ssh/ssh_host_rsa_key</span><br><span class="line">HostKey /etc/ssh/ssh_host_dsa_key</span><br><span class="line">HostKey /etc/ssh/ssh_host_ecdsa_key</span><br><span class="line">HostKey /etc/ssh/ssh_host_ed25519_key</span><br><span class="line"><span class="comment">#Privilege Separation is turned on for security</span></span><br><span class="line">UsePrivilegeSeparation yes</span><br><span class="line"></span><br><span class="line"><span class="comment"># Lifetime and size of ephemeral version 1 server key</span></span><br><span class="line">KeyRegenerationInterval 3600</span><br><span class="line">ServerKeyBits 1024</span><br><span class="line"></span><br><span class="line"><span class="comment"># Logging</span></span><br><span class="line">LogLevel INFO</span><br><span class="line"></span><br><span class="line"><span class="comment"># Authentication:</span></span><br><span class="line">LoginGraceTime 120</span><br><span class="line">StrictModes yes</span><br><span class="line"></span><br><span class="line">RSAAuthentication yes</span><br><span class="line">PubkeyAuthentication yes</span><br><span class="line"><span class="comment">#AuthorizedKeysFile     %h/.ssh/authorized_keys</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Don't read the user's ~/.rhosts and ~/.shosts files</span></span><br><span class="line">IgnoreRhosts yes</span><br><span class="line"><span class="comment"># For this to work you will also need host keys in /etc/ssh_known_hosts</span></span><br><span class="line">RhostsRSAAuthentication no</span><br><span class="line"><span class="comment"># similar for protocol version 2</span></span><br><span class="line">HostbasedAuthentication no</span><br><span class="line"><span class="comment"># Uncomment if you don't trust ~/.ssh/known_hosts for RhostsRSAAuthentication</span></span><br><span class="line"><span class="comment">#IgnoreUserKnownHosts yes</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># To enable empty passwords, change to yes (NOT RECOMMENDED)</span></span><br><span class="line">PermitEmptyPasswords no <span class="comment">###禁止空密码登录</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Change to yes to enable challenge-response passwords (beware issues with</span></span><br><span class="line"><span class="comment"># some PAM modules and threads)</span></span><br><span class="line">ChallengeResponseAuthentication no</span><br><span class="line"><span class="comment"># Change to no to disable tunnelled clear text passwords</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Kerberos options</span></span><br><span class="line"><span class="comment">#KerberosAuthentication no</span></span><br><span class="line"><span class="comment">#KerberosGetAFSToken no</span></span><br><span class="line"><span class="comment">#KerberosOrLocalPasswd yes</span></span><br><span class="line"><span class="comment">#KerberosTicketCleanup yes</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># GSSAPI options</span></span><br><span class="line"><span class="comment">#GSSAPIAuthentication no</span></span><br><span class="line"><span class="comment">#GSSAPICleanupCredentials yes</span></span><br><span class="line"></span><br><span class="line">X11Forwarding yes</span><br><span class="line">X11DisplayOffset 10</span><br><span class="line">PrintMotd no</span><br><span class="line">PrintLastLog yes</span><br><span class="line">TCPKeepAlive yes</span><br><span class="line"><span class="comment">#UseLogin no</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#MaxStartups 10:30:60</span></span><br><span class="line"><span class="comment">#Banner /etc/issue.net</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Allow client to pass locale environment variables</span></span><br><span class="line">AcceptEnv LANG LC_*</span><br><span class="line"></span><br><span class="line">Subsystem sftp /usr/lib/openssh/sftp-server</span><br><span class="line"></span><br><span class="line"><span class="comment"># Set this to 'yes' to enable PAM authentication, account processing,</span></span><br><span class="line"><span class="comment"># and session processing. If this is enabled, PAM authentication will</span></span><br><span class="line"><span class="comment"># be allowed through the ChallengeResponseAuthentication and</span></span><br><span class="line"><span class="comment"># PAM authentication via ChallengeResponseAuthentication may bypass</span></span><br><span class="line"><span class="comment"># If you just want the PAM account and session checks to run without</span></span><br><span class="line"><span class="comment"># and ChallengeResponseAuthentication to 'no'.</span></span><br><span class="line">UsePAM yes</span><br><span class="line"></span><br><span class="line">UseDNS no</span><br><span class="line">AddressFamily inet</span><br><span class="line">PermitRootLogin no  <span class="comment">### 禁止root账号直接登录</span></span><br><span class="line">SyslogFacility AUTHPRIV</span><br><span class="line">PasswordAuthentication no <span class="comment">### 禁止密码直接登录</span></span><br><span class="line">ClientAliveInterval = 120</span><br></pre></td></tr></table></figure></p><p>重启sshd服务<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">root@ubuntu:~/.ssh$ service sshd restart</span><br></pre></td></tr></table></figure></p><p><strong>4、测试使用ssh-key登录服务器</strong><br>需要注意的问题：.ssh目录的权限，authorized_key文件的权限，指定的ssh端口是否已经开启</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;linux配置ssh key有两个好处：&lt;br&gt;1、可以免密登录服务器&lt;br&gt;2、增加服务器安全性，避免黑客暴力破解密码。&lt;br&gt;原理：首先由用户生成一对密钥，然后将公钥保存在SSH服务器用户的目录下.ssh子目录中的authorized_key文件里(/root/.ssh
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="ssh" scheme="http://whatcode.cn/categories/Linux/ssh/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="ssh" scheme="http://whatcode.cn/tags/ssh/"/>
    
  </entry>
  
  <entry>
    <title>centos6升级内核</title>
    <link href="http://whatcode.cn/2017/10/12/linux-update-kernel/"/>
    <id>http://whatcode.cn/2017/10/12/linux-update-kernel/</id>
    <published>2017-10-11T16:00:00.000Z</published>
    <updated>2017-12-22T02:27:03.000Z</updated>
    
    <content type="html"><![CDATA[<p>阿里云一直提示我系统内核漏洞问题，刚好今天抽空解决了，下面分享一下centos6.5升级内核方法。</p><p><strong>1、查看当前系统内核版本</strong><br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[ghost@localhost ~]$ uname -r</span><br><span class="line">2.6.32.el6.elrepo.x86_64</span><br></pre></td></tr></table></figure></p><p><strong>2、找到想要升级的内核源</strong><br>可以看到当前版本是2.6，现在我们需要升级到3.0以上的版本，可以先到官网找到最新的内核源。地址：<br><a href="http://elrepo.reloumirrors.net/kernel/el6/x86_64/RPMS/" target="_blank" rel="noopener">http://elrepo.reloumirrors.net/kernel/el6/x86_64/RPMS/</a><br>注意一点：请根据你的centos版本找对应的源，这里的地址是centos6.X版本，不要弄错了，弄错源会安装失败的！<br><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">## 在安装yum源之前还需要我们导入elrepo的key</span></span><br><span class="line">[ghost@localhost ~]$ rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org</span><br><span class="line"></span><br><span class="line"><span class="comment">## 直接yum安装指定的内核版本</span></span><br><span class="line">[ghost@localhost ~]$ yum install -y http://elrepo.reloumirrors.net/kernel/el6/x86_64/RPMS/kernel<span class="_">-lt</span>-3.10.107-1.el6.elrepo.x86_64.rpm</span><br><span class="line"></span><br><span class="line"><span class="comment">## 等内核安装完，修改grub.conf文件</span></span><br><span class="line">[ghost@localhost ~]$ vim /etc/grub.conf</span><br><span class="line"><span class="comment">## 找到default参数，修改为：default=0,保存退出</span></span><br><span class="line">default=0</span><br><span class="line"></span><br><span class="line"><span class="comment">## 重启系统</span></span><br><span class="line">[ghost@localhost ~]$ reboot</span><br><span class="line"></span><br><span class="line"><span class="comment">## 查看现在系统版本</span></span><br><span class="line">[ghost@localhost ~]$ uname -r</span><br><span class="line">3.10.107-1.el6.elrepo.x86_64</span><br><span class="line">[ghost@localhost ~]$ cat /etc/issue</span><br><span class="line">CentOS release 6.9 (Final)</span><br><span class="line">Kernel \r on an \m</span><br></pre></td></tr></table></figure></p><p>大功告成，当前centos的内核已经升级到了3.10版本了，centos升级内核其实还是挺简单的！</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;阿里云一直提示我系统内核漏洞问题，刚好今天抽空解决了，下面分享一下centos6.5升级内核方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、查看当前系统内核版本&lt;/strong&gt;&lt;br&gt;&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td c
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="kernel" scheme="http://whatcode.cn/categories/Linux/kernel/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="kernel" scheme="http://whatcode.cn/tags/kernel/"/>
    
  </entry>
  
  <entry>
    <title>Centos Git1.7.1升级到Git2.2.1</title>
    <link href="http://whatcode.cn/2017/05/15/Linux-git-update/"/>
    <id>http://whatcode.cn/2017/05/15/Linux-git-update/</id>
    <published>2017-05-14T16:00:00.000Z</published>
    <updated>2017-12-22T02:31:29.000Z</updated>
    
    <content type="html"><![CDATA[<p>由于centos的yum安装的git还是1.7.1版本，导致git clone出现401错误：error: The requested URL returned error: 401 Unauthorized while accessing ，可以使用git --version查看版本。现在需要到github上获取最新版本编译安装。</p><h3 id="先安装好依赖库"><a href="#先安装好依赖库" class="headerlink" title="先安装好依赖库"></a>先安装好依赖库</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel asciidoc</span><br><span class="line">yum -y install gcc perl-ExtUtils-MakeMaker</span><br></pre></td></tr></table></figure><h3 id="卸载Centos自带的git1-7-1"><a href="#卸载Centos自带的git1-7-1" class="headerlink" title="卸载Centos自带的git1.7.1"></a>卸载Centos自带的git1.7.1</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum remove git</span><br></pre></td></tr></table></figure><h3 id="下载git"><a href="#下载git" class="headerlink" title="下载git"></a>下载git</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://github.com/git/git/archive/v2.2.1.tar.gz</span><br></pre></td></tr></table></figure><h3 id="编译安装"><a href="#编译安装" class="headerlink" title="编译安装"></a>编译安装</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">tar -zxvf git-2.2.1.tar.gz</span><br><span class="line"><span class="built_in">cd</span> git-2.2.1</span><br><span class="line">make prefix=/usr/<span class="built_in">local</span>/git all</span><br><span class="line">make prefix=/usr/<span class="built_in">local</span>/git install</span><br><span class="line"><span class="built_in">echo</span> <span class="string">"export PATH=<span class="variable">$PATH</span>:/usr/local/git/bin"</span> &gt;&gt; /etc/bashrc</span><br><span class="line"><span class="built_in">source</span> /etc/bashrc</span><br></pre></td></tr></table></figure><h3 id="查看版本"><a href="#查看版本" class="headerlink" title="查看版本"></a>查看版本</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git --version</span><br></pre></td></tr></table></figure><h3 id="末尾"><a href="#末尾" class="headerlink" title="末尾"></a>末尾</h3><p>到这里，你可以快乐的git clone了</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;由于centos的yum安装的git还是1.7.1版本，导致git clone出现401错误：error: The requested URL returned error: 401 Unauthorized while accessing ，可以使用git --versi
      
    
    </summary>
    
      <category term="Linux" scheme="http://whatcode.cn/categories/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/categories/Linux/git/"/>
    
    
      <category term="Linux" scheme="http://whatcode.cn/tags/Linux/"/>
    
      <category term="git" scheme="http://whatcode.cn/tags/git/"/>
    
  </entry>
  
</feed>
