zoukankan      html  css  js  c++  java
  • 腾讯微信公众平台接口

    微信公众平台是腾讯公司在微信的基础上新增的功能模块,通过这一平台,个人和企业都可以打造一个微信的公众号,并实现和特定群体的文字、图片、语音的全方位沟通、互动。
    首先注册一个微信公众平台账户,注册地址:https://mp.weixin.qq.com/cgi-bin/readtemplate?t=wxm2-realname-reg&lang=zh_CN
    注册后登记了个人信息审核后就可以使用平台了,登陆后进入高级功能开启开发模式:如图

    首次进入开发模式需要配置“接口配置信息”
    需要Token验证;

    先去看看这个验证的帮助指南,http://mp.weixin.qq.com/wiki/index.php?title=%E6%B6%88%E6%81%AF%E6%8E%A5%E5%8F%A3%E6%8C%87%E5%8D%97
    我们定义一个MessageReceiveHandler.ashx一般处理程序来处理这个功能,

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using Tencent.WeiXin;
    namespace Test
    {
        /// <summary>
        /// MessageReceiveHandler 的摘要说明
        /// </summary>
        public class MessageReceiveHandler : IHttpHandler
        {
    
            private static readonly string Token = "中国.NET协会";
            public void ProcessRequest(HttpContext context)
            {
                if (context.Request.RequestType == "GET")//第一次Token验证
                {
                    if (CheckSignature(context))
                    {
                        context.Response.Write(context.Request.QueryString["echostr"]);
                    }
                    return;
                }
                
                context.Response.Flush();
            }
            /// <summary>
            /// 加密/校验流程:
            ///1. 将token、timestamp、nonce三个参数进行字典序排序
             ///2. 将三个参数字符串拼接成一个字符串进行sha1加密
            ///3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
            /// </summary>
            /// <param name="context"></param>
            /// <returns></returns>
            protected virtual bool CheckSignature(HttpContext context)
            {
                List<string> list = new List<string>();
                list.Add(context.Request.QueryString["timestamp"]);
                list.Add(context.Request.QueryString["nonce"]);
                list.Add(Token);
                list = list.OrderBy(t => t).ToList();
                var sha1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(list[0] + list[1] + list[2], "SHA1");
                var signature = context.Request.QueryString["signature"];
                return signature.Equals(sha1, StringComparison.OrdinalIgnoreCase);
            }
            public bool IsReusable
            {
                get
                {
                    return false;
                }
            }
        }
    }
    MessageReceiveHandler


    在来实现解析消息主题

    /// <summary>
            /// 获取一个<see cref="System.Xml.XmlDocument"/>对象,该对象表示消息的主体。
            /// </summary>
            public System.Xml.XmlDocument MessageXml { get { return myMessageXml; } }
    /// <summary>
            /// 根据指定的key获取主体中的文本值。
            /// </summary>
            /// <param name="key">要在主体中的获取文本值的key。</param>
            /// <returns></returns>
            protected virtual string ReadValue(string key) 
            {
                return MessageXml.SelectSingleNode(string.Format("/xml/{0}", key)).InnerText;
            }
    /// <summary>
            /// 初始化信息。
            /// </summary>
            protected virtual void Init() 
            {
                ToUserName=ReadValue("ToUserName");
                FromUserName = ReadValue("FromUserName");
                CreateTime =Convert.ToInt32(ReadValue("CreateTime"));
                Id = Convert.ToInt64(ReadValue("MsgId"));
            }
    /// <summary>
            /// 把接收到的信息转换成消息类。
            /// </summary>
            /// <param name="inputStream">收到的流。</param>
            /// <param name="encoding">流编码。</param>
            /// <returns>根据xml类型创建的<see cref="MessageBase"/>对象。</returns>
            public static MessageBase Parse(Stream inputStream, System.Text.Encoding encoding)
            {
                MessageBase message = null;
                var length = inputStream.Length;
                var bytes = new byte[length];
                inputStream.Read(bytes, 0, bytes.Length);
                var text = encoding.GetString(bytes);
                System.Xml.XmlDocument xmlMessage = new System.Xml.XmlDocument();
                xmlMessage.LoadXml(text);
                var msgTypeNode = xmlMessage.SelectSingleNode("/xml/MsgType");
                switch (msgTypeNode.InnerText)
                {
                    case "text": message = new TextMessage(xmlMessage); break;
                    case "image": message = new ImageMessage(xmlMessage); break;
                    case "location": message = new LocationMessage(xmlMessage); break;
                    case "link": message = new LinkMessage(xmlMessage); break;
                    case "event": message = new EventMessage(xmlMessage); break;
                }
                return message;
            }


    其实看完腾迅提供的说明文档后就觉得这个东西比较简单了,我这里不一一介绍了,我把源码和示例上传了,
     http://files.cnblogs.com/dotnet-org-cn/%E5%BE%AE%E4%BF%A1%E6%8E%A5%E5%8F%A3.rar

     测试微信公众平台账户

  • 相关阅读:
    关于地址添加 子窗体向父窗体传值 树的使用详细
    C# 常见面试题2
    微软2014实习生及秋令营技术类职位在线测试
    【面试题004】c/c++字符串,替换空格
    【面试题003】c数组做为参数退化的问题,二维数组中的查找
    【面试题001】类型转换关键字,空类对象模型,拷贝构造函数,赋值运算符函数
    【面试题002】java实现的单例模式,c++实现单例模式,实现禁止拷贝
    【设计模式6原则总结】
    【设计模式六大原则6】开闭原则(Open Close Principle)
    【设计模式六大原则5】迪米特法则(Law Of Demeter)
  • 原文地址:https://www.cnblogs.com/dotnet-org-cn/p/3163497.html
Copyright © 2011-2022 走看看