Aquarius.Weixin 微信公眾號開發(fā)教程(1)- Quick Start

在今天莲祸,Aquarius.Weixin版本正式上線,github的readme中有Aquarius.Weixin的快速開發(fā)入門惫东,本博客從快速入門開始衰琐,分步介紹Aquarius.Weixin的使用方法,以及分享在微信公眾號開發(fā)中遇到的各種坑毫玖。

該教程以版本1.5.0及以上版本為例掀虎。

1、關于Aquarius.Weixin

Aquarius.Weixin是一個為.net core 2.0開發(fā)的微信公眾號開發(fā)框架付枫,目前實現(xiàn)了網(wǎng)頁授權烹玉、菜單創(chuàng)建、消息管理阐滩、素材管理二打、消息收發(fā)、模板消息管理與推送掂榔、微信支付等继效,便于.net core開發(fā)者專注于業(yè)務症杏,快速開發(fā)微信公眾號。
項目地址Github瑞信,歡迎大家的star和fork厉颤,有任何問題可以提issue或者與我聯(lián)系(readme里有我的微信號)。

2凡简、關于本文

本文主要作為快速開發(fā)入門逼友,主要介紹網(wǎng)頁授權、菜單創(chuàng)建秤涩、消息收發(fā)功能帜乞。

3、那么溉仑,現(xiàn)在開始咯

