洒脱看繁华 發表於 2019-11-4 15:19:00

微信公众号开发--.net core接入

<p>  .net进行微信公众号开发的例子好像比较少,这里做个笔记</p>
<p>  首先,我们需要让微信能访问到我们的项目,所以要么需要有一个可以部署项目的连接到公网下的服务器,要么可以通过端口转发将请求转发到我们的项目,总之,就是要让微信服务器能访问到我们的项目。</p>
<p>  另外,需要注意一下,微信回调通知的地址目前只支持80端口和443端口,所以一般的,我们都需要做个虚拟路径</p>
<p>  其他的就不多说了,具体配置可以在微信公众号的开发文档中接入:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html</p>
<p>  接入过程中会遇到很多坑,什么Url超时,Token验证错误等等,反正就是一些触不及防,当我们接入开发完后,发现我们使用的是明文传送,那当然就不行了,改成密文又要使用AES加密,反正接入不知道遇到多少坑</p>
<p>  下面贴出我接入的代码,复制一下,稍稍修改就可以用了,可直接验证接入,支持明文密文传输:</p>
<p>  一个加密解密辅助类:  </p>
<div class="cnblogs_code"><img id="code_img_closed_e2a701fa-5e57-4fc1-a928-c208f9087f0e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_e2a701fa-5e57-4fc1-a928-c208f9087f0e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_e2a701fa-5e57-4fc1-a928-c208f9087f0e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.IO;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Net;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Security.Cryptography;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Text;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Xml;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> DemoApi
{
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">sealed</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> EncryptHelper
    {
      </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> EncryptHelper() { }

      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> Md5加密
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="text"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Md5Encrypt(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> text)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">MD5加密</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> md5 =<span style="color: rgba(0, 0, 0, 1)"> MD5.Create();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> bs =<span style="color: rgba(0, 0, 0, 1)"> md5.ComputeHash(Encoding.UTF8.GetBytes(text));
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> sb = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StringBuilder();
            </span><span style="color: rgba(0, 0, 255, 1)">foreach</span> (<span style="color: rgba(0, 0, 255, 1)">byte</span> b <span style="color: rgba(0, 0, 255, 1)">in</span><span style="color: rgba(0, 0, 0, 1)"> bs)
            {
                sb.Append(b.ToString(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">));
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">所有字符转为大写</span>
            <span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sb.ToString().ToUpper();
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> HMAC-SHA1加密算法
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="str"&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密字符串</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Sha1Encrypt(<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> str)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> sha1 =<span style="color: rgba(0, 0, 0, 1)"> SHA1.Create();
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> hash =<span style="color: rgba(0, 0, 0, 1)"> sha1.ComputeHash(Encoding.Default.GetBytes(str));
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">return BitConverter.ToString(hash).Replace("-", "");</span>
            <span style="color: rgba(0, 0, 255, 1)">string</span> byte2String = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; hash.Length; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                byte2String </span>+= hash.ToString(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">x2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> byte2String;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> AES加密
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="text"&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密字符</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="encodingAESKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">加密的密码</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="appid"&gt;</span><span style="color: rgba(0, 128, 0, 1)">appId</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AESEncrypt(<span style="color: rgba(0, 0, 255, 1)">string</span> text, <span style="color: rgba(0, 0, 255, 1)">string</span> encodingAESKey, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> appid)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(text))
            {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> text;
            }

            </span><span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] key;
            key </span>= Convert.FromBase64String(encodingAESKey + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] iv = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[<span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">];
            Array.Copy(key, iv, </span><span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 0, 255, 1)">#region</span> 生成随机值
            <span style="color: rgba(0, 0, 255, 1)">string</span> codeSerial = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">2,3,4,5,6,7,a,c,d,e,f,h,i,j,k,m,n,p,r,s,t,A,C,D,E,F,G,H,J,K,M,N,P,Q,R,S,U,V,W,X,Y,Z</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span>[] arr = codeSerial.Split(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">,</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> code = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> randValue = -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
            Random rand </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Random(<span style="color: rgba(0, 0, 255, 1)">unchecked</span>((<span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">)DateTime.Now.Ticks));
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">16</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
            {
                randValue </span>= rand.Next(<span style="color: rgba(128, 0, 128, 1)">0</span>, arr.Length - <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">);
                code </span>+=<span style="color: rgba(0, 0, 0, 1)"> arr;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">byte</span>[] bRand =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(code);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bAppid =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(appid);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] btmpMsg =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(text);

            </span><span style="color: rgba(0, 0, 255, 1)">int</span> outval = <span style="color: rgba(128, 0, 128, 1)">0</span>, inval =<span style="color: rgba(0, 0, 0, 1)"> btmpMsg.Length;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i &lt; <span style="color: rgba(128, 0, 128, 1)">4</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
                outval </span>= (outval &lt;&lt; <span style="color: rgba(128, 0, 128, 1)">8</span>) + ((inval &gt;&gt; (i * <span style="color: rgba(128, 0, 128, 1)">8</span>)) &amp; <span style="color: rgba(128, 0, 128, 1)">255</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bMsgLen =<span style="color: rgba(0, 0, 0, 1)"> BitConverter.GetBytes(outval);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bMsg = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;

            Array.Copy(bRand, bMsg, bRand.Length);
            Array.Copy(bMsgLen, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, bMsg, bRand.Length, bMsgLen.Length);
            Array.Copy(btmpMsg, </span><span style="color: rgba(128, 0, 128, 1)">0</span>, bMsg, bRand.Length +<span style="color: rgba(0, 0, 0, 1)"> bMsgLen.Length, btmpMsg.Length);
            Array.Copy(bAppid, </span><span style="color: rgba(128, 0, 128, 1)">0</span>, bMsg, bRand.Length + bMsgLen.Length +<span style="color: rgba(0, 0, 0, 1)"> btmpMsg.Length, bAppid.Length);

            </span><span style="color: rgba(0, 0, 255, 1)">var</span> aes = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RijndaelManaged();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">秘钥的大小,以位为单位</span>
            aes.KeySize = <span style="color: rgba(128, 0, 128, 1)">256</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">支持的块大小</span>
            aes.BlockSize = <span style="color: rgba(128, 0, 128, 1)">128</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">填充模式
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">aes.Padding = PaddingMode.PKCS7;</span>
            aes.Padding =<span style="color: rgba(0, 0, 0, 1)"> PaddingMode.None;
            aes.Mode </span>=<span style="color: rgba(0, 0, 0, 1)"> CipherMode.CBC;
            aes.Key </span>=<span style="color: rgba(0, 0, 0, 1)"> key;
            aes.IV </span>=<span style="color: rgba(0, 0, 0, 1)"> iv;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> encrypt =<span style="color: rgba(0, 0, 0, 1)"> aes.CreateEncryptor(aes.Key, aes.IV);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] xBuff = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] msg = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;
            Array.Copy(bMsg, msg, bMsg.Length);

            </span><span style="color: rgba(0, 0, 255, 1)">#region</span> 自己进行PKCS7补位,用系统自己带的不行,微信加密要使用这个
            <span style="color: rgba(0, 0, 255, 1)">int</span> block_size = <span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 计算需要填充的位数</span>
            <span style="color: rgba(0, 0, 255, 1)">int</span> amount_to_pad = block_size - (bMsg.Length %<span style="color: rgba(0, 0, 0, 1)"> block_size);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (amount_to_pad == <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">)
            {
                amount_to_pad </span>=<span style="color: rgba(0, 0, 0, 1)"> block_size;
            }
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 获得补位所用的字符</span>
            <span style="color: rgba(0, 0, 255, 1)">char</span> pad_chr = (<span style="color: rgba(0, 0, 255, 1)">char</span>)(<span style="color: rgba(0, 0, 255, 1)">byte</span>)(amount_to_pad &amp; <span style="color: rgba(128, 0, 128, 1)">0xFF</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> tmp = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">for</span> (<span style="color: rgba(0, 0, 255, 1)">int</span> index = <span style="color: rgba(128, 0, 128, 1)">0</span>; index &lt; amount_to_pad; index++<span style="color: rgba(0, 0, 0, 1)">)
            {
                tmp </span>+=<span style="color: rgba(0, 0, 0, 1)"> pad_chr;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] pad =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetBytes(tmp);

            Array.Copy(pad, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, msg, bMsg.Length, pad.Length);

            </span><span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> ms = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream())
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> cs = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(ms, encrypt, CryptoStreamMode.Write))
                {
                  cs.Write(msg, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, msg.Length);
                }
                xBuff </span>=<span style="color: rgba(0, 0, 0, 1)"> ms.ToArray();
            }
            </span><span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">#region</span> 注释的也是一种方法,效果一样,微信加密不能使用这个!!!!
            <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">ICryptoTransform transform = aes.CreateEncryptor();
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">xBuff = transform.TransformFinalBlock(msg, 0, msg.Length);</span>
            <span style="color: rgba(0, 0, 255, 1)">#endregion</span>

            <span style="color: rgba(0, 0, 255, 1)">string</span> output =<span style="color: rgba(0, 0, 0, 1)"> Convert.ToBase64String(xBuff);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> output;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> AES解密
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="encryptText"&gt;</span><span style="color: rgba(0, 128, 0, 1)">密文</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="encodingAESKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">秘钥</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="appid"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AESDecrypt(<span style="color: rgba(0, 0, 255, 1)">string</span> encryptText, <span style="color: rgba(0, 0, 255, 1)">string</span> encodingAESKey, <span style="color: rgba(0, 0, 255, 1)">out</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> appid)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(encryptText))
            {
                appid </span>= <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> encryptText;
            }

            </span><span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">[] key;
            key </span>= Convert.FromBase64String(encodingAESKey + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">=</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] iv = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>[<span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">];
            Array.Copy(key, iv, </span><span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] btmpMsg = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;

            RijndaelManaged aes </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RijndaelManaged();
            aes.KeySize </span>= <span style="color: rgba(128, 0, 128, 1)">256</span><span style="color: rgba(0, 0, 0, 1)">;
            aes.BlockSize </span>= <span style="color: rgba(128, 0, 128, 1)">128</span><span style="color: rgba(0, 0, 0, 1)">;
            aes.Mode </span>=<span style="color: rgba(0, 0, 0, 1)"> CipherMode.CBC;
            aes.Padding </span>=<span style="color: rgba(0, 0, 0, 1)"> PaddingMode.None;
            aes.Key </span>=<span style="color: rgba(0, 0, 0, 1)"> key;
            aes.IV </span>=<span style="color: rgba(0, 0, 0, 1)"> iv;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> decrypt =<span style="color: rgba(0, 0, 0, 1)"> aes.CreateDecryptor(aes.Key, aes.IV);
            </span><span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> ms = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> MemoryStream())
            {
                </span><span style="color: rgba(0, 0, 255, 1)">using</span> (<span style="color: rgba(0, 0, 255, 1)">var</span> cs = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CryptoStream(ms, decrypt, CryptoStreamMode.Write))
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] xXml =<span style="color: rgba(0, 0, 0, 1)"> Convert.FromBase64String(encryptText);
                  </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] msg = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;
                  Array.Copy(xXml, msg, xXml.Length);
                  cs.Write(xXml, </span><span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, xXml.Length);
                }
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> decrypted =<span style="color: rgba(0, 0, 0, 1)"> ms.ToArray();
                </span><span style="color: rgba(0, 0, 255, 1)">int</span> pad = (<span style="color: rgba(0, 0, 255, 1)">int</span>)decrypted;
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (pad &lt; <span style="color: rgba(128, 0, 128, 1)">1</span> || pad &gt; <span style="color: rgba(128, 0, 128, 1)">32</span><span style="color: rgba(0, 0, 0, 1)">)
                {
                  pad </span>= <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
                }
                btmpMsg </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;
                Array.Copy(decrypted, </span><span style="color: rgba(128, 0, 128, 1)">0</span>, btmpMsg, <span style="color: rgba(128, 0, 128, 1)">0</span>, decrypted.Length -<span style="color: rgba(0, 0, 0, 1)"> pad);
            }

            </span><span style="color: rgba(0, 0, 255, 1)">int</span> len = BitConverter.ToInt32(btmpMsg, <span style="color: rgba(128, 0, 128, 1)">16</span><span style="color: rgba(0, 0, 0, 1)">);
            len </span>=<span style="color: rgba(0, 0, 0, 1)"> IPAddress.NetworkToHostOrder(len);


            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bMsg = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] bAppid = <span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">byte</span>;
            Array.Copy(btmpMsg, </span><span style="color: rgba(128, 0, 128, 1)">20</span>, bMsg, <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">, len);
            Array.Copy(btmpMsg, </span><span style="color: rgba(128, 0, 128, 1)">20</span> + len, bAppid, <span style="color: rgba(128, 0, 128, 1)">0</span>, btmpMsg.Length - <span style="color: rgba(128, 0, 128, 1)">20</span> -<span style="color: rgba(0, 0, 0, 1)"> len);
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> oriMsg =<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(bMsg);
            appid </span>=<span style="color: rgba(0, 0, 0, 1)"> Encoding.UTF8.GetString(bAppid);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> oriMsg;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> AES解密
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="encryptText"&gt;</span><span style="color: rgba(0, 128, 0, 1)">密文</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="encodingAESKey"&gt;</span><span style="color: rgba(0, 128, 0, 1)">秘钥</span><span style="color: rgba(128, 128, 128, 1)">&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="appid"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AESDecrypt(<span style="color: rgba(0, 0, 255, 1)">string</span> encryptText, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> encodingAESKey)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> AESDecrypt(encryptText, encodingAESKey, <span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)"> _);
      }
    }

    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> CharSort : IComparer
    {
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">int</span> Compare(<span style="color: rgba(0, 0, 255, 1)">object</span> left, <span style="color: rgba(0, 0, 255, 1)">object</span><span style="color: rgba(0, 0, 0, 1)"> right)
      {
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> sLeft = left <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> sRight = right <span style="color: rgba(0, 0, 255, 1)">as</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> leftLength =<span style="color: rgba(0, 0, 0, 1)"> sLeft.Length;
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> rightLength =<span style="color: rgba(0, 0, 0, 1)"> sRight.Length;
            </span><span style="color: rgba(0, 0, 255, 1)">int</span> index = <span style="color: rgba(128, 0, 128, 1)">0</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">while</span> (index &lt; leftLength &amp;&amp; index &lt;<span style="color: rgba(0, 0, 0, 1)"> rightLength)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (sLeft &lt;<span style="color: rgba(0, 0, 0, 1)"> sRight)
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> -<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (sLeft &gt;<span style="color: rgba(0, 0, 0, 1)"> sRight)
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
                  index</span>++<span style="color: rgba(0, 0, 0, 1)">;
            }
            </span><span style="color: rgba(0, 0, 255, 1)">return</span> leftLength -<span style="color: rgba(0, 0, 0, 1)"> rightLength;
      }
    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">EncryptHelper</span></div>
<p>  接入接口核心代码: </p>
<div class="cnblogs_code"><img id="code_img_closed_dda38908-8d3a-4a7f-91a0-d2f4b3633c6d" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_dda38908-8d3a-4a7f-91a0-d2f4b3633c6d" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_dda38908-8d3a-4a7f-91a0-d2f4b3633c6d" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Collections.Generic;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.IO;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Net.Http;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Threading.Tasks;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Web;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> System.Xml.Linq;
</span><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Microsoft.AspNetCore.Mvc;

</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> DemoApi.Controllers
{
    </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)]
   
    </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WxController : ControllerBase
    {
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 生成签名
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="args"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">string</span> MakeSign(<span style="color: rgba(0, 0, 255, 1)">params</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字典排序</span>
<span style="color: rgba(0, 0, 0, 1)">            Array.Sort(args);
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> tmpStr = <span style="color: rgba(0, 0, 255, 1)">string</span>.Join(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, args);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字符加密</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> sha1 =<span style="color: rgba(0, 0, 0, 1)"> EncryptHelper.Sha1Encrypt(tmpStr);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sha1;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 生成消息签名
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;param name="args"&gt;&lt;/param&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">string</span> MakeMsgSign(<span style="color: rgba(0, 0, 255, 1)">params</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">[] args)
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字典排序</span>
            Array.Sort(args, <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> CharSort());
            </span><span style="color: rgba(0, 0, 255, 1)">string</span> tmpStr = <span style="color: rgba(0, 0, 255, 1)">string</span>.Join(<span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">, args);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字符加密</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> sha1 =<span style="color: rgba(0, 0, 0, 1)"> EncryptHelper.Sha1Encrypt(tmpStr);
            </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> sha1;
      }
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span><span style="color: rgba(0, 128, 0, 1)"> 微信回调统一接口
      </span><span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;/summary&gt;</span>
      <span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)">&lt;returns&gt;&lt;/returns&gt;</span>
