In Kapitel 5 wurde bereits darüber gesprochen, wie mit von Benutzern gesendeten Nachrichten umgegangen wird. In diesem Kapitel wird erläutert, wie auf Benutzeranfragen reagiert werden soll. Anfänger müssen verwirrt sein, wenn sie diesen Titel sehen. Seien Sie nicht verwirrt. Wenn wir auf Bilder, Musik, Sprache usw. antworten, müssen wir unsere Mediendateien auf den WeChat-Server hochladen kann es nutzen. Ich weiß nicht, was die Überlegungen zu diesem Ansatz sind, und die Nachrichtentextformate, die von der Kundendienstschnittstelle und der Gruppenversandschnittstelle gesendet werden, unterscheiden sich tatsächlich, wenn auf Nachrichten an Benutzer geantwortet wird. Es wird geschätzt, dass diese Schnittstellen nicht von derselben Person geschrieben wurden und der Code nicht einheitlich war. Wir Verliererentwickler können uns nur beschweren.
Bevor wir über die Upload- und Download-Schnittstelle sprechen, müssen wir zunächst über die Access_token-Erfassungsmethode sprechen. Bei der Entwicklung der WeChat-Schnittstelle ist access_token von entscheidender Bedeutung. Es ist das weltweit eindeutige Ticket des offiziellen Kontos. Das offizielle Konto muss beim Aufrufen jeder Schnittstelle verwendet werden. Entwickler müssen es ordnungsgemäß speichern. Für die Speicherung des access_token müssen mindestens 512 Zeichen Platz reserviert werden. Die Gültigkeitsdauer von access_token beträgt derzeit 2 Stunden und muss regelmäßig aktualisiert werden. Wiederholte Erfassung führt dazu, dass das letzte access_token ungültig wird. Es ist zu beachten, dass es jeweils nur ein gültiges Access_token für ein offizielles Konto gibt und Entwickler das Access_token aktualisieren müssen, bevor das Access_token abläuft. Während des Aktualisierungsprozesses stellt das Backend der öffentlichen Plattform sicher, dass sowohl die alten als auch die neuen access_tokens innerhalb kurzer Zeit nach der Aktualisierung verfügbar sind, was einen reibungslosen Übergang von Drittanbieterdiensten gewährleistet.
Offizielle Konten können AppID und AppSecret verwenden, um diese Schnittstelle aufzurufen und access_token zu erhalten. AppID und AppSecret können auf der offiziellen Website der WeChat Public Platform – Developer Center-Seite abgerufen werden (Sie müssen Entwickler geworden sein und das Konto hat keinen abnormalen Status ). Wie unten gezeigt:
Die Schnittstellenadresse zum Erhalten des access_token lautet:
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
将appid和secret替换成你自己的。
Senden Sie eine Get-Anfrage an diese Adresse und geben Sie sie zurück Die Daten lauten wie folgt:
{"access_token":"eEd6dhp0s24JfWwDyGBbrvJxnhqHTSYZ8MKdQ7MuCGBKxAjHv-tEIwhFZzn102lGvIWxnjZZreT6C1NCT9fpS7NREOkEX42yojVnqKVaicg","expires_in":7200}
我们只需解析这个json,即可获取到我们所需的access_token.代码如下:
AccessToken实体类:
public class AccessToken { public string token { get; set; } public DateTime expirestime { get; set; } }
Zugriffstoken abrufen
/// <summary> /// 获取access token /// </summary> /// <param name="appid">第三方用户唯一凭证</param> /// <param name="secret">第三方用户唯一凭证密钥,即appsecret</param> /// <returns>AccessToken对象,expirestime是过期时间</returns> public static AccessToken GetAccessToken(string appid, string secret) { try { string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret); string retdata = Utils.HttpGet(url); if (retdata.Contains("access_token")) { JObject obj = (JObject)JsonConvert.DeserializeObject(retdata); string token = obj.Value<string>("access_token"); int expirestime = obj.Value<int>("expires_in"); return new AccessToken { token = token, expirestime = DateTime.Now.AddSeconds(expirestime) }; } else { WriteBug(retdata);//写错误日志 } return null; } catch (Exception e) { WriteBug(e.ToString());//写错误日志 return null; } }
Nachdem das Zugriffstoken erfolgreich erhalten wurde, können wir Multimediadateien hoch- und herunterladen. Der Beamte sagte, dass bei Verwendung der Schnittstelle durch das offizielle Konto Vorgänge wie das Abrufen und Aufrufen von Multimediadateien und Multimedianachrichten über media_id ausgeführt werden (ich weiß nicht viel über das Lesen und verstehe daher nicht, warum die URL nicht verwendet werden kann). Es ist jedoch nicht erforderlich, es vor dem Senden auf den Server hochzuladen. Über diese Schnittstelle können öffentliche Konten Multimediadateien hochladen oder herunterladen. Bitte beachten Sie jedoch, dass jede Multimediadatei (media_id) 3 Tage nach dem Hochladen und Senden an den WeChat-Server durch den Benutzer automatisch gelöscht wird, um Serverressourcen zu sparen.
Die Schnittstellenadresse zum Hochladen von Multimedia lautet:
file.api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
wobei access_token die Anmeldeinformationen der aufrufenden Schnittstelle ist, Typ der Mediendateityp, einschließlich Bild, Sprache, Video (Video) und Thumbnail(Thumb)
Hochgeladene Multimediadateien haben folgende Formate und Größenbeschränkungen:
Bild: 1M, unterstützt JPG-Format
Stimme: 2M, die Wiedergabelänge überschreitet nicht 60 Sekunden, unterstützt AMRMP3-Format
Video: 10 MB, unterstützt MP4-Format
Miniaturansicht: 64 KB, unterstützt JPG-Format
Mediendateien werden 3 Tage lang im Hintergrund gespeichert, d. h. die media_id läuft nach 3 Tagen ab.
Um den Aufruf zu erleichtern, definieren Sie den Typ der Mediendatei als Aufzählung. Der Code lautet wie folgt:
public enum MediaType { /// <summary> /// 图片(WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch): 1M,支持JPG格式 /// </summary> WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch, /// <summary> /// 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式 /// </summary> voice, /// <summary> /// 视频(video):10MB,支持MP4格式 /// </summary> video, /// <summary> /// 缩略图(thumb):64KB,支持JPG格式 /// </summary> thumb }
Definieren Sie dann den Typ des Rückgabewerts:
public class UpLoadInfo { /// <summary> /// 媒体文件类型,分别有图片(WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch)、语音(voice)、视频(video)和缩略图(thumb,主要用于视频与音乐格式的缩略图) /// </summary> public string type { get; set; } /// <summary> /// 媒体文件上传后,获取时的唯一标识 /// </summary> public string media_id { get; set; } /// <summary> /// 媒体文件上传时间戳 /// </summary> public string created_at { get; set; } }
Verwenden Sie abschließend die WebClient-Klasse, um die Datei hochzuladen und den Rückgabewert zu lesen:
/// <summary> /// 微信上传多媒体文件 /// </summary> /// <param name="filepath">文件绝对路径</param> public static ReceiveModel.UpLoadInfo WxUpLoad(string filepath, string token, MediaType mt) { using (WebClient client = new WebClient()) { byte[] b = client.UploadFile(string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", token, mt.ToString()), filepath);//调用接口上传文件 string retdata = Encoding.Default.GetString(b);//获取返回值 if (retdata.Contains("media_id"))//判断返回值是否包含media_id,包含则说明上传成功,然后将返回的json字符串转换成json { return JsonConvert.DeserializeObject<UpLoadInfo>(retdata); } else {//否则,写错误日志 WriteBug(retdata);//写错误日志 return null; } } }
An dieser Stelle, bevor wir über die Beantwortung der Nachricht sprechen , Es wurden zwei grundlegende Support-Schnittstellen eingefügt, da Ihre Organisations- und Zusammenfassungsfähigkeiten zu schlecht sind. Okay, liebe Leser, bitte haben Sie Verständnis. Wenn Sie Fragen haben, hinterlassen Sie bitte eine Nachricht, um mit mir zu kommunizieren. Beginnen wir offiziell damit, über das Beantworten von Nachrichten zu sprechen. Wenn Sie den folgenden Inhalt lesen, lesen Sie ihn bitte in Verbindung mit den Kapiteln 4 und 5.
In den beiden vorherigen Kapiteln ging es um den Empfang und die Verarbeitung von von Benutzern gesendeten Nachrichten sowie um eine Nachrichtenbasisklasse BaseMessage. Unabhängig davon, welche Art von Nachricht wir empfangen, müssen wir in der Lage sein, Methoden aufzurufen, um auf Benutzer zu antworten Daher muss die Methode, mit der Benutzer auf Benutzeranfragen antworten können, in einer Basisklasse gekapselt werden. Werfen wir einen kurzen Blick auf die Arten von Nachrichten, auf die öffentliche Konten antworten können, sowie auf die Nachrichtenformate.
Hinweis:
Sobald die folgende Situation eintritt, gibt WeChat in der offiziellen Kontositzung eine Systemaufforderung an den Benutzer aus: „Dieses offizielle Konto ist vorübergehend nicht verfügbar.“ „Service, bitte versuchen Sie es später noch einmal“:
1、开发者在5秒内未回复任何内容 2、开发者回复了异常数据,比如JSON数据等
<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间 (整型)</CreateTime><MsgType><![CDATA[WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch]]></MsgType><Content><![CDATA[回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)]]></Content></xml>
<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间 (整型)</CreateTime><MsgType><![CDATA[WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch]]></MsgType><Image><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId></Image></xml>
<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间 (整型)</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId></Voice></xml>
<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间 (整型)</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[通过上传多媒体文件,得到的id。]]></MediaId><Title><![CDATA[视频消息的标题]]></Title> <Description><![CDATA[视频消息的描述]]></Description> </Video></xml>
<xml><ToUserName><![CDATA[接收方帐号(收到的OpenID)]]></ToUserName><FromUserName><![CDATA[开发者微信号]]></FromUserName><CreateTime>消息创建时间 (整型)</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><ThumbMediaId><![CDATA[缩略图的媒体id,通过上传多媒体文件,得到的id。]]></ThumbMediaId><Title><![CDATA[视频消息的标题]]></Title> <Description><![CDATA[视频消息的描述]]></Description> <MusicURL><![CDATA[音乐链接]]></MusicURL> <HQMusicUrl><![CDATA[高质量音乐链接,WIFI环境优先使用该链接播放音乐]]></HQMusicUrl> </Music></xml>
<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>2</ArticleCount><Articles><item><Title><![CDATA[title1]]></Title> <Description><![CDATA[description1]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item><item><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item></Articles></xml>
回复图文中,item是一个项,一个item代码一个图文。在响应的时候,我们只需根据数据格式,替换掉对应的属性,然后Response.Write(s)即可。结合前两章的讲解,BaseMessage的最终代码如下:
/// <summary> /// 消息体基类 /// </summary> public abstract class BaseMessage { /// <summary> /// 开发者微信号 /// </summary> public string ToUserName { get; set; } /// <summary> /// 发送方帐号(一个OpenID) /// </summary> public string FromUserName { get; set; } /// <summary> /// 消息创建时间 (整型) /// </summary> public string CreateTime { get; set; } /// <summary> /// 消息类型 /// </summary> public MsgType MsgType { get; set; } public virtual void ResponseNull() { Utils.ResponseWrite(""); } public virtual void ResText(EnterParam param, string content) { StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>", FromUserName, ToUserName, Utils.ConvertDateTimeInt(DateTime.Now))); resxml.AppendFormat("<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{0}]]></Content><FuncFlag>0</FuncFlag></xml>", content); Response(param, resxml.ToString()); } /// <summary> /// 回复消息(音乐) /// </summary> public void ResMusic(EnterParam param, Music mu) { StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName, Utils.ConvertDateTimeInt(DateTime.Now))); resxml.Append(" <MsgType><![CDATA[music]]></MsgType>"); resxml.AppendFormat("<Music><Title><![CDATA[{0}]]></Title><Description><![CDATA[{1}]]></Description>", mu.Title, mu.Description); resxml.AppendFormat("<MusicUrl><![CDATA[http://{0}{1}]]></MusicUrl><HQMusicUrl><![CDATA[http://{2}{3}]]></HQMusicUrl></Music><FuncFlag>0</FuncFlag></xml>", VqiRequest.GetCurrentFullHost(), mu.MusicUrl, VqiRequest.GetCurrentFullHost(), mu.HQMusicUrl); Response(param, resxml.ToString()); } public void ResVideo(EnterParam param, Video v) { StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName, Utils.ConvertDateTimeInt(DateTime.Now))); resxml.Append(" <MsgType><![CDATA[video]]></MsgType>"); resxml.AppendFormat("<Video><MediaId><![CDATA[{0}]]></MediaId>", v.media_id); resxml.AppendFormat("<Title><![CDATA[{0}]]></Title>", v.title); resxml.AppendFormat("<Description><![CDATA[{0}]]></Description></Video></xml>", v.description); Response(param, resxml.ToString()); } /// <summary> /// 回复消息(图片) /// </summary> public void ResPicture(EnterParam param, Picture pic, string domain) { StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName, Utils.ConvertDateTimeInt(DateTime.Now))); resxml.Append(" <MsgType><![CDATA[WeChat entwickelt passive Antworten und lädt und lädt Dateien hoch]]></MsgType>"); resxml.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl></xml>", domain + pic.PictureUrl); Response(param, resxml.ToString()); } /// <summary> /// 回复消息(图文列表) /// </summary> /// <param name="param"></param> /// <param name="art"></param> public void ResArticles(EnterParam param, List<Articles> art) { StringBuilder resxml = new StringBuilder(string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime>",FromUserName,ToUserName, Utils.ConvertDateTimeInt(DateTime.Now))); resxml.AppendFormat("<MsgType><![CDATA[news]]></MsgType><ArticleCount>{0}</ArticleCount><Articles>", art.Count); for (int i = 0; i < art.Count; i++) { resxml.AppendFormat("<item><Title><![CDATA[{0}]]></Title> <Description><![CDATA[{1}]]></Description>", art[i].Title, art[i].Description); resxml.AppendFormat("<PicUrl><![CDATA[{0}]]></PicUrl><Url><![CDATA[{1}]]></Url></item>", art[i].PicUrl.Contains("http://") ? art[i].PicUrl : "http://" + VqiRequest.GetCurrentFullHost() + art[i].PicUrl, art[i].Url.Contains("http://") ? art[i].Url : "http://" + VqiRequest.GetCurrentFullHost() + art[i].Url); } resxml.Append("</Articles><FuncFlag>0</FuncFlag></xml>"); Response(param, resxml.ToString()); } /// <summary> /// 多客服转发 /// </summary> /// <param name="param"></param> public void ResDKF(EnterParam param) { StringBuilder resxml = new StringBuilder(); resxml.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>",FromUserName); resxml.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName><CreateTime>{1}</CreateTime>",ToUserName,CreateTime); resxml.AppendFormat("<MsgType><![CDATA[transfer_customer_service]]></MsgType></xml>"); Response(param, resxml.ToString()); } /// <summary> /// 多客服转发如果指定的客服没有接入能力(不在线、没有开启自动接入或者自动接入已满),该用户会一直等待指定客服有接入能力后才会被接入,而不会被其他客服接待。建议在指定客服时,先查询客服的接入能力指定到有能力接入的客服,保证客户能够及时得到服务。 /// </summary> /// <param name="param">用户发送的消息体</param> /// <param name="KfAccount">多客服账号</param> public void ResDKF(EnterParam param, string KfAccount) { StringBuilder resxml = new StringBuilder(); resxml.AppendFormat("<xml><ToUserName><![CDATA[{0}]]></ToUserName>",FromUserName); resxml.AppendFormat("<FromUserName><![CDATA[{0}]]></FromUserName><CreateTime>{1}</CreateTime>",ToUserName,CreateTime); resxml.AppendFormat("<MsgType><![CDATA[transfer_customer_service]]></MsgType><TransInfo><KfAccount>{0}</KfAccount></TransInfo></xml>", KfAccount); Response(param, resxml.ToString()); } private void Response(EnterParam param, string data) { if (param.IsAes) { var wxcpt = new MsgCrypt(param.token, param.EncodingAESKey, param.appid); wxcpt.EncryptMsg(data, Utils.ConvertDateTimeInt(DateTime.Now).ToString(), Utils.GetRamCode(), ref data); } Utils.ResponseWrite(data); } }
上面的代码中,public void ResDKF(EnterParam param),public void ResDKF(EnterParam param, string KfAccount)两个方法时多客服中,用户转发用户发送的消息的,多客服将在后期的博文中进行更新,敬请期待。
public void ResMusic(EnterParam param, Music mu)方法中的Music类的定义如下:
public class Music { #region 属性 /// <summary> /// 音乐链接 /// </summary> public string MusicUrl { get; set; } /// <summary> /// 高质量音乐链接,WIFI环境优先使用该链接播放音乐 /// </summary> public string HQMusicUrl { get; set; } /// <summary> /// 标题 /// </summary> public string Title { get; set; } /// <summary> /// 描述 /// </summary> public string Description { get; set; } #endregion }
public void ResVideo(EnterParam param, Video v)方法中的Video类的定义如下:
public class Video { public string title { get; set; } public string media_id { get; set; } public string description { get; set; } }
public void ResArticles(EnterParam param, List
public class Articles { #region 属性 /// <summary> /// 图文消息标题 /// </summary> public string Title { get; set; } /// <summary> /// 图文消息描述 /// </summary> public string Description { get; set; } /// <summary> /// 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80。 /// </summary> public string PicUrl { get; set; } /// <summary> /// 点击图文消息跳转链接 /// </summary> public string Url { get; set; } #endregion }
【相关推荐】
2.微信投票源码
Das obige ist der detaillierte Inhalt vonWeChat entwickelt passive Antworten und lädt und lädt Dateien hoch. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!