首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

.net 微信接口(怎么使用微信接口-做过的请进)

2013-09-12 
.net 微信接口(如何使用微信接口--做过的请进)想做一个程序通过微信发信息。有人做过吗?是怎么实现的。 ----

.net 微信接口(如何使用微信接口--做过的请进)
想做一个程序通过微信发信息。
有人做过吗?是怎么实现的。 
-------------------------------------------------------------------
我找的参考代码,有人知道实现不步骤吗?
<%@ WebHandler Language="C#" CodeBehind="MessageReceiveHandler.ashx.cs" Class="MessageReceiveHandler" %>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Web.UI.HtmlControls;
using System.IO;
using Tencent.WeiXin;
    /// <summary>
    /// MessageReceiveHandler 的摘要说明
    /// </summary>
    public class MessageReceiveHandler : IHttpHandler
    {

        private static readonly string Token = "Opzoon-ITservice";
        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.RequestType == "GET")
            {
                if (CheckSignature(context))
                {
                    context.Response.Write(context.Request.QueryString["echostr"]);
                }
                return;
            }
            var messageBase=MessageBase.Parse(context.Request.InputStream, context.Request.ContentEncoding);
            Tencent.WeiXin.TextReplyMessage text = new Tencent.WeiXin.TextReplyMessage();
            text.Content = "我收到了";
            switch (messageBase.Type)
            {
                case MessageType.Text:
                    text.Content += string.Format("文本消息“{0}”",((TextMessage)messageBase).Content);break;


                case MessageType.Image:
                    text.Content += string.Format("图片消息“{0}”", ((ImageMessage)messageBase).PicUrl); break;
                case MessageType.Link:
                    text.Content += string.Format("链接消息“{0}”", ((LinkMessage)messageBase).Url); break;
                case MessageType.Location:
                    text.Content += string.Format("地图消息“X:{0}Y:{1}C{2}L{3}”", ((LocationMessage)messageBase).X,((LocationMessage)messageBase).Y,((LocationMessage)messageBase).Scale,((LocationMessage)messageBase).Label); break;
                case MessageType.Event:
                    text.Content += string.Format("时间推送消息“{0}”", ((EventMessage)messageBase).EventType); break;
            }
            text.Init(messageBase);
            text.Write(context.Response.Output);
            //context.Response.Write(mess.ToString());
            context.Response.ContentType = "text/xml";
            context.Response.Flush();
        }
        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"];
            //var signature = "testtesttest";
            return signature.Equals(sha1, StringComparison.OrdinalIgnoreCase);
        }
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
不是有接收用户信息么


[解决办法]
楼主的代码是用来接收的,不是发送的。
如果想通过电脑发出信息到对方手机的微信上。那么需要知道微信的通信协议和地址。否则连待接收手机的地址都不能知道,实现不了发送。另外微信的协议是加密的。
需要知道这些

[解决办法]
不管是消息推送还是消息回复都应该是xml把,我也没做过
[解决办法]
关注中,希望这个帖子有个好的结果!!
[解决办法]
前几天做这个了,.net 微信接口(怎么使用微信接口-做过的请进)
整体流程是:
1.用户发消息给微信服务器》2.微信服务器收到用户消息》3.微信服务器把消息发给你》4.你解析消息》5.返回给微信服务器》6.微信服务器发消息给用户
[解决办法]

        /// <summary>
        /// 处理文本消息
        /// </summary>
        /// <param name="xml"></param>
        /// <returns></returns>
        private static string DoTextMsg(XmlDocument xml)
        {
            //微信服务器发过来xml
            //TODO 取出内容
            string touser = xml.SelectSingleNode("xml/ToUserName").InnerText;
            string fromuser = xml.SelectSingleNode("xml/FromUserName").InnerText;
 
            //下面就是如何处理xml
            xml.SelectSingleNode("xml/ToUserName").InnerText = fromuser;//设置接受消息的用户
            xml.SelectSingleNode("xml/FromUserName").InnerText = touser;//消息来自谁
            xml.SelectSingleNode("xml/Content").InnerText = "这是回复的内容";//这里是你回复的内容,字符串的怎么写都可以
 
            return xml.OuterXml;//以字符串形式返回
        }

