当前位置:Gxlcms > asp.net > C#.net 微信公众账号接口开发

C#.net 微信公众账号接口开发

时间:2021-07-01 10:21:17 帮助过:12人阅读

微信越来越火,微信公众平台成为开发成新宠,本文用C#.net开发微信公众信号接口。

微信接口地址代码:

  1. weixin _wx = new weixin();
  2. string postStr = "";
  3. if (Request.HttpMethod.ToLower() == "post")
  4. {
  5. Stream s = System.Web.HttpContext.Current.Request.InputStream;
  6. byte[] b = new byte[s.Length];
  7. s.Read(b, 0, (int)s.Length);
  8. postStr = Encoding.UTF8.GetString(b);
  9. if (!string.IsNullOrEmpty(postStr)) //请求处理
  10. {
  11. _wx.Handle(postStr);
  12. }
  13. }
  14. else
  15. {
  16. _wx.Auth();
  17. }
  18. 微信处理类:
  19. public class weixin
  20. {
  21. private string Token = "weixin_token"; //换成自己的token
  22. public void Auth()
  23. {
  24. string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"];
  25. if (CheckSignature())
  26. {
  27. if (!string.IsNullOrEmpty(echoStr))
  28. {
  29. System.Web.HttpContext.Current.Response.Write(echoStr);
  30. System.Web.HttpContext.Current.Response.End();
  31. }
  32. }
  33. }
  34. public void Handle(string postStr)
  35. {
  36. //封装请求类
  37. XmlDocument doc = new XmlDocument();
  38. doc.LoadXml(postStr);
  39. XmlElement rootElement = doc.DocumentElement;
  40. XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
  41. RequestXML requestXML = new RequestXML();
  42. requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
  43. requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
  44. requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
  45. requestXML.MsgType = MsgType.InnerText;
  46. if (requestXML.MsgType == "text")
  47. {
  48. requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
  49. }
  50. else if (requestXML.MsgType == "location")
  51. {
  52. requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;
  53. requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
  54. requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
  55. requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
  56. }
  57. else if (requestXML.MsgType == "image")
  58. {
  59. requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
  60. }
  61. //回复消息
  62. ResponseMsg(requestXML);
  63. }
  64. /// <summary>
  65. /// 验证微信签名
  66. /// </summary>
  67. /// * 将token、timestamp、nonce三个参数进行字典序排序
  68. /// * 将三个参数字符串拼接成一个字符串进行sha1加密
  69. /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
  70. /// <returns></returns>
  71. private bool CheckSignature()
  72. {
  73. string signature = System.Web.HttpContext.Current.Request.QueryString["signature"];
  74. string timestamp = System.Web.HttpContext.Current.Request.QueryString["timestamp"];
  75. string nonce = System.Web.HttpContext.Current.Request.QueryString["nonce"];
  76. string[] ArrTmp = { Token, timestamp, nonce };
  77. Array.Sort(ArrTmp); //字典排序
  78. string tmpStr = string.Join("", ArrTmp);
  79. tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
  80. tmpStr = tmpStr.ToLower();
  81. if (tmpStr == signature)
  82. {
  83. return true;
  84. }
  85. else
  86. {
  87. return false;
  88. }
  89. }
  90. /// <summary>
  91. /// 回复消息(微信信息返回)
  92. /// </summary>
  93. /// <param name="weixinXML"></param>
  94. private void ResponseMsg(RequestXML requestXML)
  95. {
  96. try
  97. {
  98. string resxml = "";
  99. mijiya mi = new mijiya(requestXML.Content,requestXML.FromUserName);
  100. if (requestXML.MsgType == "text")
  101. {
  102. //在这里执行一系列操作,从而实现自动回复内容.
  103. string _reMsg = mi.GetReMsg();
  104. if (mi.msgType == 1)
  105. {
  106. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>2</ArticleCount><Articles>";
  107. resxml += mi.GetRePic(requestXML.FromUserName);
  108. resxml += "</Articles><FuncFlag>1</FuncFlag></xml>";
  109. }
  110. else
  111. {
  112. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + _reMsg + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  113. }
  114. }
  115. else if (requestXML.MsgType == "location")
  116. {
  117. string city = GetMapInfo(requestXML.Location_X, requestXML.Location_Y);
  118. if (city == "0")
  119. {
  120. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[好啦,我们知道您的位置啦。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  121. }
  122. else
  123. {
  124. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[好啦,我们知道您的位置啦。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  125. }
  126. }
  127. else if (requestXML.MsgType == "image")
  128. {
  129. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,我没有看懂你的意思。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  130. //返回10以内条
  131. //int size = 10;
  132. //resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[news]]></MsgType><Content><![CDATA[]]></Content><ArticleCount>" + size + "</ArticleCount><Articles>";
  133. //List<string> list = new List<string>();
  134. ////假如有20条查询的返回结果
  135. //for (int i = 0; i < 20; i++)
  136. //{
  137. // list.Add("1");
  138. //}
  139. //string[] piclist = new string[] { "/Abstract_Pencil_Scribble_Background_Vector_main.jpg", "/balloon_tree.jpg", "/bloom.jpg", "/colorful_flowers.jpg", "/colorful_summer_flower.jpg", "/fall.jpg", "/fall_tree.jpg", "/growing_flowers.jpg", "/shoes_illustration.jpg", "/splashed_tree.jpg" };
  140. //for (int i = 0; i < size && i < list.Count; i++)
  141. //{
  142. // resxml += "<item><Title><![CDATA[沈阳-黑龙江]]></Title><Description><![CDATA[元旦特价:¥300 市场价:¥400]]></Description><PicUrl><![CDATA[" + "http://www.hougelou.com" + piclist[i] + "]]></PicUrl><Url><![CDATA[http://www.hougelou.com]]></Url></item>";
  143. //}
  144. //resxml += "</Articles><FuncFlag>1</FuncFlag></xml>";
  145. }
  146. else if (wx_tmsg.GetMsgCount(requestXML.FromUserName) == 0)
  147. {
  148. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[" + mi.GetFirst() + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  149. }
  150. else
  151. {
  152. resxml = "<xml><ToUserName><![CDATA[" + requestXML.FromUserName + "]]></ToUserName><FromUserName><![CDATA[" + requestXML.ToUserName + "]]></FromUserName><CreateTime>" + ConvertDateTimeInt(DateTime.Now) + "</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[亲,我没有看懂你的意思。您可以:" + mi.GetDefault() + "]]></Content><FuncFlag>1</FuncFlag></xml>";
  153. }
  154. //WriteTxt(resxml);
  155. System.Web.HttpContext.Current.Response.Write(resxml);
  156. WriteToDB(requestXML, resxml,mi.pid);
  157. }
  158. catch (Exception ex)
  159. {
  160. //WriteTxt("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());
  161. wx_logs.MyInsert("异常:" + ex.Message + "Struck:" + ex.StackTrace.ToString());
  162. }
  163. }
  164. /// <summary>
  165. /// unix时间转换为datetime
  166. /// </summary>
  167. /// <param name="timeStamp"></param>
  168. /// <returns></returns>
  169. private DateTime UnixTimeToTime(string timeStamp)
  170. {
  171. DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
  172. long lTime = long.Parse(timeStamp + "0000000");
  173. TimeSpan toNow = new TimeSpan(lTime);
  174. return dtStart.Add(toNow);
  175. }
  176. /// <summary>
  177. /// datetime转换为unixtime
  178. /// </summary>
  179. /// <param name="time"></param>
  180. /// <returns></returns>
  181. private int ConvertDateTimeInt(System.DateTime time)
  182. {
  183. System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
  184. return (int)(time - startTime).TotalSeconds;
  185. }
  186. /// <summary>
  187. /// 调用百度地图,返回坐标信息
  188. /// </summary>
  189. /// <param name="y">经度</param>
  190. /// <param name="x">纬度</param>
  191. /// <returns></returns>
  192. public string GetMapInfo(string x, string y)
  193. {
  194. try
  195. {
  196. string res = string.Empty;
  197. string parame = string.Empty;
  198. string url = "http://maps.googleapis.com/maps/api/geocode/xml";
  199. parame = "latlng=" + x + "," + y + "&language=zh-CN&sensor=false";//此key为个人申请
  200. res = webRequestPost(url, parame);
  201. XmlDocument doc = new XmlDocument();
  202. doc.LoadXml(res);
  203. XmlElement rootElement = doc.DocumentElement;
  204. string Status = rootElement.SelectSingleNode("status").InnerText;
  205. if (Status == "OK")
  206. {
  207. //仅获取城市
  208. XmlNodeList xmlResults = rootElement.SelectSingleNode("/GeocodeResponse").ChildNodes;
  209. for (int i = 0; i < xmlResults.Count; i++)
  210. {
  211. XmlNode childNode = xmlResults[i];
  212. if (childNode.Name == "status")
  213. {
  214. continue;
  215. }
  216. string city = "0";
  217. for (int w = 0; w < childNode.ChildNodes.Count; w++)
  218. {
  219. for (int q = 0; q < childNode.ChildNodes[w].ChildNodes.Count; q++)
  220. {
  221. XmlNode childeTwo = childNode.ChildNodes[w].ChildNodes[q];
  222. if (childeTwo.Name == "long_name")
  223. {
  224. city = childeTwo.InnerText;
  225. }
  226. else if (childeTwo.InnerText == "locality")
  227. {
  228. return city;
  229. }
  230. }
  231. }
  232. return city;
  233. }
  234. }
  235. }
  236. catch (Exception ex)
  237. {
  238. //WriteTxt("map异常:" + ex.Message.ToString() + "Struck:" + ex.StackTrace.ToString());
  239. return "0";
  240. }
  241. return "0";
  242. }
  243. /// <summary>
  244. /// Post 提交调用抓取
  245. /// </summary>
  246. /// <param name="url">提交地址</param>
  247. /// <param name="param">参数</param>
  248. /// <returns>string</returns>
  249. public string webRequestPost(string url, string param)
  250. {
  251. byte[] bs = System.Text.Encoding.UTF8.GetBytes(param);
  252. HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url + "?" + param);
  253. req.Method = "Post";
  254. req.Timeout = 120 * 1000;
  255. req.ContentType = "application/x-www-form-urlencoded;";
  256. req.ContentLength = bs.Length;
  257. using (Stream reqStream = req.GetRequestStream())
  258. {
  259. reqStream.Write(bs, 0, bs.Length);
  260. reqStream.Flush();
  261. }
  262. using (WebResponse wr = req.GetResponse())
  263. {
  264. //在这里对接收到的页面内容进行处理
  265. Stream strm = wr.GetResponseStream();
  266. StreamReader sr = new StreamReader(strm, System.Text.Encoding.UTF8);
  267. string line;
  268. System.Text.StringBuilder sb = new System.Text.StringBuilder();
  269. while ((line = sr.ReadLine()) != null)
  270. {
  271. sb.Append(line + System.Environment.NewLine);
  272. }
  273. sr.Close();
  274. strm.Close();
  275. return sb.ToString();
  276. }
  277. }
  278. private void WriteToDB(RequestXML requestXML,string _xml,int _pid)
  279. {
  280. wx_tmsg wx = new wx_tmsg();
  281. wx.AddNew();
  282. wx.FromUserName = requestXML.FromUserName;
  283. wx.ToUserName = requestXML.ToUserName;
  284. wx.MsgType = requestXML.MsgType;
  285. wx.Msg = requestXML.Content;
  286. wx.Creatime = requestXML.CreateTime;
  287. wx.Location_X = requestXML.Location_X;
  288. wx.Location_Y = requestXML.Location_Y;
  289. wx.Label = requestXML.Label;
  290. wx.Scale = requestXML.Scale;
  291. wx.PicUrl = requestXML.PicUrl;
  292. wx.reply = _xml;
  293. wx.pid = _pid;
  294. try
  295. {
  296. wx.Update();
  297. }
  298. catch (Exception ex)
  299. {
  300. wx_logs.MyInsert(ex.Message);
  301. //ex.message;
  302. }
  303. }
  304. }
  305. //微信请求类
  306. public class RequestXML
  307. {
  308. private string toUserName="";
  309. /// <summary>
  310. /// 消息接收方微信号,一般为公众平台账号微信号
  311. /// </summary>
  312. public string ToUserName
  313. {
  314. get { return toUserName; }
  315. set { toUserName = value; }
  316. }
  317. private string fromUserName = "";
  318. /// <summary>
  319. /// 消息发送方微信号
  320. /// </summary>
  321. public string FromUserName
  322. {
  323. get { return fromUserName; }
  324. set { fromUserName = value; }
  325. }
  326. private string createTime = "";
  327. /// <summary>
  328. /// 创建时间
  329. /// </summary>
  330. public string CreateTime
  331. {
  332. get { return createTime; }
  333. set { createTime = value; }
  334. }
  335. private string msgType = "";
  336. /// <summary>
  337. /// 信息类型 地理位置:location,文本消息:text,消息类型:image
  338. /// </summary>
  339. public string MsgType
  340. {
  341. get { return msgType; }
  342. set { msgType = value; }
  343. }
  344. private string content = "";
  345. /// <summary>
  346. /// 信息内容
  347. /// </summary>
  348. public string Content
  349. {
  350. get { return content; }
  351. set { content = value; }
  352. }
  353. private string location_X = "";
  354. /// <summary>
  355. /// 地理位置纬度
  356. /// </summary>
  357. public string Location_X
  358. {
  359. get { return location_X; }
  360. set { location_X = value; }
  361. }
  362. private string location_Y = "";
  363. /// <summary>
  364. /// 地理位置经度
  365. /// </summary>
  366. public string Location_Y
  367. {
  368. get { return location_Y; }
  369. set { location_Y = value; }
  370. }
  371. private string scale = "";
  372. /// <summary>
  373. /// 地图缩放大小
  374. /// </summary>
  375. public string Scale
  376. {
  377. get { return scale; }
  378. set { scale = value; }
  379. }
  380. private string label = "";
  381. /// <summary>
  382. /// 地理位置信息
  383. /// </summary>
  384. public string Label
  385. {
  386. get { return label; }
  387. set { label = value; }
  388. }
  389. private string picUrl = "";
  390. /// <summary>
  391. /// 图片链接,开发者可以用HTTP GET获取
  392. /// </summary>
  393. public string PicUrl
  394. {
  395. get { return picUrl; }
  396. set { picUrl = value; }
  397. }
  398. }

说明: 其中用到的mijiya类,主要是调用数据库进行关键词匹配自动回复内容,可以根据自己的业务情况编写。

人气教程排行