博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于C#的微信开发的入门记录一
阅读量:6293 次
发布时间:2019-06-22

本文共 5990 字,大约阅读时间需要 19 分钟。

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

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

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

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

  再次,还需要一个网站;

  一:,怎样注册网上有很详细的教程,;

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

这里就要讲到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);//测试        //响应        /*         *   
1348831860
1234567890123456
*/ 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 = "
" + "
" + "
" + "
" + GetCreateTime() + "
" + "
" + "
" + "
"; } else { string qita = "您现在还未进行绑定,请先回复【BD+学号+姓名】先进行绑定!"; xmlMsg = "
" + "
" + "
" + "
" + GetCreateTime() + "
" + "
" + "
" + "
"; } 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; } }}

主要是要参见;

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

转载于:https://www.cnblogs.com/zhankui/p/4515905.html

你可能感兴趣的文章
制作RPM包
查看>>
mysql多实例脚本
查看>>
python文件操作举例
查看>>
Outlook 2003命令行参数开关详解
查看>>
mysql中文乱码问题的解决方案
查看>>
Redhat7开机图形或文字界面
查看>>
Linux state 方式 安装nginx 服务
查看>>
LNMP(php-fpm的pool,慢执行日志,定义open_bashdir,php-fpm进程管理
查看>>
Flask rst 文档转换为html格式文件
查看>>
python 安装第三方库pygame
查看>>
Linux下的grep命令详解
查看>>
磁盘系统管理
查看>>
Linux下ftp+ssl实现ftps
查看>>
JavaScript基础
查看>>
Nginx之反向代理与负载均衡实现动静分离实战
查看>>
Object类型转换为long或者Long
查看>>
16位流应用与代码统计器例题
查看>>
linux内核中符号地址的获取
查看>>
内存对齐的问题
查看>>
分析动态代理给Spring事务埋下的坑
查看>>