一、接入概述
接入微信公衆平臺開發,開發者需要按照如下步驟完成:
1、填寫服務器配置
2、驗證服務器地址的有效性
3、依據接口文檔實現業務邏輯
二、填寫服務器配置
微信公衆號填寫自己的服務器配置
三、編寫API
刪除腳手架中的測試服務
新建Global.cs用於全局引用
Global.cs中全局引用勝派sdk這樣就不用每個類都引用了,這是.NET6新增功能
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; namespace WeiXinApi.Application { internal class Global { } }
新建文件夾和文件如圖所述
引入Nuget包Senparc.Weixin.MP和Senparc.Weixin.AspNet
新建一個Api,路由地址就是我們服務器配置上填的域名後面跟着的地址,我的是wx。我這裏用的是動態api所以不是繼承的controller
using Furion.DynamicApiController; using Microsoft.AspNetCore.Mvc; using Senparc.Weixin.MP.Entities.Request; namespace WeiXinApi.Application.Services { public class WeiXinService : IDynamicApiController { [HttpGet("/wx")] public string Index([FromQuery] PostModel postModel, string echostr) { System.Console.WriteLine(echostr); return echostr; } } }
測試一下接口,沒毛病
四、發佈到雲服務器並通過附加到進程調試
因爲在服務器配置中,只能填域名,所以我們要把項目發佈到雲服務器中,我是通過ftp的方式上傳。通過附加進程的方式調試,也可用通過內外穿透的方式調試程序,我這裏直接附加進程調試。
WeiXinApi.Web.Entry中加入可以發佈文件夾的數量
<SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>
直接服務器啓動項目
附加到進程
選擇託管
公衆號頁面測試請求
成功命中斷點
五、使用勝派SDK驗證請求
上面的代碼是直接返回了echostr,實際情況我們需要驗證一下,判斷是否合法,這裏可以直接把勝派Demo裏的拿過來,首先先在配置文件裏按勝派demo裏的要求配置,我放在了applicationsettings.json
//CO2NET 設置 "SenparcSetting": { //以下爲 CO2NET 的 SenparcSetting 全局配置,請勿修改 key,勿刪除任何項 "IsDebug": true, "DefaultCacheNamespace": "DefaultCache", //分佈式緩存 "Cache_Redis_Configuration": "#{Cache_Redis_Configuration}#", //Redis配置 //"Cache_Redis_Configuration": "localhost:6379",//不包含密碼 //"Cache_Redis_Configuration": "localhost:6379,password=senparc,connectTimeout=1000,connectRetry=2,syncTimeout=10000,defaultDatabase=3",//密碼及其他配置 "Cache_Memcached_Configuration": "#{Cache_Memcached_Configuration}#", //Memcached配置 "SenparcUnionAgentKey": "#{SenparcUnionAgentKey}#" //SenparcUnionAgentKey }, //Senparc.Weixin SDK 設置 "SenparcWeixinSetting": { //以下爲 Senparc.Weixin 的 SenparcWeixinSetting 微信配置 //注意:所有的字符串值都可能被用於字典索引,因此請勿留空字符串(但可以根據需要,刪除對應的整條設置)! //微信全局 "IsDebug": true, //以下不使用的參數可以刪除,key 修改後將會失效 //公衆號 "Token": "jinwandalaohu", //說明:字符串內兩側#和{}符號爲 Azure DevOps 默認的佔位符格式,如果您有明文信息,請刪除同佔位符,修改整體字符串,不保留#和{},如:{"Token": "MyFullToken"} "EncodingAESKey": "xxx", "WeixinAppId": "xxx", "WeixinAppSecret": "xxx", //擴展及代理參數 "AgentUrl": "AgentUrl", "AgentToken": "AgentToken", "SenparcWechatAgentKey": "SenparcWechatAgentKey" }
startup.cs裏註冊SDK
var config = App.Configuration; services.AddSenparcGlobalServices(config)//Senparc.CO2NET 全局註冊 .AddSenparcWeixinServices(config);//Senparc.Weixin 註冊
configure裏配置SDK
var senparcSetting = App.GetOptions<SenparcSetting>(); var senparcWeixinSetting = App.GetOptions<SenparcWeixinSetting>(); // 啓動 CO2NET 全局註冊,必須! var registerService = app.UseSenparcGlobal(env, senparcSetting, globalRegister => { globalRegister.RegisterTraceLog(ConfigTraceLog);//配置TraceLog }, true) .UseSenparcWeixin(senparcWeixinSetting, (weixinRegister, weixinSetting) => {});
ConfigTraceLog是一個方法用來配置日誌
/// <summary> /// 配置微信跟蹤日誌(演示,按需) /// </summary> private void ConfigTraceLog() { //這裏設爲Debug狀態時,/App_Data/WeixinTraceLog/目錄下會生成日誌文件記錄所有的API請求日誌,正式發佈版本建議關閉 //如果全局的IsDebug(Senparc.CO2NET.Config.IsDebug)爲false,此處可以單獨設置true,否則自動爲true Senparc.CO2NET.Trace.SenparcTrace.SendCustomLog("系統日誌", "系統啓動");//只在Senparc.Weixin.Config.IsDebug = true的情況下生效 //全局自定義日誌記錄回調 Senparc.CO2NET.Trace.SenparcTrace.OnLogFunc = () => { //加入每次觸發Log後需要執行的代碼 System.Console.WriteLine("加入每次觸發Log後需要執行的代碼"); }; //當發生基於WeixinException的異常時觸發 WeixinTrace.OnWeixinExceptionFunc = async ex => { //加入每次觸發WeixinExceptionLog後需要執行的代碼 System.Console.WriteLine("加入每次觸發WeixinExceptionLog後需要執行的代碼"); }; }
在接口中通過sdk的方法獲取token等信息,直接在WeiXinService中添加如下代碼
public static readonly string Token = Config.SenparcWeixinSetting.MpSetting.Token;//與微信公衆賬號後臺的Token設置保持一致,區分大小寫。 public static readonly string EncodingAESKey = Config.SenparcWeixinSetting.MpSetting.EncodingAESKey;//與微信公衆賬號後臺的EncodingAESKey設置保持一致,區分大小寫。 public static readonly string AppId = Config.SenparcWeixinSetting.MpSetting.WeixinAppId;//與微信公衆賬號後臺的AppId設置保持一致,區分大小寫。
修改Index方法的代碼,可以用勝派demo中的代碼
[HttpGet("/wx")] public string Index([FromQuery] PostModel postModel, string echostr) { //System.Console.WriteLine(echostr); //return echostr; if (CheckSignature.Check(postModel.Signature, postModel.Timestamp, postModel.Nonce, Token)) { Console.WriteLine("通過:" + echostr); return echostr; //返回隨機字符串則表示驗證通過 } else { return ("failed:" + postModel.Signature + "," + Senparc.Weixin.MP.CheckSignature.GetSignature(postModel.Timestamp, postModel.Nonce, Token) + "。" + "如果你在瀏覽器中看到這句話,說明此地址可以被作爲微信公衆賬號後臺的Url,請注意保持Token一致。"); } }
發佈到服務器測試一下,通過
再測一下不通過的,修改了一下token,提示驗證失敗
六、本章Gitee地址
https://gitee.com/huguodong520/weixinapi/tree/%E6%8E%A5%E5%85%A5%E5%85%AC%E4%BC%97%E5%8F%B7/