• 关于C#的微信开发的入门记录一


      在之前老是看到一些微信开发的例子,但是作为初学者会有很多问题,之前我也找了很多帖子,但是最终也没能解决,现在刚好手里有一个项目,总结一下分享给准备做却动不了手的朋友们,本文只是以我个人的经验作为浅谈(大学生),不足之处还望大家不吝赐教!

      在开发之前我们需要有三样东西,接下来将一一介绍三样东西的准备:

      首先,需要申请一个公众平台账号;

      其次,需要一个域名空间,也就是在网络上得一块空间;

      再次,还需要一个网站;

      一:微信公众平台账号,怎样注册网上有很详细的教程,请移步查看

      然后问题来了,请仔细查看下图(为了方便解说,图片经过处理):

    这里就要讲到URL和token了,根据官方的活动日期为准,这里推荐一下万网和阿里云合作推出的两年免费云主机和虚拟域名,对,没错就是我们需要的东西,我也不是在打广告,毕竟学生党,经费比较拮据,能用免费的尽量用不,扯远了,活动地址为:http://www.net.cn/hosting/free/,按照要求去做就可以了,很简单的,也不多说,不过需要注意的是:免费版不提供电话服务,如自开通后连续60天内,未进行备案、域名绑定及解析,该虚机将被收回并删除。这个比较坑爹,毕竟天下没有免费的午餐,还是买个域名吧,也就20多一点(最便宜的);

    又到了关键地方了:

    上面的那个域名是我自己买的,下面的你们也看到了,虚拟主机赠送的免费版,不过也可以用;

    好了,准备工作要收尾了,现在就是代码的事情了;

    首先:

    在开发者首次提交验证申请时,微信服务器将发送GET请求到填写的URL上,并且带上四个参数(signature、timestamp、nonce、echostr),开发者通过对签名(即signature)的效验,来判断此条消息的真实性。

    此后,每次开发者接收用户消息的时候,微信也都会带上前面三个参数(signature、timestamp、nonce)访问开发者设置的URL,开发者依然通过对签名的效验判断此条消息的真实性。效验方式与首次提交验证申请一致。

    参数描述
    signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
    timestamp 时间戳
    nonce 随机数
    echostr 随机字符串

    开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。

    加密/校验流程如下:
    1. 将token、timestamp、nonce三个参数进行字典序排序
    2. 将三个参数字符串拼接成一个字符串进行sha1加密
    3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

    所以:
    <%@ WebHandler Language="C#" Class="Handler" %>
    
    using System;
    using System.Web;
    using System.Web.Security;
    using System.IO;
    using System.Xml;
    using System.Configuration;
    using System.Data.SqlClient;
    using System.Data;
    
    
    public class Handler : IHttpHandler
    {
        //private static string msg;
        private static string xmlMsg;
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            if (context.Request.HttpMethod.ToLower().Equals("get"))
            {
                //开发者通过检验signature对请求进行校验(下面有校验方式)。
                //若确认此次GET请求来自微信服务器,请原样返回echostr参数内
                //容,则接入生效,成为开发者成功,否则接入失败。 
                //context.Response.Write(msg);
                ValidateUrl();
                //用于微信接口的URL校验
            }
            else
            {
                //接收并响应
                HandleMsg();
            }
        }
    
        private void HandleMsg()
        {
            //接收
            /*
             *  ToUserName     开发者微信号
                FromUserName     发送方帐号(一个OpenID)
                CreateTime     消息创建时间 (整型)
                MsgType     text
                Content     文本消息内容
                MsgId     消息id,64位整型 
            */
            HttpContext context = HttpContext.Current;
            //接收XML数据包
            Stream XmlStream = context.Request.InputStream;
            //构造xml对象
            XmlDocument doc = new XmlDocument();
            doc.Load(XmlStream);
            XmlElement rootElement = doc.DocumentElement;//获取根节点
    
            //解析XML数据
            string toUserName = rootElement.SelectSingleNode("ToUserName").InnerText;
            string fromUserName = rootElement.SelectSingleNode("FromUserName").InnerText;
            string msgType = rootElement.SelectSingleNode("MsgType").InnerText;
            //消息内容区分  这里是文本,为text
            string content = rootElement.SelectSingleNode("Content").InnerText;
            //msg = string.Format("{0}-{1}-{2}-{3}", toUserName, fromUserName, msgType, content);//测试
            //响应
            /*
             *   <xml>
                 <ToUserName><![CDATA[toUser]]></ToUserName>
                 <FromUserName><![CDATA[fromUser]]></FromUserName> 
                 <CreateTime>1348831860</CreateTime>
                 <MsgType><![CDATA[text]]></MsgType>
                 <Content><![CDATA[this is a test]]></Content>
                 <MsgId>1234567890123456</MsgId>
                 </xml>
             */
    
            if (content.Contains("BD") || content.Contains("bd"))
            //content.Contains返回一个值,该值指示指定的system.string对象是否存在于此字符串中
            {
                string[] sArray = content.Split('+');
                string name = sArray[2];
                string no = sArray[1];
                string str = "您的信息为:" + "姓名:" + name + "学号:" + no;
                //SelectStudentInfo();
                
                xmlMsg = "<xml>" + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                           + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                           + "<CreateTime>" + GetCreateTime() + "</CreateTime>"
                           + "<MsgType><![CDATA[text]]></MsgType>"
                           + "<Content><![CDATA["+str+"]]></Content>"
                           + "</xml>";
            }
            else
            {
                string qita = "您现在还未进行绑定,请先回复【BD+学号+姓名】先进行绑定!";
                xmlMsg = "<xml>" + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                           + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                           + "<CreateTime>" + GetCreateTime() + "</CreateTime>"
                           + "<MsgType><![CDATA[text]]></MsgType>"
                           + "<Content><![CDATA[" + qita + "]]></Content>"
                           + "</xml>";
            }
    
            context.Response.Write(xmlMsg);
        }
    
        //private string SelectStudentInfo()
        //{
            
        //}
    
        private int GetCreateTime()//创建时间戳
        {
            DateTime dateStart=new DateTime(1970,1,1,8,0,0);//格林威治时间1970,1,1,0,0,0
            return (int) (DateTime.Now - dateStart).TotalSeconds;
        }
        
        
        private void ValidateUrl()
        {
            /*
             *  signature     微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
                timestamp     时间戳
                nonce         随机数
                echostr     随机字符串 
             */
            HttpContext context = HttpContext.Current;
            //获取上下文对象
            string signature = context.Request["signature"];
            string timestamp = context.Request["timestamp"];
            string nonce = context.Request["nonce"];
            string echostr = context.Request["echostr"];
    
            string token = "123456";
            //自定义token
            //加密/校验流程如下:
    
            string[] temp1 = { token, timestamp, nonce };
            //1. 将token、timestamp、nonce三个参数进行字典序排序
            Array.Sort(temp1);//排序
            //2. 将三个参数字符串拼接成一个字符串进行sha1加密
            string temp2 = string.Join("", temp1);
            string temp3 = FormsAuthentication.HashPasswordForStoringInConfigFile(temp2, "SHA1");
    
            //3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
            //SHA1有大小写区别,先转成小写再对比
            if (temp3.ToLower().Equals(signature))
            {
                context.Response.Write(echostr);
                //如果相同就返回微信服务器要求的signature,不相同就没有必要处理
            }
        }
        
    
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    
    }

    主要是要参见开发者文档

    好了,剩下的就是发布到服务器上就好了。

  • 相关阅读:
    搭建中文分词工具——递归方法
    (五)django上传文件并读取相应数据存入数据库
    (四)django上传文件并读取存入数据库
    Django中的外键赋值
    (二)Django连接本地mysql异常
    (一)环境搭建——Django
    论文阅读笔记:《Interconnected Question Generation with Coreference Alignment and Conversion Flow Modeling》
    AWS EC2 CentOS release 6.5 部署redis
    2016年简直一晃而过
    Android开发学习之路--性能优化之布局优化
  • 原文地址:https://www.cnblogs.com/zhankui/p/4515905.html
Copyright © 2020-2023  润新知