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

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

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

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

  再次,还需要一个网站;

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

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

这里就要讲到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[];
string no = sArray[];
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,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 = "";
//自定义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;
}
} }

主要是要参见开发者文档

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

关于C#的微信开发的入门记录一的更多相关文章

  1. 续关于C#的微信开发的入门记录一

    前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...

  2. 关于C#的微信开发的入门记录二

    在准备了空间和域名之后,现在来讲讲我们接下来的编码过程: 今天就先到这里了!没有服务器那些的请看我之前的博客:http://www.cnblogs.com/zhankui/p/4515905.html ...

  3. 微信开发jssdk入门

    一个项目需要在微信里获得当前位置,于是就开始了我的微信开发之旅... 微信JSSDK说明文档http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9 ...

  4. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  5. 微信开发获取地理位置实例(java,非常详细,附工程源码)

    在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...

  6. 微信小程序入门与实战 常用组件API开发技巧项目实战*全

    第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...

  7. 微信小程序入门与实战 从0到1进行细致讲解 涵盖小程序开发核心技能下载

    第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...

  8. 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)

    微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...

  9. 微信小程序入门案例

    本文通过具体的实例记录微信小程序的入门知识. 1.特点 不需要安装 依赖微信应用 更接近原生APP 丰富的框架及API可达到快速开发的目的 2.工具使用 在开发的过程中可以使用微信开发者工具,更加直观 ...

随机推荐

  1. xpath 总结

    例如 <table id="MatchTable"> <tr id="Explain_1228761" style="display ...

  2. Spark on YARN的部署

    Spark on YARN的原理就是依靠yarn来调度Spark,比默认的Spark运行模式性能要好的多,前提是首先部署好hadoop HDFS并且运行在yarn上,然后就可以开始部署spark on ...

  3. markdownTest

    MARKDOWNTEST 11111111111111 有一种神奇的语言,它比html还简单,它巧妙地将内容与格式整合在一起--它就是Markdown 有一种神奇的语言,它比html还简单,它巧妙地将 ...

  4. Python之路,Day7 - Python基础7 面向对象

    本节内容:   面向对象编程介绍 为什么要用面向对象进行开发? 面向对象的特性:封装.继承.多态 类.方法.     引子 你现在是一家游戏公司的开发人员,现在需要你开发一款叫做<人狗大战> ...

  5. HTML5 绘制简单圆形 loading. . . .

    现在有很多的 loading 组件 什么js 等等 闲来没事就写一个 H5的 loading  有很多的Loading 是一张张图片 js 控制的  有了 canvas的 出现 你就可以体验不同之处了 ...

  6. Yii2 时间控件之把layDate做成widget

    实现效果如下 1.把layDate封装成Yii2的widget,存在 "\common\widgets"目录下,命名为DycLayDate,具体引用查看代码. 2.对应的model ...

  7. Photoshop 裁剪图片

    如图1选择裁剪工具,然后如图2点一下clear,就可以根据鼠标裁剪任意大小的图片

  8. Jmeter发送Java请求

    1.创建一个Java工程 2.把Jmeter的lib\ext目录下的ApacheJMeter_java.jar.ApacheJMeter_core.jar文件添加进该项目的Build Path 3.创 ...

  9. Google之Chromium浏览器源码学习——base公共通用库(一)

    Google的优秀C++开源项目繁多,其中的Chromium浏览器项目可以说是很具有代表性的,此外还包括其第三开发开源库或是自己的优秀开源库,可以根据需要抽取自己感兴趣的部分.在研究.学习该项目前的时 ...

  10. 数据库连接池c3p0学习

    这里只记录c3p0的数据源,不会涉及到其它方面和别的数据库连接池的对比 配置文件主要的实现方式有三种: 1.手写代码去加载一个配置文件 创建一个config.properties文件如下: drive ...