关于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[];
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#的微信开发的入门记录一的更多相关文章
- 续关于C#的微信开发的入门记录一
前几天写了一篇博客<关于C#的微信开发的入门记录一>,原文地址:http://www.cnblogs.com/zhankui/p/4515905.html,现在继续完善: 目前很多小伙伴都 ...
- 关于C#的微信开发的入门记录二
在准备了空间和域名之后,现在来讲讲我们接下来的编码过程: 今天就先到这里了!没有服务器那些的请看我之前的博客:http://www.cnblogs.com/zhankui/p/4515905.html ...
- 微信开发jssdk入门
一个项目需要在微信里获得当前位置,于是就开始了我的微信开发之旅... 微信JSSDK说明文档http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9 ...
- 转:微信开发获取地理位置实例(java,非常详细,附工程源码)
微信开发获取地理位置实例(java,非常详细,附工程源码) 在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...
- 微信开发获取地理位置实例(java,非常详细,附工程源码)
在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一些必要的配置,以及如何调用微信接口. 2.微信开发之通过代理调试 ...
- 微信小程序入门与实战 常用组件API开发技巧项目实战*全
第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...
- 微信小程序入门与实战 从0到1进行细致讲解 涵盖小程序开发核心技能下载
第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...
- 带领技术小白入门——基于java的微信公众号开发(包括服务器配置、java web项目搭建、tomcat手动发布web项目、微信开发所需的url和token验证)
微信公众号对于每个人来说都不陌生,但是许多人都不清楚是怎么开发的.身为技术小白的我,在闲暇之余研究了一下基于java的微信公众号开发.下面就是我的实现步骤,写的略显粗糙,希望大家多多提议! 一.申请服 ...
- 微信小程序入门案例
本文通过具体的实例记录微信小程序的入门知识. 1.特点 不需要安装 依赖微信应用 更接近原生APP 丰富的框架及API可达到快速开发的目的 2.工具使用 在开发的过程中可以使用微信开发者工具,更加直观 ...
随机推荐
- 解决mysql Table ‘xxx’ is marked as crashed and should be repaired的问题。
解决mysql Table 'xxx' is marked as crashed and should be repaired的问题. 某个表在进行数据插入和更新时突然出现Table 'xxx' is ...
- ArcGIS 10.1 BUG记录
声明:笔者使用ARCGIS 10.1 XXX版,YYY版可能没有此处描写的问题 1. 关于注册数据库 发布启用FA的服务,需要为数据库进行ArcGIS Server注册,若通过ArcMap执行注册,会 ...
- 那些PHP中没有全称的简写
PHP中的GD库,全网没发现GD二字母的全称是什么,包括PHP.net,都搜不到GD.G应该是graphi,D是什么? die: 从php_mysql.dll到php_mysqli的变化,那个i是什么 ...
- js_闭包
先从闭包特点解释,应该更好理解.闭包的两个特点:1.作为一个函数变量的一个引用 - 当函数返回时,其处于激活状态.2.一个闭包就是当一个函数返回时,一个没有释放资源的栈区.其实上面两点可以合成一点,就 ...
- c/c++ string
string类的定义.操作. #include<iostream> #include<string> using namespace std; int main() { // ...
- Linux 安装Mono环境 运行ASP.NET(二)
一.安装libgdiplus 前面我们已经安装了apr.apr_util.pcre和httpd apache .现在我们来安装libgdiplus Libgdiplus是一个Mono库,用于对 ...
- MySqlNDB使用自带的ndb_setup.py安装集群
在用Mysql做集群时,使用Mysql的NDB版本更易于集群的扩展,稳定和数据的实时性. 我们可以使用Mysql自带的工具进行集群安装与管理:ndb_setup.py.位于Mysql的安装目录bin下 ...
- 【疑难杂症系列01】TypeError: alert is not a function
一.背景 话说今天在调试js的时候,碰到一个很奇怪的问题,现记录一下.当使用alert()函数弹出提示时,总是报错,你没看错,alert函数报错了. 二.详细说明 当时正在做一个关于告警的页面展示功能 ...
- css sprite,css雪碧图生成工具V3.0更新
V3.0主要改进 1.增加了单独添加单张图片以及删除单张图片的功能 2.增加了生成.sprite文件用以保存雪碧图信息 3.增加了打开.sprite文件功能 什么是css sprite CSS spr ...
- js对象克隆方法
方法1: function clone(obj){ var o; switch(typeof obj){ case 'undefined': break; case 'string' : o = ob ...