.Net6+Fruion+Sqlsugar+SenparcSdk開發微信公衆號系列之三:接入公衆號

一、接入概述

接入微信公衆平臺開發,開發者需要按照如下步驟完成:

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
    {

    }
}
View Code

新建文件夾和文件如圖所述

引入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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章