[解决办法]
恭喜了啊!!!
[解决办法]
看看大家是怎么说的
[解决办法]


公众平台接口,都是以xml形式回复,接口挂外网80端口可用,自己封装下扩展下
public partial class WebForm1 : System.Web.UI.Page
{
        const string Token = "*****";//与那边填写的token一致
        protected void Page_Load(object sender, EventArgs e)
        {
            string postStr = "";
            /// <summary>
            /// 处理微信发来的请求 
            /// </summary>
            /// <param name="xml"></param>
            if (Request.HttpMethod.ToLower() == "post")
            {
                Stream s = System.Web.HttpContext.Current.Request.InputStream;
                byte[] b = new byte[s.Length];
                s.Read(b, 0, (int)s.Length);
                postStr = Encoding.UTF8.GetString(b);

                if (!string.IsNullOrEmpty(postStr))
                {
                    //封装请求类
                    XmlDocument doc = new XmlDocument();
                    doc.LoadXml(postStr);
                    XmlElement rootElement = doc.DocumentElement;
                    XmlNode MsgType = rootElement.SelectSingleNode("MsgType");
                    RequestXML requestXML = new RequestXML();


                    requestXML.ToUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
                    requestXML.FromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
                    requestXML.CreateTime = rootElement.SelectSingleNode("CreateTime").InnerText;
                    requestXML.MsgType = MsgType.InnerText;
                    try
                    {
                        requestXML.Event = rootElement.SelectSingleNode("Event").InnerText;
                    }
                    catch 
                    {

                    }
                    

                    if (requestXML.MsgType == "text")
                    {
                        requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
                    }
                    else if (requestXML.MsgType == "location")
                    {
                        requestXML.Location_X = rootElement.SelectSingleNode("Location_X").InnerText;


                        requestXML.Location_Y = rootElement.SelectSingleNode("Location_Y").InnerText;
                        requestXML.Scale = rootElement.SelectSingleNode("Scale").InnerText;
                        requestXML.Label = rootElement.SelectSingleNode("Label").InnerText;
                    }
                    else if (requestXML.MsgType == "image")
                    {
                        requestXML.PicUrl = rootElement.SelectSingleNode("PicUrl").InnerText;
                    }
                    //else if (requestXML.MsgType == "Event") 
                    //{
                    //    // 事件类型  
                    //    String eventType = requestXML.Event;
                    //    // 订阅  
                    //    if (eventType == "Subscribe")
                    //    {

                    //        //Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));

                    //    }


                    //    // 取消订阅  
                    //    else if (eventType =="Unsubscribe")
                    //    {
                    //        // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息  
                    //    }
                    //    // 自定义菜单点击事件  
                    //    else if (eventType =="CLICK")
                    //    {
                    //        // TODO 自定义菜单权没有开放,暂不处理该类消息  
                    //    }  
                    //}
                    else if (requestXML.MsgType =="Event")
                    {
                        // 事件类型    
                        String eventType = requestXML.Event;
                        // 订阅    
                        if (eventType == "Subscribe")
                        {



                            //Response.Write(GetMainMenuMessage(toUserName, fromUserName, "谢谢您的关注!,"));
                            requestXML.Content = rootElement.SelectSingleNode("Content").InnerText;
                        }
                        // 取消订阅    
                        else if (eventType == "Unsubscribe")
                        {
                            // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息    
                        }
                        // 自定义菜单点击事件    
                        else if (eventType == "CLICK")
                        {
                            // TODO 自定义菜单权没有开放,暂不处理该类消息    
                        }
                    }  

                    //回复消息
                    ResponseMsg(requestXML);
                }


            }
            else
            {
                Valid();
            }
        }