在正式開始之前挖函,先說兩句閑話,我第一次做公眾號開發(fā)是公司要求將我們的app產品移植到微信公眾號浊竟,作為一個從來沒做過微信公眾號開發(fā)的萌新怨喘,第一件事就是去看微信的文檔(然而并沒看懂),然后又去百度 微信公眾號 .net (我們公司后臺是用的.net framework)振定,網(wǎng)上大部分的文檔一上來就是在介紹如何配置服務器鏈接怎么去驗證簽名(在配置服務器鏈接的時候)必怜,但是我們公眾號開發(fā)的大部分情況下并不需要消息收發(fā)的功能,我們要的只是用戶打開網(wǎng)頁后频,獲取到用戶的openid足矣梳庆。而網(wǎng)頁授權獲取openid的時候是不需要配置服務器鏈接的(摔 (′д` )…彡…彡,本文以測試號為例從網(wǎng)頁授權開始介紹卑惜,以及在什么情況下需要配置什么東西膏执。
現(xiàn)在真的正式開始了。

準備步驟:

(1)安裝Aquarius.Weixin

Aquarius.Weixin nuget package.png

從nuget包管理器進行安裝露久,目前版本為1.5.6
(2)注冊測試號(已經注冊過的同學可跳過本步)
點擊進入微信測試平臺更米,微信掃碼登陸,查看測試賬號的appid和appsecret
微信測試賬號.png

(3)修改startup.cs中的ConfigureServices毫痕,添加如下代碼:

services.AddAquariusWeixin(opt =>
{
    opt.BaseSetting = new BaseSettings()
    {
        Debug = true,
        IsRepetValid = false,
        AppId = "your appid",
        AppSecret = "your appsecret",
        Token = "token"
    };
    opt.CacheType = CacheType.InMemory;
    opt.MsgMiddlewareType = MessageMiddlewareType.Plain;
});

將上述appid和appsecret配置為自己的appid和appsecret征峦,CacheType為緩存模式,當前使用InMemory模式消请,MsgMiddlewareType為消息中間件模式(消息加解密方式)栏笆,當前使用Plain(明文)。
然后臊泰,新建名為WeixinController的空控制器類蛉加,并刪除其中的Index方法。
至此,準備工作完成针饥。

創(chuàng)建菜單

注意:由于微信測試號的限制祟偷,只能通過api方式配置菜單,所以此處首先進行菜單配置打厘,使用服務號的同學如果不想了解配置菜單可以直接看網(wǎng)頁授權。
新建一個CreateMenu方法贺辰,代碼如下:

public IActionResult CreateMenu()
{
    //創(chuàng)建菜單對象
    var menu = new Menu()
    {
        button = new List<IButton>()
        {
            new SingleClickButton("按鈕1")
            {
                key = "Button1"
            },
            new SubButton("二級菜單")
            {
                sub_button = new List<SingleButton>()
                {
                    new SingleClickButton("按鈕2")
                    {
                        key = "Button2"
                    },
                    new SingleViewButton("網(wǎng)頁")
                    {
                        url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=http://yourdomain.com/Weixin/Authorization&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect"
                    }
                }
            }
        }
    };

    //獲取AccessToken
    var accessToken = _accessTokenContainer.GetAccessToken();
    //創(chuàng)建菜單
    var result = _menuInterfaceCaller.CreateMenu(accessToken, menu.ToJson());
    return Content(result);
}

創(chuàng)建的菜單樣式如下:

menu.png

其中“網(wǎng)頁”菜單中的url需將APPID替換為自己的appid户盯,scope使用snsapi_userinfo可以獲取用戶詳細信息,并將yourdomain.com替換成自己的公網(wǎng)項目地址饲化,此處介紹一個工具 ngrok 可以將內網(wǎng)端口映射到外網(wǎng)莽鸭,運行 ngrok http port 其中port為當前web項目端口,如下:
ngrok.png

然后使用映射后的域名替換yourdomain.com吃靠,之后瀏覽器打開http://localhost:port/Weixin/CreateMenu創(chuàng)建菜單硫眨。
注意:使用服務號測試的同學必須先到后臺配置業(yè)務域名,然后瀏覽器訪問http://f0323206.ngrok.io/Weixin/CreateMenu創(chuàng)建菜單巢块,不然獲取AccessToken會報錯礁阁。
業(yè)務域名.png

瀏覽器返回ok即菜單創(chuàng)建成功:
創(chuàng)建菜單.png

注意:菜單創(chuàng)建成功之后有一定的緩存期,可以通過重新關注來刷新菜單族奢。

網(wǎng)頁授權

在上一節(jié)創(chuàng)建菜單中我們創(chuàng)建了一個網(wǎng)頁跳轉按鈕姥闭,如果你是用的服務號,直接到后臺菜單配置中配置菜單鏈接即可越走。
在WeixinController中新建Authorization方法棚品,代碼如下:

public IActionResult Authorization(string code)
{
    //通過code獲取openId
    var openId = _authorizationContainer.GetOpenId(code);
    //通過openId獲取userInfo
    var userInfo = _authorizationContainer.GetUserInfo(openId, Language.zh_CN);
    return Content($"your openId is {openId}, your nickname is {userInfo.nickname}");
}

注意,該方法的code參數(shù)不可少廊敌。
然后到測試號后臺配置網(wǎng)頁授權域名:


網(wǎng)頁授權域名位置.png

網(wǎng)頁授權域名修改.png

使用服務號的同學铜跑,前往如下位置配置:


服務號網(wǎng)頁授權域名配置.png

運行項目后,點擊二級菜單下的網(wǎng)頁按鈕骡澈,運行效果如下:
網(wǎng)頁授權效果.png

消息收發(fā)

在WeixinController中新建Index方法锅纺,代碼如下:

public async Task<IActionResult> Index(string signature, string timestamp, string nonce, string echostr, string encrypt_type, string msg_signature)
{
    try
    {
        if (!string.IsNullOrEmpty(echostr))
        {
            //服務器認證
            if (_verifyer.VerifySignature(signature, timestamp, nonce, "token"))
            {
                return Content(echostr);
            }
            else
            {
                return Content("success");
            }
        }
        else
        {
            //消息接收
            using (var sr = new StreamReader(Request.Body))
            {
                string data = await sr.ReadToEndAsync();

                //接收消息中間處理
                data = _messageMiddleware.ReceiveMessageMiddle(signature, msg_signature, timestamp, nonce, data);

                //解析消息
                IMessage message = MessageParser.ParseMessage(data);
                //處理消息,生成回復
                string reply = _messageProcesser.ProcessMessage(message);

                //回復消息中間處理
                reply = _messageMiddleware.ReplyMessageMiddle(reply);
            
                return Content(reply);
            }
        }
    }
    catch (Exception ex)
    {
        //log something
        return Content("success");
    }
}

然后配置接口如下:


接口配置.png

將域名替換為自己的域名秧廉,token填寫為startup中設置的token伞广。
使用服務號的同學在開發(fā)-基本配置中配置:


服務號接口配置.png

并可選擇加密模式,本例中使用明文模式(在startup中已設置)疼电。配置完成后點擊“啟動”嚼锄。
注意:該消息處理方法在生產環(huán)境中也建議如此編寫。

至此蔽豺,我們完成了接口的編寫和配置区丑,在Aquarius.Weixin中所有消息均未進行任何處理直接回復success(即用戶收不到任何回復)。
下一步,實現(xiàn)一個點擊按鈕返回文本消息的類沧侥。
新建類ClickEventReplyTextHandler可霎,代碼如下:

public class ClickEventReplyTextHandler : IClickEvtMessageHandler
{
    private readonly IMessageReply<TextMessage> _messageReply;

    public ClickEventReplyTextHandler(IMessageReply<TextMessage> messageReply)
    {
        _messageReply = messageReply;
    }

    public string Handle(ClickEvtMessage message)
    {
        var textMessage = new TextMessage(message)
        {
            CreateTime = UtilityHelper.GetTimeStamp(),
            Content = $"你點擊了{message.EventKey}按鈕"
        };

        return _messageReply.CreateXml(textMessage);
    }
}

①ClickEventReplyTextHandler所實現(xiàn)的接口IClickEvtMessageHandler即為要重寫的消息類型處理接口,本例為點擊事件消息處理宴杀,在之后的教程中將詳細介紹其他的消息類型處理接口癣朗。
②_messageReply字段的類型為IMessageReply<T>類型,類型T即為返回的消息類型旺罢,在之后的教程中將詳細介紹可以返回的消息類型旷余。
然后在startup類的ConfigureServices方法中AddAquariusWeixin之后添加如下代碼,注意一定是之后:

services.AddScoped<IClickEvtMessageHandler, ClickEventReplyTextHandler>();

使用剛才編寫的ClickEventReplyTextHandler類處理點擊事件消息扁达。
點擊按鈕正卧,效果如下:


點擊按鈕回復文本效果.png

4、附錄

WeixinController類中使用到的所有字段聲明如下:

private readonly AccessTokenContainer _accessTokenContainer;
private readonly MenuInterfaceCaller _menuInterfaceCaller;
private readonly AuthorizationContainer _authorizationContainer;
private readonly Verifyer _verifyer;
private readonly IMessageMiddleware _messageMiddleware;
private readonly MessageProcesser _messageProcesser;

或者查看源碼
另外跪解,之后的教程目錄還在構思中炉旷,如果有那一塊想先了解可以評論告訴我。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末叉讥,一起剝皮案震驚了整個濱河市窘行,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌节吮,老刑警劉巖抽高,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異透绩,居然都是意外死亡,警方通過查閱死者的電腦和手機帚豪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門狸臣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來烛亦,“玉大人,你說我怎么就攤上這事铐达∶使” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵脸甘,是天一觀的道長偏灿。 經常有香客問我翁垂,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任邢疙,我火速辦了婚禮望薄,結果婚禮上疟游,老公的妹妹穿的比我還像新娘痕支。我一直安慰自己,他們只是感情好另绩,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布笋籽。 她就那樣靜靜地躺著椭员,像睡著了一般。 火紅的嫁衣襯著肌膚如雪侍芝。 梳的紋絲不亂的頭發(fā)上埋同,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天莺禁,我揣著相機與錄音,去河邊找鬼忆绰。 笑死可岂,一個胖子當著我的面吹牛缕粹,可吹牛的內容都是我干的。 我是一名探鬼主播平斩,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼绘面,長吁一口氣:“原來是場噩夢啊……” “哼欺税!你這毒婦竟也來了?” 一聲冷哼從身側響起揭璃,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘦馍,沒想到半個月后歼秽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情组,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡燥筷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了院崇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亚脆,死狀恐怖做院,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情濒持,我是刑警寧澤键耕,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布柑营,位于F島的核電站屈雄,受9級特大地震影響官套,放射性物質發(fā)生泄漏蚁孔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一鼻百、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦勺爱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至视哑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間誊涯,已是汗流浹背挡毅。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留暴构,地道東北人跪呈。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像取逾,于是被迫代替她去往敵國和親耗绿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,078評論 25 707
  • 開發(fā)前首先我們要知道一些概念 各公眾號區(qū)別:1砾隅、訂閱號:為媒體和個人提供一種信息傳播方式误阻,主要偏于為用戶傳達資訊(...
    CoderZS閱讀 3,190評論 1 19
  • 平生最怕離別苦究反,東奔西走這許多年,從未敢把任何一個地方放在心上儒洛。我只不過是一個匆匆過客精耐。所以總是不悲傷,揮...
    曉竹子閱讀 165評論 0 4
  • 當寫下這個題目的時候,我腦子里一下就冒出了《道德經》里的一句話——天下大事作于細专执,天下難事作于易淮捆!這句話我也多次給...
    清怡荷上閱讀 200評論 0 0
  • 優(yōu)步6月剛進駐鄭州,幾乎每天都有優(yōu)惠本股,于是每天坐優(yōu)步上下班攀痊。 碰上過討厭的優(yōu)步司機,看你手機號怎么是外地的拄显?之前一...
    楊文彩閱讀 382評論 0 0