1. 程式人生 > >微信公眾號開發之回覆圖文訊息(被動) 微信公眾號開發之VS遠端除錯

微信公眾號開發之回覆圖文訊息(被動) 微信公眾號開發之VS遠端除錯

目錄

(一)微信公眾號開發之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