微信公众号开发--.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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="text"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="str"></span><span style="color: rgba(0, 128, 0, 1)">加密字符串</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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 < 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="text"></span><span style="color: rgba(0, 128, 0, 1)">加密字符</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="encodingAESKey"></span><span style="color: rgba(0, 128, 0, 1)">加密的密码</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="appid"></span><span style="color: rgba(0, 128, 0, 1)">appId</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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 < <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 < <span style="color: rgba(128, 0, 128, 1)">4</span>; i++<span style="color: rgba(0, 0, 0, 1)">)
outval </span>= (outval << <span style="color: rgba(128, 0, 128, 1)">8</span>) + ((inval >> (i * <span style="color: rgba(128, 0, 128, 1)">8</span>)) & <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 & <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 < 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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="encryptText"></span><span style="color: rgba(0, 128, 0, 1)">密文</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="encodingAESKey"></span><span style="color: rgba(0, 128, 0, 1)">秘钥</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="appid"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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 < <span style="color: rgba(128, 0, 128, 1)">1</span> || pad > <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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="encryptText"></span><span style="color: rgba(0, 128, 0, 1)">密文</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="encodingAESKey"></span><span style="color: rgba(0, 128, 0, 1)">秘钥</span><span style="color: rgba(128, 128, 128, 1)"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="appid"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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 < leftLength && index <<span style="color: rgba(0, 0, 0, 1)"> rightLength)
{
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (sLeft <<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 ><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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="args"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><param name="args"></param></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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)"><summary></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)"></summary></span>
<span style="color: rgba(128, 128, 128, 1)">///</span> <span style="color: rgba(128, 128, 128, 1)"><returns></returns></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 && !<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)"><xml>
<ToUserName><!]></ToUserName>
<FromUserName><!]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><!]></MsgType>
<Content><!]></Content>
</xml></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)"><xml>
<Encrypt><!]></Encrypt>
<MsgSignature>{_msg_signature}</MsgSignature>
<TimeStamp>{timestamp}</TimeStamp>
<Nonce>{nonce}</Nonce>
</xml></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> <span style="color: rgba(255, 0, 0, 1)"> 但是这个微信调用的接口不能包装,要返回微信指定的格式才行,这个切记!!!否则会返回Token验证失败的错误!</span></p>
<p> </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]