<span style="color: rgba(0, 0, 0, 1)">      
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> Service()
      {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取配置文件中的数据</span>
            <span style="color: rgba(0, 0, 255, 1)">var</span> token = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> encodingAESKey = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">var</span> appId = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;

            </span><span style="color: rgba(0, 0, 255, 1)">bool</span> isGet = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Equals(HttpContext.Request.Method, HttpMethod.Get.Method, StringComparison.OrdinalIgnoreCase);
            </span><span style="color: rgba(0, 0, 255, 1)">bool</span> isPost = <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.Equals(HttpContext.Request.Method, HttpMethod.Post.Method, StringComparison.OrdinalIgnoreCase);
            </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!isGet &amp;&amp; !<span style="color: rgba(0, 0, 0, 1)">isPost)
            {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
            }

            </span><span style="color: rgba(0, 0, 255, 1)">bool</span> isEncrypt = <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)">
            {
                </span><span style="color: rgba(0, 0, 255, 1)">var</span> query =<span style="color: rgba(0, 0, 0, 1)"> HttpContext.Request.QueryString.ToString();
                </span><span style="color: rgba(0, 0, 255, 1)">string</span> msg_signature = <span style="color: rgba(128, 0, 0, 1)">""</span>, nonce = <span style="color: rgba(128, 0, 0, 1)">""</span>, timestamp = <span style="color: rgba(128, 0, 0, 1)">""</span>, encrypt_type = <span style="color: rgba(128, 0, 0, 1)">""</span>, signature = <span style="color: rgba(128, 0, 0, 1)">""</span>, echostr = <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;

                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(query))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">需要验证签名</span>
