开发微信公众平台帮助代码C#.docx_第1页
开发微信公众平台帮助代码C#.docx_第2页
开发微信公众平台帮助代码C#.docx_第3页
开发微信公众平台帮助代码C#.docx_第4页
开发微信公众平台帮助代码C#.docx_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Xml;using System.Web.Security;using System.Net;using System.IO;using System.Text;using System.Web.Script.Serialization;using Xingpingsm.Models;using System.Security.Cryptography;/ / 微信公众平台服务类/ public static class WeiXinHelper #region 变量 /微信公共平台帮助文档网址:/wiki/index.php private static string Token = admin;/根据在微信公共平台申请开发模式时填写的值 private static string AppID = 申请成功获取的id, AppSecret = 申请成功获取的密码;/开发者ID和密码(申请开发者成功后获得) private static readonly string XmlFile = HttpRuntime.AppDomainAppPath + App_Dataweixin-0.txt; /回复xml格式信息(微信只接收xml文件) private static string ResXml = 0 1 2 text 3 0 ; /自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。 /一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“.”代替。 /请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。 /目前自定义菜单接口可实现两种类型按钮,如下: /click: /用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event的结构给开发者(参考消息接口指南), /并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互; /view: /用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值(即网页链接),达到打开网页的目的, /建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。 public static string CreateMenuUrl = /cgi-bin/menu/create?access_token=0;/创建自定义菜单链接 public static string DeleteMenuUrl = /cgi-bin/menu/delete?access_token=0;/删除自定义菜单链接 public static string GetMenuUrl = /cgi-bin/menu/get?access_token=0;/获取自定义菜单链接 public static string CustomMsgUrl = /cgi-bin/message/custom/send?access_token=0;/发送客服信息 #endregion #region 首次开发者验证 public static void Auth() string echoStr = System.Web.HttpContext.Current.Request.QueryStringechoStr; if (CheckSignature() if (!string.IsNullOrEmpty(echoStr) System.Web.HttpContext.Current.Response.Write(echoStr); System.Web.HttpContext.Current.Response.End(); / / 验证微信签名 / / * 将token、timestamp、nonce三个参数进行字典序排序 / * 将三个参数字符串拼接成一个字符串进行sha1加密 / * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。 / private static bool CheckSignature() string signature = System.Web.HttpContext.Current.Request.QueryStringsignature; string timestamp = System.Web.HttpContext.Current.Request.QueryStringtimestamp; string nonce = System.Web.HttpContext.Current.Request.QueryStringnonce; string ArrTmp = Token, timestamp, nonce ; Array.Sort(ArrTmp); /字典排序 string tmpStr = string.Join(, ArrTmp); tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, SHA1); tmpStr = tmpStr.ToLower(); if (tmpStr = signature) return true; else return false; #region 检测Signature(验证开发人时用) /private bool checkSignature() / / string signature = HttpContext.Current.Requestsignature; / string timestamp = HttpContext.Current.Requesttimestamp; / string nonce = HttpContext.Current.Requestnonce; / List tmpArr = new List(); / tmpArr.Add(Token); / tmpArr.Add(timestamp); / tmpArr.Add(nonce); / tmpArr.Sort(); / string a = string.Join(, tmpArr); / SHA1 hash = SHA1CryptoServiceProvider.Create(); / byte plainTextBytes = Encoding.ASCII.GetBytes(a); / byte hashBytes = hash.ComputeHash(plainTextBytes); / string localChecksum = BitConverter.ToString(hashBytes).Replace(-, ).ToLowerInvariant(); / if (signature = localChecksum) / / return true; / / else / / return false; / / #endregion #endregion #region 接收消息(微信平台post数据) / / 微信平台post数据进行解析并封装 / / xml字符串 public static void Handle(string postStr) try LogHelper.WriteLog(string.Format(XmlFile, DateTime.Now.ToString(yyyy-MM-dd), postStr); /封装请求类 XmlDocument requestXml = new XmlDocument(); requestXml.LoadXml(postStr); XmlNode rootNode = requestXml.SelectSingleNode(xml);/获取根节点 XmlNode FromUserNameNode = rootNode.SelectSingleNode(FromUserName); XmlNode ToUserNameNode = rootNode.SelectSingleNode(ToUserName); XmlNode ContentNode = rootNode.SelectSingleNode(Content); XmlNode MsgIdNode = rootNode.SelectSingleNode(MsgId); XmlNode MsgTypeNode = rootNode.SelectSingleNode(MsgType); RequestXML requestXML = new RequestXML(); requestXML.ToUserName = ToUserNameNode = null ? : ToUserNameNode.InnerText; requestXML.FromUserName = FromUserNameNode = null ? : FromUserNameNode.InnerText; requestXML.MsgId = MsgIdNode = null ? : MsgIdNode.InnerText; requestXML.MsgType = MsgTypeNode = null ? : MsgTypeNode.InnerText; if (requestXML.MsgType = text)/用户向开发者发送普通文本 requestXML.Content = rootNode.SelectSingleNode(Content).InnerText; else if (requestXML.MsgType = location)/用户向开发者发送地理位置消息 requestXML.Location_X = rootNode.SelectSingleNode(Location_X).InnerText; requestXML.Location_Y = rootNode.SelectSingleNode(Location_Y).InnerText; requestXML.Scale = rootNode.SelectSingleNode(Scale).InnerText; requestXML.Label = rootNode.SelectSingleNode(Label).InnerText; else if (requestXML.MsgType = image)/用户向开发者发送图片消息 requestXML.PicUrl = rootNode.SelectSingleNode(PicUrl).InnerText; else if (requestXML.MsgType = event)/用户点击了自定义菜单事件推送 requestXML.Event = rootNode.SelectSingleNode(Event).InnerText; requestXML.EventKey = rootNode.SelectSingleNode(EventKey).InnerText; /回复消息 ResponseMsg(requestXML); catch (Exception ex) LogHelper.SafeLogException(ex); #endregion #region 回复消息(微信信息返回) / / 回复消息(微信信息返回) / / private static void ResponseMsg(RequestXML requestXML) string content = string.Empty; if (requestXML.MsgType.Equals(MsgTypeEnum.EVENT.ToString().ToLower()/回复事件托送 if (requestXML.Event = CLICK)/用户点击了自定义菜单 if (requestXML.EventKey = test) content = 点击了test按钮1; if (requestXML.EventKey = moman) content = 点击了moman按钮1; if (requestXML.MsgType.Equals(MsgTypeEnum.TEXT.ToString().ToLower()/回复用户文本输入 if (requestXML.Content = 1) content = 乐摩网址:http:/lemo.me; else if (requestXML.Content = 2) content = 当普通n微信用户向公众账号发n消息时,微信服务器将POSTn消息的XML数据包到开发t者填写的URLn上。各消息类型的推送XML数据包结构如下。; else content = 用户输入 + requestXML.Content; HttpContext.Current.Response.ContentType = text/xml; HttpContext.Current.Response.Write(string.Format(ResXml, requestXML.FromUserName, requestXML.ToUserName, ConvertDateTimeInt(DateTime.Now), content); HttpContext.Current.ApplicationInstance.CompleteRequest(); #endregion #region unix时间转换为datetime / / unix时间转换为datetime / / string / DateTime private static DateTime UnixTimeToTime(string timeStamp) DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1); long lTime = long.Parse(timeStamp + 0000000); TimeSpan toNow = new TimeSpan(lTime); return dtStart.Add(toNow); #endregion #region datetime转换为unixtime / / datetime转换为unixtime / / DateTime / int private static int ConvertDateTimeInt(System.DateTime time) System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1); return (int)(time - startTime).TotalSeconds; #endregion #region 调用百度地图,返回坐标信息 / / 调用百度地图,返回坐标信息 / / 经度 / 纬度 / public static string GetMapInfo(string x, string y) try string res = string.Empty; string parame = string.Empty; string url = /maps/api/geocode/xml; parame = latlng= + x + , + y + &language=zh-CN&sensor=false;/此key为个人申请 res = webRequestPost(url, parame); XmlDocument doc = new XmlDocument(); doc.LoadXml(res); XmlElement rootElement = doc.DocumentElement; string Status = rootElement.SelectSingleNode(status).InnerText; if (Status = OK) /仅获取城市 XmlNodeList xmlResults = rootElement.SelectSingleNode(/GeocodeResponse).ChildNodes; for (int i = 0; i xmlResults.Count; i+) XmlNode childNode = xmlResultsi; if (childNode.Name = status) continue; string city = 0; for (int w = 0; w childNode.ChildNodes.Count; w+) for (int q = 0; q 0) jsonStr = jsonStr.Substring(0, jsonStr.LastIndexOf(,); jsonStr = jsonStr.Replace(, /); string url = string.Format(CreateMenuUrl, weixin_token); return HttpPost(url, jsonStr); /returnData 返回的是 errcode:0,errmsg:ok 此时,你取消服务号关注,在添加关注,菜单就生成了 #endregion #region 清空自定义菜单 public static string DeleteMenu(string token) return HttpPost(string.Format(DeleteMenuUrl, token); #endregion #region 查询自定义菜单 public static string GetMenu(string token) return HttpPost(string.Format(GetMenuUrl, token); #endregion #region 获取access_token / / 获取access_token / / public static string GetToken() string access_token = ; string url = /cgi-bin/token?grant_type=client_credential&appid= + AppID + &secret= + AppSecret + ;/你成为开发者后会有一个appID和appSecret string response = HttpGet(url); JavaScriptSerializer json = new JavaScriptSerializer(); /实例化一个能够序列化数据的类 ToJson list = json.Deserialize(response); /将json数据转化为对象类型并赋值给list access_token = list.access_token; /获取JSON里access_token值 return access_token; #region 中转对象 public struct ToJson public string access_token get; set; /属性的名字,必须与json格式字符串中的key值一样。 public string expires get; set; #endregion #endregion #region Get请求 / / HTTP GET方式请求数据. / / URL. / private static string HttpGet(string url) HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = GET; request.Accept = */*; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; try response = request.GetResponse(); if (response != null) StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); reader.Close(); catch (Exception) throw; finally request = null; response = null; return responseStr; #endregion #region POST请求 / / HTTP POST方式请求数据 / / URL. / private static string HttpPost(string url) HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = POST; request.ContentType = application/x-www-form-urlencoded; request.Accept = */*; request.Timeout = 15000; request.AllowAutoRedirect = false; WebResponse response = null; string responseStr = null; try response = request.GetResponse(); if (response != null) StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.ReadToEnd(); /File.WriteAllText(Server.MapPath(/) + test.txt, responseStr); reader.Close(); catch (Exception) throw; finally request = null; response = null; return responseStr; / / HTTP POST方式请求数据 / / URL. / POST的数据 / public static string HttpPost(string url, string param) HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url); request.Method = POST; request.ContentType = application/x-www-form-urlencoded; request.Accept = */*; request.Timeout = 15000; request.AllowAutoRedirect = false; StreamWriter requestStream = null; WebResponse response = null; string responseStr = null; try requestStream = new StreamWriter(request.GetRequestStream(); requestStream.Write(param); requestStream.Close(); response = request.GetResponse(); if (response != null) StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8); responseStr = reader.Rea

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论