目錄
(一)微信公眾號開發之VS遠程調試
(二)微信公眾號開發之基礎梳理
(三)微信公眾號開發之自動消息回復和自定義菜單
(四)微信公眾號開發之網頁授權獲取用戶基本信息
(五)微信公眾號開發之網頁中及時獲取當前用戶Openid及注意事項
(六)微信公眾號開發之掃碼支付
(七)微信公眾號開發之公眾號支付
(八)微信公眾號開發之現金紅包
(九)微信公眾號開發之回復圖文消息(被動)
題記:
.NET Core 經過幾年的發展,已經可以說是遍地開花了,現在如果還不展開.NET Core探索之路,那未免也太有點落后於.NET的時代潮流了.
前幾篇已經提及到了關注和回復消息事件,但此前都局限於回復文本消息。那么,如果有個需求是,用戶發送特定字符,如何回復特定的圖文消息給用戶呢?
首先我們來看看實現后的效果如下:
實現過程
回復圖片消息
我們先看一下 回復圖文消息的XML字符格式
<xml>
<ToUserName><![CDATA[toUser] ]></ToUserName>
<FromUserName>< ![CDATA[fromUser] ]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image] ]></MsgType>
<Image><MediaId><![CDATA[media_id] ]></MediaId></Image>
</xml>
根據這個XML格式,我們很清楚已經知道這個地方需要用到幾個必要的參數,包括:OpenID,微信號、創建時間、封面圖片以及Mediald這些。
我們這個是在.NET Core2.1上實現的,這里稍微說明下,此前我們在.NET 4.5中使用的一般處理程序是這樣寫的:
public void ProcessRequest(HttpContext context) { //TODO }
ASP.NET Core中提供了一個IHttpContextAccessor接口,HttpContextAccessor 默認實現了它簡化了訪問HttpContext。
它必須在程序啟動時在ConfigureServices中注冊,這樣在程序中就能獲取到HttpContextAccessor,並用來訪問HttpContext。
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
然后我們在控制器中注入進來
private readonly IHttpContextAccessor _accessor; public HandlerController(IHttpContextAccessor accessor) { _accessor = accessor; } [Route("ProcessRequest")] public void ProcessRequest() { var context = _accessor.HttpContext; context.Response.ContentType = "text/plain"; string responseMsg = Response(context.Request); context.Response.Clear(); context.Response.ContentType = "UTF-8"; context.Response.WriteAsync(responseMsg); }
好了,前面是一些鋪墊,代碼部分和之前.NET 相差無幾,玩.NET Core 記住一句話:無處不在的依賴注入。
這里,我們提前將一些用到的關鍵詞以及上面提到的必要參數放到appsetting.json配置中,方面后面修改。
"new_images_messages": { "keyword": "觸發的關鍵字", "validTime": "2018-12-28", "title": "文章標題", "description": "描述", "picUrl": "圖片url", "url": "圖文消息的url" }
另外,我這里采用讀取配置的方式封裝了一層,在Startup中DI進IConfiguration 接口
注:需要引入
using Microsoft.Extensions.Configuration;
public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; }
然后新建一個ConfigurationKeys 類,專門存放配置文件中不同類型的數據值:
public static string NEW_IMAGES_MESSAGES_TITLE = "new_images_messages:title"; public static string NEW_IMAGES_MESSAGES_DES = "new_images_messages:description"; public static string NEW_IMAGES_MESSAGES_PIC = "new_images_messages:picUrl"; public static string NEW_IMAGES_MESSAGES_URL = "new_images_messages:url"; public static string NEW_IMAGES_MESSAGES_KEYWORD = "new_images_messages:keyword"; public static string NEW_IMAGES_MESSAGES_VALIDTIME = "new_images_messages:validTime";
使用時首先在控制器中注入配置接口
private readonly IConfiguration _config; public EventHandler(IConfiguration config) { _config = config; }
與發過來消息做對比
//判斷接收到的文本消息是否是配置文件中的觸發關鍵詞 if (content == _config[ConfigurationKeys.NEW_IMAGES_MESSAGES_KEYWORD]) { _logger.LogInformation("答復圖文消息"); response =ReArticle(tm.FromUserName, tm.ToUserName); }
public string ReArticle(string fromUserName, string toUserName) { var title = _config[ConfigurationKeys.NEW_IMAGES_MESSAGES_TITLE]; var description = _config[ConfigurationKeys.NEW_IMAGES_MESSAGES_DES]; var picUrl = _config[ConfigurationKeys.NEW_IMAGES_MESSAGES_PIC]; var url = _config[ConfigurationKeys.NEW_IMAGES_MESSAGES_URL]; return new NewsMessage().Template(fromUserName, toUserName, title, description, picUrl, url); }
這里需要將模板提前配置好,所以這里新建了一個Template方法
public string Template(string fromUserName, string toUserName, string title, string description, string picUrl, string url) { string xml = "<xml><ToUserName><![CDATA[" + fromUserName + "]]></ToUserName><FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"; xml += "<CreateTime>" + FileUtility.DateTimeToUnixTimestamp(DateTime.Now) + "</CreateTime>"; xml +="<MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>1</ArticleCount><Articles>"; xml += "<item><Title><![CDATA[" + title + "]]></Title><Description><![CDATA[" + description +"]]></Description><PicUrl><![CDATA[" + picUrl + "]]></PicUrl><Url><![CDATA[" + url +"]]></Url></item>"; xml += "</Articles><FuncFlag>0</FuncFlag></xml>"; return xml; }
上述的時間轉換方法
public static long DateTimeToUnixTimestamp(DateTime dateTime) { var start = new DateTime(1970, 1, 1, 0, 0, 0, dateTime.Kind); return Convert.ToInt64((dateTime - start).TotalSeconds); }
至此,已經全部實現,那如果項目已經上線,需要增加這個功能項,但是又不能破壞現有服務器,如何進行調試呢,可以借助微信的測試號,用於在線調試公眾號。
地址:微信測試號
進入測試號里面,有appID,appsecret我們需要將這兩個信息替換本地的TokenContext中的值。然后URL可以借助花生殼等內網穿透的工具 映射到本地 進行開發調試。
整體做完就可以實現開始的展示圖的效果了。
End