<span style="color: rgba(0, 0, 0, 1)">                {
                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> collection =<span style="color: rgba(0, 0, 0, 1)"> HttpUtility.ParseQueryString(query);
                  msg_signature </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msg_signature</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();
                  nonce </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nonce</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();
                  timestamp </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();
                  encrypt_type </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">encrypt_type</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();
                  signature </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();
                  echostr </span>= collection[<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">echostr</span><span style="color: rgba(128, 0, 0, 1)">"</span>]?<span style="color: rgba(0, 0, 0, 1)">.Trim();

                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span>.IsNullOrEmpty(encrypt_type))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">有使用加密</span>
<span style="color: rgba(0, 0, 0, 1)">                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span>.Equals(encrypt_type, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">aes</span><span style="color: rgba(128, 0, 0, 1)">"</span>, StringComparison.OrdinalIgnoreCase))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只支持AES加密方式</span>
<span style="color: rgba(0, 0, 0, 1)">                        {
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                        isEncrypt </span>= <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">;
                  }
                }

                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">先验证签名</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(signature))
                {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">字符加密</span>
                  <span style="color: rgba(0, 0, 255, 1)">var</span> sha1 =<span style="color: rgba(0, 0, 0, 1)"> MakeSign(nonce, timestamp, token);
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!sha1.Equals(signature, StringComparison.OrdinalIgnoreCase))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证不通过</span>
<span style="color: rgba(0, 0, 0, 1)">                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                  }

                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (isGet)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">是否Get请求,如果true,那么就认为是修改服务器回调配置信息</span>
