微信二次开发!

来源:互联网 发布:如何解除冻结淘宝封号 编辑:程序博客网 时间:2024/05/16 07:26

       本人第一次写博客,看见许多大神都在写博客,我只是一个很笨的菜鸟程序员,但是我相信,自己有一天总会变的很厉害!那么就从写博客开始吧,我的经验只适合初学者,让他们少走很多歩!前段时间公司让我做一个微信的二次开发,以前从来没有弄过,发现无从下手!下面我从接到这个任务时,自己做的一些事情,我是用C#写!

1)第一天疯狂的在网上查询资料,也没有看出什么名堂。第二天有点了解了,原来要有一个自己的服务器或者别人的服务器空间,把自己的程序发布上去,就是像访问自己或者别人的网站一样,在有网络的地方情况都能访问。

2)如何发布一个Asp.net 网址了,首先,我在本地打包好,在把打包好的文件夹拷贝到服务器上去,如果打包了,我百度了很久,看很少有人能够说清楚的,我就自己上图吧:



目标位置选择自己找的到的位置,然后点击发布就可以了!然后拷贝到服务器上去就可以了!


3)我虽然做过Asp.net 但是我从来没有自己配置我IIS,发不过网站。发布网站对一个初学者而言是比较痛苦的,各种报错啊,只好自己百度,在此过程中也请以前的同事帮忙过,但是没有解决,自己不知道百度过多少,才找出原因!在这里总结一下:

1)现在好多项目都是vs2010以上开发,它的框架是.net4.0,而IIS中默认好像只有.net2.0,这时候你要自己添加,怎么添加我就不说,可以百度!

2)应用程序池中的asp.net v4.0,asp.net v4.0 Classic 没有启动如图:


3)如果网站是.net4.0,单击右键->管理网站->高级设置->应用池->asp.net v4.0net 

4)最重要一点可以不容易发现直接上图



如果把以上这些注意了,应该没有什么问题了,如果有问题自己百度应该可以解决了!这个只是我首先要了解的一个发布网站的过程!

    接下来我就要自己开发微信了,在微信有一个开发管理平台,用来测试开发的,网址为:http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,自己登陆自己微信

然后扫描二维码,就可以进入了!在里面就有开发过程要的参数!

登陆成功后,出现这个界面,以下只是部分页面


 这个里面的URL,填写就是发布网站服务器的网页程序的地址:如:http://205.195.177.32/,微信接口开发规定,网站的端口必须是80.一般在微信开发中处理微信的响应是使用*.ashx一般处理程序就可以了。在发布网站中把这个页面设置为默认启动页!

可以首先去微信的调试页面试一下:http://mp.weixin.qq.com/debug/

