.Net6+Furion+Sqlsugar+SenparcSdk开发微信公众号系列之三:接入公众号
<h1 id="接入概述">一、接入概述</h1><p>接入微信公众平台开发,开发者需要按照如下步骤完成:</p>
<p>1、填写服务器配置</p>
<p>2、验证服务器地址的有效性</p>
<p>3、依据接口文档实现业务逻辑</p>
<h1>二、填写服务器配置</h1>
<p>微信公众号填写自己的服务器配置</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519093503763-896419389.png" alt="" loading="lazy"></p>
<h1> 三、编写API</h1>
<p> 删除脚手架中的测试服务</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519093212513-1456382847.png" alt="" loading="lazy"></p>
<p>新建Global.cs用于全局引用</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220524093926822-1757311641.png" alt="" loading="lazy"></p>
<p> Global.cs中全局引用胜派sdk这样就不用每个类都引用了,这是.NET6新增功能</p>
<details contenteditable="false">
<summary>查看代码</summary>
<pre class="language-csharp"><code>
global using Senparc.NeuChar.Entities;
global using Senparc.Weixin;
global using Senparc.Weixin.MP;
global using Senparc.Weixin.MP.Entities;
global using Senparc.Weixin.MP.Entities.Request;
global using Senparc.Weixin.MP.MessageContexts;
global using Senparc.Weixin.MP.MessageHandlers;
global using Furion.DynamicApiController;
global using Microsoft.AspNetCore.Mvc;
global using System;
global using System.IO;
global using System.Threading.Tasks;
global using Microsoft.AspNetCore.Http;
global using System.Threading;
global using WeiXinApi.Application.Handler;
global using WeiXinApi.Application.Services;
global using Furion.DependencyInjection;
global using Senparc.NeuChar.Entities.Request;
global using System.Text;
global using Furion;
global using Senparc.Weixin.MP.AdvancedAPIs;
global using System.Linq;
global using WeiXinApi.Core;
global using System.ComponentModel.DataAnnotations;
global using Senparc.CO2NET.Helpers;
global using Senparc.CO2NET.Helpers.BaiduMap;
global using System.Collections.Generic;
namespace WeiXinApi.Application
{
internal class Global
{
}
}</code></pre>
</details>
<p> </p>
<p>新建文件夹和文件如图所述</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519093703764-892571814.png" alt="" loading="lazy"></p>
<p>引入Nuget包Senparc.Weixin.MP和Senparc.Weixin.AspNet</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519092957786-392602592.png" alt="" loading="lazy"></p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523164117538-1845639954.png" alt="" loading="lazy"></p>
<p>新建一个Api,路由地址就是我们服务器配置上填的域名后面跟着的地址,我的是wx。我这里用的是动态api所以不是继承的controller</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">using</span><span style="color: rgba(0, 0, 0, 1)"> Furion.DynamicApiController;
</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)">using</span><span style="color: rgba(0, 0, 0, 1)"> Senparc.Weixin.MP.Entities.Request;
</span><span style="color: rgba(0, 0, 255, 1)">namespace</span><span style="color: rgba(0, 0, 0, 1)"> WeiXinApi.Application.Services
{
</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)"> WeiXinService : IDynamicApiController
{
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Index( PostModel postModel, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> echostr)
{
System.Console.WriteLine(echostr);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> echostr;
}
}
}</span></pre>
</div>
<p>测试一下接口,没毛病</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519103219585-1804080002.png" alt="" loading="lazy"></p>
<h1> 四、发布到云服务器并通过附加到进程调试</h1>
<p>因为在服务器配置中,只能填域名,所以我们要把项目发布到云服务器中,我是通过ftp的方式上传。通过附加进程的方式调试,也可用通过内外穿透的方式调试程序,我这里直接附加进程调试。<img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523161922766-1073911633.png" alt="" loading="lazy"> </p>
<p> WeiXinApi.Web.Entry中加入可以发布文件夹的数量</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220519114020109-2032761043.png" alt="" loading="lazy"></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)"><</span><span style="color: rgba(128, 0, 0, 1)">SatelliteResourceLanguages</span><span style="color: rgba(0, 0, 255, 1)">></span>en-US<span style="color: rgba(0, 0, 255, 1)"></</span><span style="color: rgba(128, 0, 0, 1)">SatelliteResourceLanguages</span><span style="color: rgba(0, 0, 255, 1)">></span></pre>
</div>
<p>直接服务器启动项目</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523144604441-813580511.png" alt="" loading="lazy"></p>
<p> 附加到进程</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523162027591-1701510960.png" alt="" loading="lazy"></p>
<p>选择托管</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523162039354-1025928795.png" alt="" loading="lazy"></p>
<p> 公众号页面测试请求</p>
<p> <img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523162115134-48117802.png" alt="" loading="lazy"></p>
<p>成功命中断点</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523162158946-28077668.png" alt="" loading="lazy"></p>
<h1> 五、使用胜派SDK验证请求</h1>
<p>上面的代码是直接返回了echostr,实际情况我们需要验证一下,判断是否合法,这里可以直接把胜派Demo里的拿过来,首先先在配置文件里按胜派demo里的要求配置,我放在了applicationsettings.json</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">CO2NET 设置</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SenparcSetting</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)">以下为 CO2NET 的 SenparcSetting 全局配置,请勿修改 key,勿删除任何项</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IsDebug</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">DefaultCacheNamespace</span><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)">DefaultCache</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(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cache_Redis_Configuration</span><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)">#{Cache_Redis_Configuration}#</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)">Redis配置
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">"Cache_Redis_Configuration": "localhost:6379",</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)">"Cache_Redis_Configuration": "localhost:6379,password=senparc,connectTimeout=1000,connectRetry=2,syncTimeout=10000,defaultDatabase=3",</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">密码及其他配置</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Cache_Memcached_Configuration</span><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)">#{Cache_Memcached_Configuration}#</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)">Memcached配置</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SenparcUnionAgentKey</span><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)">#{SenparcUnionAgentKey}#</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)">SenparcUnionAgentKey</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)">Senparc.Weixin SDK 设置</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SenparcWeixinSetting</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)">以下为 Senparc.Weixin 的 SenparcWeixinSetting 微信配置
</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(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">IsDebug</span><span style="color: rgba(128, 0, 0, 1)">"</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)">以下不使用的参数可以删除,key 修改后将会失效
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">公众号</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Token</span><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)">jinwandalaohu</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)">说明:字符串内两侧#和{}符号为 Azure DevOps 默认的占位符格式,如果您有明文信息,请删除同占位符,修改整体字符串,不保留#和{},如:{"Token": "MyFullToken"}</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">EncodingAESKey</span><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)">xxx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WeixinAppId</span><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)">xxx</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">WeixinAppSecret</span><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)">xxx</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(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AgentUrl</span><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)">AgentUrl</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">AgentToken</span><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)">AgentToken</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SenparcWechatAgentKey</span><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)">SenparcWechatAgentKey</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}</span></pre>
</div>
<p>startup.cs里注册SDK</p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">var</span> config =<span style="color: rgba(0, 0, 0, 1)"> App.Configuration;
services.AddSenparcGlobalServices(config)</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Senparc.CO2NET 全局注册</span>
.AddSenparcWeixinServices(config);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">Senparc.Weixin 注册</span></pre>
</div>
<p>configure里配置SDK</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">var</span> senparcSetting = App.GetOptions<SenparcSetting><span style="color: rgba(0, 0, 0, 1)">();
</span><span style="color: rgba(0, 0, 255, 1)">var</span> senparcWeixinSetting = App.GetOptions<SenparcWeixinSetting><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)"> 启动 CO2NET 全局注册,必须!</span>
<span style="color: rgba(0, 0, 255, 1)">var</span> registerService = app.UseSenparcGlobal(env, senparcSetting, globalRegister =><span style="color: rgba(0, 0, 0, 1)">
{
globalRegister.RegisterTraceLog(ConfigTraceLog);</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">配置TraceLog</span>
<span style="color: rgba(0, 0, 0, 1)">
}, </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">)
.UseSenparcWeixin(senparcWeixinSetting, (weixinRegister, weixinSetting) </span>=><span style="color: rgba(0, 0, 0, 1)">
{});</span></pre>
</div>
<pre class=""><code>ConfigTraceLog是一个方法用来配置日志</code></pre>
<div class="cnblogs_code">
<pre><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(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> ConfigTraceLog()
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">这里设为Debug状态时,/App_Data/WeixinTraceLog/目录下会生成日志文件记录所有的API请求日志,正式发布版本建议关闭
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果全局的IsDebug(Senparc.CO2NET.Config.IsDebug)为false,此处可以单独设置true,否则自动为true</span>
Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog(<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(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, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">只在Senparc.Weixin.Config.IsDebug = true的情况下生效
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">全局自定义日志记录回调</span>
Senparc.CO2NET.Trace.SenparcTrace.OnLogFunc = () =><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)">加入每次触发Log后需要执行的代码</span>
System.Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">加入每次触发Log后需要执行的代码</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)">当发生基于WeixinException的异常时触发</span>
WeixinTrace.OnWeixinExceptionFunc = <span style="color: rgba(0, 0, 255, 1)">async</span> ex =><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)">加入每次触发WeixinExceptionLog后需要执行的代码</span>
System.Console.WriteLine(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">加入每次触发WeixinExceptionLog后需要执行的代码</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
};
}</span></pre>
</div>
<p>在接口中通过sdk的方法获取token等信息,直接在WeiXinService中添加如下代码</p>
<div class="cnblogs_code">
<pre> <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)">readonly</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Token = Config.SenparcWeixinSetting.MpSetting.Token;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">与微信公众账号后台的Token设置保持一致,区分大小写。</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)">readonly</span> <span style="color: rgba(0, 0, 255, 1)">string</span> EncodingAESKey = Config.SenparcWeixinSetting.MpSetting.EncodingAESKey;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">与微信公众账号后台的EncodingAESKey设置保持一致,区分大小写。</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)">readonly</span> <span style="color: rgba(0, 0, 255, 1)">string</span> AppId = Config.SenparcWeixinSetting.MpSetting.WeixinAppId;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">与微信公众账号后台的AppId设置保持一致,区分大小写。</span></pre>
</div>
<p>修改Index方法的代码,可以用胜派demo中的代码</p>
<div class="cnblogs_code">
<pre>
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">string</span> Index( PostModel postModel, <span style="color: rgba(0, 0, 255, 1)">string</span><span style="color: rgba(0, 0, 0, 1)"> echostr)
{
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">System.Console.WriteLine(echostr);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">return echostr;</span>
<span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token))
{
Console.WriteLine(</span><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)"> echostr);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> echostr; <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)">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(128, 0, 0, 1)">failed:</span><span style="color: rgba(128, 0, 0, 1)">"</span> + postModel.Signature + <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> + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + <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(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">如果你在浏览器中看到这句话,说明此地址可以被作为微信公众账号后台的Url,请注意保持Token一致。</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
}
}</span></pre>
</div>
<p>发布到服务器测试一下,通过</p>
<p><img src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523164850861-1068612767.png" alt="" loading="lazy"></p>
<p> </p>
<p>再测一下不通过的,修改了一下token,提示验证失败</p>
<p><img style="font-size: 2em" src="https://img2022.cnblogs.com/blog/668465/202205/668465-20220523164945121-582428542.png" alt="" loading="lazy"></p>
<h1>六、本章Gitee地址</h1>
<p><span style="font-size: 18px"> https://gitee.com/huguodong520/weixinapi/tree/%E6%8E%A5%E5%85%A5%E5%85%AC%E4%BC%97%E5%8F%B7/</span></p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:HuTiger,转载请注明原文链接:https://www.cnblogs.com/huguodong/p/16288767.html,欢迎加入qq群927460240学习讨论</p><br><br>
来源:https://www.cnblogs.com/huguodong/p/16288767.html
頁:
[1]