<span style="color: rgba(0, 0, 0, 1)">                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> echostr;
                  }
                }
                </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)">
                {
                  </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">没有签名,请求直接返回</span>
<span style="color: rgba(0, 0, 0, 1)">                }

                </span><span style="color: rgba(0, 0, 255, 1)">var</span> body = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StreamReader(HttpContext.Request.Body).ReadToEnd();

                </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isEncrypt)
                {
                  XDocument doc </span>=<span style="color: rgba(0, 0, 0, 1)"> XDocument.Parse(body);
                  </span><span style="color: rgba(0, 0, 255, 1)">var</span> encrypt = doc.Element(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">xml</span><span style="color: rgba(128, 0, 0, 1)">"</span>).Element(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Encrypt</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证消息签名</span>
                  <span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(msg_signature))
                  {
                        </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">消息加密</span>
                        <span style="color: rgba(0, 0, 255, 1)">var</span> sha1 =<span style="color: rgba(0, 0, 0, 1)"> MakeMsgSign(nonce, timestamp, encrypt.Value, token);
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!sha1.Equals(msg_signature, StringComparison.OrdinalIgnoreCase))<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">验证不通过</span>
<span style="color: rgba(0, 0, 0, 1)">                        {
                            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                  }

                  body </span>= EncryptHelper.AESDecrypt(encrypt.Value, encodingAESKey);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">解密</span>
<span style="color: rgba(0, 0, 0, 1)">                }

                </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(body))
                {
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span>
                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">在这里根据body中的MsgType和Even来区分消息,然后来处理不同的业务逻辑
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span>
                  <span style="color: rgba(0, 128, 0, 1)">//</span>

                  <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">result是上面逻辑处理完成之后的待返回结果,如返回文本消息:</span>
                  <span style="color: rgba(0, 0, 255, 1)">var</span> result = <span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">&lt;xml&gt;
                                    &lt;ToUserName&gt;&lt;!]&gt;&lt;/ToUserName&gt;
                                    &lt;FromUserName&gt;&lt;!]&gt;&lt;/FromUserName&gt;
                                    &lt;CreateTime&gt;12345678&lt;/CreateTime&gt;
                                    &lt;MsgType&gt;&lt;!]&gt;&lt;/MsgType&gt;
                                    &lt;Content&gt;&lt;!]&gt;&lt;/Content&gt;
                                    &lt;/xml&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
                  </span><span style="color: rgba(0, 0, 255, 1)">if</span> (!<span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)">.IsNullOrEmpty(result))
                  {
                        </span><span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (isEncrypt)
                        {
                            result </span>=<span style="color: rgba(0, 0, 0, 1)"> EncryptHelper.AESEncrypt(result, encodingAESKey, appId);
                            </span><span style="color: rgba(0, 0, 255, 1)">var</span> _msg_signature =<span style="color: rgba(0, 0, 0, 1)"> MakeMsgSign(nonce, timestamp, result, token);
                            result </span>= $<span style="color: rgba(128, 0, 0, 1)">@"</span><span style="color: rgba(128, 0, 0, 1)">&lt;xml&gt;
                                                    &lt;Encrypt&gt;&lt;!]&gt;&lt;/Encrypt&gt;
                                                    &lt;MsgSignature&gt;{_msg_signature}&lt;/MsgSignature&gt;
                                                    &lt;TimeStamp&gt;{timestamp}&lt;/TimeStamp&gt;
                                                    &lt;Nonce&gt;{nonce}&lt;/Nonce&gt;
                                                &lt;/xml&gt;</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
                        }
                        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> result;
                  }

                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果这里我们的处理逻辑需要花费较长时间,可以这里先返回空(""),然后使用异步去处理业务逻辑,
                  </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">异步处理完后,调用微信的客服消息接口通知微信服务器</span>