        /// <summary>
        /// 验证微信签名
        /// </summary>
        /// * 将token、timestamp、nonce三个参数进行字典序排序
        /// * 将三个参数字符串拼接成一个字符串进行sha1加密
        /// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
        /// <returns></returns>
        private bool CheckSignature()
        {
            string signature = Request.QueryString["signature"];
            string timestamp = Request.QueryString["timestamp"];
            string nonce = Request.QueryString["nonce"];
            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;


            }
        }
        public static bool CheckSignature(String signature, String timestamp, String nonce)
        {
            String[] arr = new String[] { Token, timestamp, nonce };
            // 将token、timestamp、nonce三个参数进行字典序排序  
            Array.Sort<String>(arr);

            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.Length; i++)
            {
                content.Append(arr[i]);
            }

            String tmpStr = SHA1_Encrypt(content.ToString());


            // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信  
            return tmpStr != null ? tmpStr.Equals(signature) : false;
        }

        /// <summary>
        /// 使用缺省密钥给字符串加密
        /// </summary>
        /// <param name="Source_String"></param>
        /// <returns></returns>
        public static string SHA1_Encrypt(string Source_String)
        {
            byte[] StrRes = Encoding.Default.GetBytes(Source_String);
            HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
            StrRes = iSHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();


            foreach (byte iByte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", iByte);
            }
            return EnText.ToString();
        }
        private void Valid()
        {
            //// 微信加密签名  
            //string signature = Request.QueryString["signature"];
            //// 时间戳  
            //string timestamp = Request.QueryString["timestamp"];
            //// 随机数  
            //string nonce = Request.QueryString["nonce"];
            //// 随机字符串  
            //string echostr = Request.QueryString["echostr"];
            string echoStr = Request.QueryString["echoStr"];
            if (CheckSignature())
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    Response.Write(echoStr);
                    Response.End();
                }
            }
        }

        /// <summary>
        /// 回复消息(微信信息返回)
        /// </summary>


        /// <param name="weixinXML"></param>
       
[解决办法]
 //微信请求类
    public class RequestXML
    {
        private string toUserName;
        /// <summary>
        /// 消息接收方微信号,一般为公众平台账号微信号
        /// </summary>
        public string ToUserName
        {
            get { return toUserName; }
            set { toUserName = value; }
        }

        private string fromUserName;
        /// <summary>
        /// 消息发送方微信号
        /// </summary>
        public string FromUserName
        {
            get { return fromUserName; }
            set { fromUserName = value; }
        }

        private string createTime;
        /// <summary>
        /// 创建时间
        /// </summary>
        public string CreateTime
        {
            get { return createTime; }
            set { createTime = value; }
        }

        private string msgType;
        /// <summary>
        /// 信息类型 地理位置:location,文本消息:text,消息类型:image
        /// </summary>


        public string MsgType
        {
            get { return msgType; }
            set { msgType = value; }
        }

        private string content;
        /// <summary>
        /// 信息内容
        /// </summary>
        public string Content
        {
            get { return content; }
            set { content = value; }
        }

        private string location_X;
        /// <summary>
        /// 地理位置纬度
        /// </summary>
        public string Location_X
        {
            get { return location_X; }
            set { location_X = value; }
        }

        private string location_Y;
        /// <summary>
        /// 地理位置经度
        /// </summary>
        public string Location_Y
        {
            get { return location_Y; }
            set { location_Y = value; }
        }

        private string scale;
        /// <summary>
        /// 地图缩放大小
        /// </summary>


        public string Scale
        {
            get { return scale; }
            set { scale = value; }
        }

        private string label;
        /// <summary>
        /// 地理位置信息
        /// </summary>
        public string Label
        {
            get { return label; }
            set { label = value; }
        }

        private string picUrl;
        /// <summary>
        /// 图片链接,开发者可以用HTTP GET获取
        /// </summary>
        public string PicUrl
        {
            get { return picUrl; }
            set { picUrl = value; }
        }

        private string _event;

        public string Event
        {
            get { return _event; }
            set { _event = value; }
        }
    }
[解决办法]
路过啊。.net 微信接口(怎么使用微信接口-做过的请进)
[解决办法]
mark下,来学习下了。

热点排行