공개 플랫폼 정보인터페이스는 개발자에게 메시지를 처리하는 새로운 방법을 제공합니다. 개발자가 되기 위해 지원하면 공개 플랫폼의 개발 기능을 사용할 수 있습니다. 여기서 URL과 토큰을 입력해야 합니다. 이 두 가지 정보에는 자체 서버(외부 네트워크 서버) 리소스도 필요합니다. 토큰은 개발자가 임의로 입력할 수 있습니다. URL은 인터페이스 구성 정보의 링크 주소입니다. 이 기사에서는 간단한 웹사이트를 만드는 방법 중 하나의 백그라운드 프로그램에서 관련 인터페이스 정보를 구성합니다. 페이지를 외부 네트워크 서버에 게시합니다. 이 페이지에 액세스할 수 있는 마지막 링크 주소는 여기에 입력해야 합니다.
인터페이스 구성 프로세스:
1. URL 접속 확인 서명:
const string Token = "aka";//定义一个局部变量不可以被修改,这里定义的变量要与接口配置信息中填写的Token一致 protected void Page_Load(object sender, EventArgs e) { string postStr = ""; Valid();//校验签名,当填入的信息提交之后页面有提示“你已成功成为公众平台开发者,可以使用公众平台的开发功能”这个的时候,接下来你就需要注释掉这个校验的方法,使得后面的消息回复得以正常运作 if (Request.HttpMethod.ToLower() == "post")//当普通微信用户向公众账号发消息时,微信服务器将POST该消息到填写的URL上 { postStr = PostInput(); if (string.IsNullOrEmpty(postStr) == false) { //WriteLog(postStr,Server);//计入日记 ResponseMsg(postStr); } } } private void Valid() { string echoStr = Request.QueryString["echoStr"].ToString(); if (CheckSignature()) { if (!string.IsNullOrEmpty(echoStr)) { Response.Write(echoStr); Response.End(); } } }
/// <summary> /// 验证微信签名 /// </summary> /// <returns></returns> private bool CheckSignature() { string signature = Request.QueryString["signature"].ToString(); string timestamp = Request.QueryString["timestamp"].ToString(); string nonce = Request.QueryString["nonce"].ToString(); string[] ArrTmp = { Token, timestamp, nonce }; Array.Sort(ArrTmp);//字典排序 string tmpStr = string.Join("", ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密 tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理 //WriteLog(tmpStr, Server);//计入日志 if (tmpStr == signature)//开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败 { return true; } else return false; } /// <summary> /// 获取post返回来的数据 /// </summary> /// <returns></returns> private string PostInput() { Stream s = System.Web.HttpContext.Current.Request.InputStream; byte[] b = new byte[s.Length]; s.Read(b, 0, (int)s.Length); return Encoding.UTF8.GetString(b); } /// <summary> ///返回微信信息结果 /// </summary> /// <param name="weixinXML"></param> private void ResponseMsg(string weixinXML) { try { XmlDocument doc = new XmlDocument(); doc.LoadXml(weixinXML);//读取XML字符串 XmlElement rootElement = doc.DocumentElement; XmlNode MsgType = rootElement.SelectSingleNode("MsgType");//获取字符串中的消息类型 string resxml = ""; if (MsgType.InnerText == "text")//如果消息类型为文本消息 { var model = new { ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText, FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText, CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText, MsgType = MsgType.InnerText, Content = rootElement.SelectSingleNode("Content").InnerText, MsgId = rootElement.SelectSingleNode("MsgId").InnerText }; resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime>"; if (!string.IsNullOrEmpty(model.Content))//如果接收到消息 { if (model.Content.Contains(" 你好") || model.Content.Contains(" 好") || model.Content.Contains("hi") || model.Content.Contains("hello"))// 你好 { resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好,有事请留言,偶会及时回复你的。]]></Content><FuncFlag>0</FuncFlag></xml>"; } } else//没有接收到消息 { resxml += "<MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,感谢您对我的关注,有事请留言。]]></Content><FuncFlag>0</FuncFlag></xml>"; } Response.Write(resxml); } if (MsgType.InnerText == "image")//如果消息类型为图片消息 { var model = new { ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText, FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText, CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText, MsgType = MsgType.InnerText, PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText, MsgId = rootElement.SelectSingleNode("MsgId").InnerText }; resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName><FromUserName> <![CDATA[" + model.ToUserName + "]]></FromUserName> <CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime> <MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item> <Title><![CDATA[欢迎您的光临!]]></Title><Description><![CDATA[非常感谢您的关注!]]> </Description><PicUrl><![CDATA[http://...jpg]]></PicUrl><Url><![CDATA[http://www.baidu.com/]]></Url></item></Articles><FuncFlag>0</FuncFlag></xml>"; Response.Write(resxml); } else//如果是其余的消息类型 { var model = new { ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText, FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText, CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText, }; resxml += "<xml><ToUserName><![CDATA[" + model.FromUserName + "]]></ToUserName> <FromUserName><![CDATA[" + model.ToUserName + "]]></FromUserName> <CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime> <MsgType><![CDATA[text]]></MsgType><Content> <![CDATA[亲,感谢您对我的关注,有事请留言,我会及时回复你的哦。]]></Content> <FuncFlag>0</FuncFlag></xml>"; Response.Write(resxml); } } catch (Exception ex) { throw ex; } Response.End(); } /// <summary> /// datetime转换成unixtime /// </summary> /// <param name="time"></param> /// <returns></returns> private int ConvertDateTimeInt(System.DateTime time) { System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); return (int)(time - startTime).TotalSeconds; } /// <summary> /// 写日志(用于跟踪),可以将想打印出的内容计入一个文本文件里面,便于测试 /// </summary> public static void WriteLog(string strMemo, HttpServerUtility server) { string filename = server.MapPath("/logs/log.txt");//在网站项目中建立一个文件夹命名logs(然后在文件夹中随便建立一个web页面文件,避免网站在发布到服务器之后看不到预定文件) if (!Directory.Exists(server.MapPath("//logs//"))) Directory.CreateDirectory("//logs//"); StreamWriter sr = null; try { if (!File.Exists(filename)) { sr = File.CreateText(filename); } else { sr = File.AppendText(filename); } sr.WriteLine(strMemo); } catch { } finally { if (sr != null) sr.Close(); } }
위 내용은 .net을 사용하여 WeChat 공개 플랫폼을 개발하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!