簡介: 本篇博文是針對本人在開發企業微信消息交互的一些經驗分享,介紹一下自己開發過程中遇到的問題和解決方法,如果問題或異議,歡迎討論,技術大佬請忽略
用戶在企業微信中有2種用戶操作可以發送給我們服務器
1、點菜微信企業應用的菜單
2、給企業微信發送文字或者圖片等信息
企業微信要接受到用戶行為(比如對企業號發消息或者點擊企業號中的菜單)需要再對應的企業微信應用中配置接受消息模塊:
1、首先進入企業微信配置接受消息
2、配置對應的URL,Token以及EncodingAESKey:
在后台編寫程序解析用戶行為操作並回復用戶不同消息
1、接受微信發過來的加密報文解析用戶行為操作
public void ProcessRequest(HttpContext context)
{
var Request = context.Request;
var Response = context.Response;
context.Response.ContentType = "text/plain";
//context.Response.ContentType = "text/xml";
//公眾平台上開發者設置的token, corpID, EncodingAESKey
string sCorpID = System.Configuration.ConfigurationManager.AppSettings["sCorpID"];
string sToken = "";
string sEncodingAESKey = "";
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
string sVerifyMsgSig = Request.QueryString["msg_signature"];
string sVerifyTimeStamp = Request.QueryString["timestamp"];
string sVerifyNonce = Request.QueryString["nonce"];
string sVerifyEchoStr = Request.QueryString["echostr"] ?? "";
int ret = 0;
string sEchoStr = "";
//獲取表單提交內容
string postStr = string.Empty;
using (System.IO.StreamReader sr = new System.IO.StreamReader(Request.InputStream))
{
postStr = sr.ReadToEnd();
}
if (!string.IsNullOrEmpty(postStr))
{
var xmldoc = new XmlDocument();
xmldoc.LoadXml(postStr);
XmlNode root = xmldoc.FirstChild;
string sPostData = root["Encrypt"].InnerText;
ret = wxcpt.DecryptMsg(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, postStr, ref sEchoStr);
if (ret != 0)
{
SH.Utilities.Base.Log.LogHelper.Info("WeChat", "ERR: VerifyURL fail, ret: " + ret);
return;
}
//封裝請求類
XmlDocument requestDocXml = new XmlDocument();
requestDocXml.LoadXml(sEchoStr);
XmlElement rootElement = requestDocXml.DocumentElement;
WxXmlModel WxXmlModel = new WxXmlModel();
WxXmlModel.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
WxXmlModel.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
WxXmlModel.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
WxXmlModel.MsgType = rootElement.SelectSingleNode("MsgType").InnerText;
WxXmlModel.AgentID = rootElement.SelectSingleNode("AgentID").InnerText;
WxXmlModel.CompanyId = companyid;
switch (WxXmlModel.MsgType)
{
case "text"://文本
WxXmlModel.Content = rootElement.SelectSingleNode("Content").InnerText;
break;
case "image"://圖片
WxXmlModel.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
break;
case "event"://事件
WxXmlModel.Event = rootElement.SelectSingleNode("Event").InnerText;
if (WxXmlModel.Event == "click")//菜單點擊
{
WxXmlModel.EventKey = rootElement.SelectSingleNode("EventKey").InnerText;
SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
}
break;
default:
break;
}
string sReplyMsg = ResponseXML(WxXmlModel);//回復消息
ret = wxcpt.EncryptMsg(sReplyMsg, sVerifyTimeStamp, sVerifyNonce, ref sEchoStr);
if (ret != 0)
{
return;
}
Response.Write(sEchoStr);
Response.End();
return;
}
else
{
string sEncryptMsg = "";
ret = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp, sVerifyNonce, sVerifyEchoStr, ref sEncryptMsg);
if (ret != 0)
{
SH.Utilities.Base.Log.LogHelper.Info("", "ERR: VerifyURL fail, ret: " + ret);
Response.Write("");
Response.End();
return;
}
Response.Write(sEncryptMsg);
Response.End();
return;
}
}
2、根據不同用戶行為操作做不同的消息類型回復
private string ResponseXML(WxXmlModel WxXmlModel)
{
string XML = "";
switch (WxXmlModel.MsgType)
{
case "text"://文本回復
//批號查詢
if (SH.WebApp.Extension.Utilities.IsBatchNumber(WxXmlModel))
{
WxXmlModel.EventKey = "BatchNumber_Search";
XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
}
//流轉卡查詢
else if (SH.WebApp.Extension.Utilities.IsTransferCard(WxXmlModel))
{
WxXmlModel.EventKey = "TransferCard_Search";
XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
}
//默認自動回復
else
{
XML = ResponseMessage.GetText(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.Content);
}
break;
case "event":
switch (WxXmlModel.Event)
{
//點擊菜單
case "click":
if (string.IsNullOrEmpty(WxXmlModel.EventKey))
{
XML = SH.WebApp.WeChatHelper.Report.sendMsg(WxXmlModel);
}
break;
case "SCAN":
XML = ResponseMessage.ScanQrcode(WxXmlModel.FromUserName, WxXmlModel.ToUserName, WxXmlModel.EventKey);//掃描帶參數二維碼已關注 直接推送事件
break;
}
break;
default://默認回復
break;
}
return XML;
}
3、圖文消息發送,更多格式請查閱企業微信開發API:https://work.weixin.qq.com/api/doc#90000/90135/90236
SH.Business.ReportModule.Financial FinancialBLL = new Business.ReportModule.Financial();
var url = string.Format("https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={0}", Access_Token.GetAccessToken(WxXmlModel.AgentID));
Hashtable ht = new Hashtable();
ht["touser"] = WxXmlModel.FromUserName;
ht["toparty"] = "";
ht["totag"] = "";
ht["msgtype"] = "news";
ht["agentid"] = WxXmlModel.AgentID;
Hashtable news = new Hashtable();
List<Hashtable> articles = new List<Hashtable>();
Hashtable mianArticle = new Hashtable();
mianArticle["title"] = "財務對賬";
mianArticle["url"] = "";
mianArticle["picurl"] = WebURL + "/Content/image/Financial_Reconciliation.jpg";
articles.Add(mianArticle);
string sSalesNo = SH.Business.Utilities.GetSalespower(WxXmlModel.FromUserName);
var list = FinancialBLL.Financial_Reconciliation(WxXmlModel.CompanyId, sSalesNo);
foreach (var items in list)
{
Hashtable article = new Hashtable();
article["title"] = string.Format("對賬期間:{0}\r應收開票:{1}萬米 {2}萬元", SH.Business.Utilities.DateFormat(items["dReceivableDate"].ToString()), items["nQty"], items["nAmount"]);
article["description"] = "";
article["url"] = WebURL + "/Query/Financial/InvoiceByCompany?iCompanyId=" + WxXmlModel.CompanyId + "&date=" + items["dReceivableDate"] + "&AgentId=" + WxXmlModel.AgentID;
articles.Add(article);
}
news["articles"] = articles;
ht["news"] = news;
string responseText = HttpHelper.Instance.post(url, ht.ToJson());