接下来是写程式了:

  用VS2010或者其他版本建立一个Asp.net 应用网站,删除不用的Default.aspx其他页面,自己单击项目添加一个一般应用程序,*.ashx程序。如果没有接触过,自己可以百度一下,然后去写。我的代码大部分改写前辈们的,这样节少了不少时间。如下直接给代码:

 public class interfaceTest : IHttpHandler
    {
        
        public void ProcessRequest(HttpContext param_context)
        {
           
            string token = ConfigurationManager.AppSettings["WeixinToken"];
            string postString = string.Empty;
            if (HttpContext.Current.Request.HttpMethod.ToUpper() == "POST")
            {
                
                using (Stream stream = HttpContext.Current.Request.InputStream)
                {
                    
                    Byte[] postBytes = new Byte[stream.Length];
                    stream.Read(postBytes, 0, (Int32)stream.Length);
                    postString = Encoding.UTF8.GetString(postBytes);


                    if (!string.IsNullOrEmpty(postString))
                    {
                       
                        HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;
                        Handle(postString);


                    }
                }


            }
            else
            {
                Log.WriteLog("1");
                Valid(token);
                
            }
         
        }


        /// <summary>
        /// 处理信息并应答
        /// </summary>
        private void Handle(string postStr)
        {
            messageHelp help = new messageHelp();
            help.ReturnMessage(postStr);
            Log.WriteLog("Handle='"+postStr+"'");
           
            
        }


       


        //验证Token
        public static bool CheckSignature(string token)
        {


            string signature = System.Web.HttpContext.Current.Request.QueryString["signature"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["signature"].Trim();


            string timestamp = System.Web.HttpContext.Current.Request.QueryString["timestamp"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["timestamp"].Trim();
            string nonce = System.Web.HttpContext.Current.Request.QueryString["nonce"] == null ? "" : System.Web.HttpContext.Current.Request.QueryString["nonce"].Trim();


            string[] arrTmp = { token, timestamp, nonce };
            Array.Sort(arrTmp);
            string tmpStr = string.Join("", arrTmp);
            tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");//对该字符串进行sha1加密
            tmpStr = tmpStr.ToLower();//对字符串中的字母部分进行小写转换,非字母字符不作处理
            Log.WriteLog("checkSignature temStr=" + tmpStr);
            Log.WriteLog(" CheckSignature Signature=" + signature);
            return tmpStr == signature; //开发者获得加密后的字符串可与signature对比


        }


        #region 第一次接入时验证


        /// <summary>
        /// 第一次接入时验证
        /// </summary>
        /// <param name="token">用户在公众平台填写的token</param>
        public static void Valid(string token)
        {
            Log.WriteLog("echoStr=" + System.Web.HttpContext.Current.Request.QueryString["echoStr"]);
            if (System.Web.HttpContext.Current.Request.QueryString["echoStr"] == null)
            {
                System.Web.HttpContext.Current.Response.Write("Null");
                System.Web.HttpContext.Current.Response.End();
                return;
            }
            string echoStr = System.Web.HttpContext.Current.Request.QueryString["echoStr"].ToString();
            if (CheckSignature(token))
            {
                if (!string.IsNullOrEmpty(echoStr))
                {
                    System.Web.HttpContext.Current.Response.Write(echoStr);
                    System.Web.HttpContext.Current.Response.End();
                    return;
                }
            }
            else
            {
                System.Web.HttpContext.Current.Response.Write(System.Guid.NewGuid().ToString());
                System.Web.HttpContext.Current.Response.End();
            }
        }
        #endregion
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }


里面的 string token = ConfigurationManager.AppSettings["WeixinToken"]; 我是把Token 放在了配置文件web.config中了,如果不懂怎么加,自己百度。

里面的 这个函数用来处理用户发过来的消息,微信公众号做出的回应。在初次写的时候容易报错,建议写日志,记录错误的地方!

private void Handle(string postStr)
        {
            messageHelp help = new messageHelp();
            help.ReturnMessage(postStr);
            Log.WriteLog("Handle='"+postStr+"'");
        }

以下是Log日志的类:

  public class Log
    {
        public static  void WriteLog(string text)
        {


            string Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "日志";
            try
            {
                
                        if (Directory.Exists(Path))
                        {
                            String LogText = Path + "\\" + DateTime.Now.ToLongDateString() + ".txt";
                            FileInfo fileinfo = new FileInfo(LogText);
                            if (!fileinfo.Exists)
                            {
                                FileStream filestream = File.Create(LogText);
                                filestream.Flush();
                                filestream.Close();
                            }
                            StreamWriter streamwrite = new StreamWriter(LogText, true, Encoding.GetEncoding("GB2312"));
                            streamwrite.WriteLine("<<["+DateTime.Now.ToLocalTime()+"]>> " +text);
                            streamwrite.Flush();
                            streamwrite.Close();
                        }
                        else
                        {
                            Directory.CreateDirectory(Path);
                            String LogText = Path + "\\" + DateTime.Now.ToLongDateString() + ".txt";
                            FileStream filestream = File.Create(LogText);
                            filestream.Flush();
                            filestream.Close();
                            StreamWriter streamwrite = new StreamWriter(LogText, false, Encoding.GetEncoding("GB2312"));
                            streamwrite.WriteLine("<<["+DateTime.Now.ToLocalTime()+"]>> "+text);
                            streamwrite.Flush();
                            streamwrite.Close();
                        }
                    
            }
            catch (Exception Ts)
            {
                HttpContext.Current.Response.Write("对发生的错误表示抱歉!请联系:管理员,阐述发生错误时的具体操作过程和错误序号!" + Ts.ToString());
            }
            finally
            {


            }


        }
    }


接下来讲解messageHelp help = new messageHelp();类,这个类中主要处理用户发过来的消息,接收的消息为XML数据包可以查看网址:http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html

以下为代码:

 public class messageHelp
    {
        //返回消息
        public void ReturnMessage(string postStr)
        {
           // string responseContent = "";
            XmlDocument xmldoc = new XmlDocument();
            xmldoc.Load(new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(postStr)));
            XmlNode MsgType = xmldoc.SelectSingleNode("/xml/MsgType");
            if (MsgType!=null)
            {
                switch (MsgType.InnerText)
                {
                    case "event": 
                        EventHandle(xmldoc);  //事件
                        break;
                    case "text":         
                        TextHandle(xmldoc);//文本
                        break;
                    case "image":
                        Log.WriteLog("Image");
                        //responseContent = ImageHandle(xmldoc);//图片
                        ImageHandle(xmldoc);
                        //responseContent = "无法响应!";
                        break;
                    case "voice":
                        //responseContent = VoiceHandle(xmldoc);//接收声音消息处理
                        VoiceHandle(xmldoc);
                        break;
                    case "location":

//地理位置处理
                        LocationHandle(xmldoc);
                        break;
                        
                    default:
                        break;
                }
            }
           // return responseContent;
        }

   //接受文本消息
        public void  TextHandle(XmlDocument xmldoc)
        {
            string responseContent = "";
            XmlNode ToUserName = xmldoc.SelectSingleNode("/xml/ToUserName");
            XmlNode FromUserName = xmldoc.SelectSingleNode("/xml/FromUserName");
            XmlNode Content = xmldoc.SelectSingleNode("/xml/Content");
            Log.WriteLog(ToUserName.InnerText);
            Log.WriteLog(FromUserName.InnerText);
            Log.WriteLog(Content.InnerText);
            if (Content != null)
            {
                if (Content.InnerText.Trim() == "?")
                {
                    responseContent = string.Format(ReplyType.Message_Text,
                   FromUserName.InnerText,
                   ToUserName.InnerText,
                   DateTime.Now.Ticks,
                   "请问您需要什么帮助");
                }
                else if (Content.InnerText == "1")
                {
                    responseContent = string.Format(ReplyType.Message_Text,
                   FromUserName.InnerText,
                   ToUserName.InnerText,
                   DateTime.Now.Ticks,
                   "哈哈哈");
                }
                
                else
                {
                    responseContent = string.Format(ReplyType.Message_Text,
                        FromUserName.InnerText,
                        ToUserName.InnerText,
                        DateTime.Now.Ticks,


                        "欢迎
来到***科技有限公司,您输入的内容为:" + Content.InnerText + "\r\n<a href=\"www.baidu.com">点击进入</a>");
                }
            }
            //return responseContent;
            HttpContext.Current.Response.ContentEncoding = Encoding.UTF8;


            HttpContext.Current.Response.Write(responseContent);
        }
           
}

 //回复类型
    public class ReplyType
    {
        /// <summary>
        /// 普通文本消息
        /// </summary>
        public static string Message_Text
        {
            get { return @"<xml>
                            <ToUserName><![CDATA[{0}]]></ToUserName>
                            <FromUserName><![CDATA[{1}]]></FromUserName>
                            <CreateTime>{2}</CreateTime>
                            <MsgType><![CDATA[text]]></MsgType>
                            <Content><![CDATA[{3}]]></Content>
                            </xml>"; }
        }
        /// <summary>
        /// 图文消息主体
        /// </summary>
        public static string Message_News_Main
        {
            get
            {
                return @"<xml>
                            <ToUserName><![CDATA[{0}]]></ToUserName>
                            <FromUserName><![CDATA[{1}]]></FromUserName>
                            <CreateTime>{2}</CreateTime>
                            <MsgType><![CDATA[news]]></MsgType>
                            <ArticleCount>{3}</ArticleCount>
                            <Articles>
                            {4}
                            </Articles>
                            </xml> ";
            }
        }
        /// <summary>
        /// 图文消息项
        /// </summary>
        public static string Message_News_Item
        {
            get
            {
                return @"<item>
                            <Title><![CDATA[{0}]]></Title> 
                            <Description><![CDATA[{1}]]></Description>
                            <PicUrl><![CDATA[{2}]]></PicUrl>
                            <Url><![CDATA[{3}]]></Url>
                            </item>";
            }
        }


        public static string Message_Image
        {
            get
            {
                return @"<xml>
                            <ToUserName><![CDATA[{0}]]></ToUserName>
                            <FromUserName><![CDATA[{1}]]></FromUserName>
                            <CreateTime>{2}</CreateTime>
                            <MsgType><![CDATA[image]]></MsgType>
                            <Image>
                            <MediaId><![CDATA[{3}]]></MediaId>
                            </Image>
                            </xml>";
            }
        }


        public static string Message_Voice
        {
            get
            {
                return @"<xml>
                    <ToUserName><![CDATA[{0}]]></ToUserName>
                    <FromUserName><![CDATA[{1}]]></FromUserName>
                    <CreateTime>{2}</CreateTime>
                    <MsgType><![CDATA[voice]]></MsgType>
                    <Voice>
                    <MediaId><![CDATA[{3}]]></MediaId>
                    </Voice>
                    </xml>";
            }
        }
    }

以上就是就可以运行了!

以上只是一部分,有时间再写!

1 0
原创粉丝点击