在今天莲祸,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
從nuget包管理器進行安裝露久,目前版本為1.5.6
(2)注冊測試號(已經注冊過的同學可跳過本步)
點擊進入微信測試平臺更米,微信掃碼登陸,查看測試賬號的appid和appsecret
(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)建的菜單樣式如下:
其中“網(wǎng)頁”菜單中的url需將APPID替換為自己的appid户盯,scope使用snsapi_userinfo可以獲取用戶詳細信息,并將yourdomain.com替換成自己的公網(wǎng)項目地址饲化,此處介紹一個工具
ngrok
可以將內網(wǎng)端口映射到外網(wǎng)莽鸭,運行 ngrok http port
其中port為當前web項目端口,如下:然后使用映射后的域名替換yourdomain.com吃靠,之后瀏覽器打開http://localhost:port/Weixin/CreateMenu創(chuàng)建菜單硫眨。
注意:使用服務號測試的同學必須先到后臺配置業(yè)務域名,然后瀏覽器訪問http://f0323206.ngrok.io/Weixin/CreateMenu創(chuàng)建菜單巢块,不然獲取AccessToken會報錯礁阁。
瀏覽器返回ok即菜單創(chuàng)建成功:
注意:菜單創(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)頁按鈕骡澈,運行效果如下:
消息收發(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");
}
}
然后配置接口如下:
將域名替換為自己的域名秧廉,token填寫為startup中設置的token伞广。
使用服務號的同學在開發(fā)-基本配置中配置:
并可選擇加密模式,本例中使用明文模式(在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類處理點擊事件消息扁达。
點擊按鈕正卧,效果如下:
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;
或者查看源碼
另外跪解,之后的教程目錄還在構思中炉旷,如果有那一塊想先了解可以評論告訴我。