<span style="color: rgba(0, 0, 0, 1)">                }
            }
            </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception ex)
            {
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">记录异常日志</span>
<span style="color: rgba(0, 0, 0, 1)">            }

            </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 0, 1)">""</span><span style="color: rgba(0, 0, 0, 1)">;
      }

    }
}</span></pre>
</div>
<span class="cnblogs_code_collapse">WxController</span></div>
<p>  如果只是接入,只需复制上面的接口代码,修改一下token,encodingAESKey,appId的值,然后使用接入的回调Url:http://XXX.XXXX.com/api/Wx就可以了</p>
<p>  如果要处理微信通知过来的消息,可根据上面的接口自行处理业务逻辑,不过需要注意的是,微信回调接口只会等待5秒,5秒后断开,并重复3次,所以如果这里业务逻辑处理时间比较长的话,建议使用异步,在异步处理完之后,使用客服消息接口进行结果通知</p>
<p>  另外开发过程中,可以使用微信公众平台接口调试工具进行调试:https://mp.weixin.qq.com/debug/cgi-bin/apiinfo?t=index</p>
<p><span style="color: rgba(255, 0, 0, 1)">  有一点注意一下,一般的,我们写接口时,为了保证接口返回的数据有一定格式,所以会写一些过滤器,对接口进行一个包装,比如我们会将结果包装成以下结构:  </span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span>"result": "success"<span style="color: rgba(0, 0, 0, 1)">,
</span>"success": <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"error": <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">,
</span>"message": ""<span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>&nbsp;<span style="color: rgba(255, 0, 0, 1)">  但是这个微信调用的接口不能包装,要返回微信指定的格式才行,这个切记!!!否则会返回Token验证失败的错误!</span></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
      <div class="lightSignature">
      <span>一个专注于.NetCore的技术小白</span>
    </div><br><br>
来源:https://www.cnblogs.com/shanfeng1000/p/11792227.html
頁: [1]
查看完整版本: 微信公众号开发--.net core接入