要想做微信开发,首先您得有台自己的服务器;当然,您也可以租用服务器,如万网的云服务器或云虚拟主机(不加个“云”都不好意思拿出来说,呵呵),X3型虚拟主机也就88¥/年;亦或是阿里的ECS,免费半年(不过没有带宽不分配公网IP,自己得另外花钱卖)。 以上不是广告,只是本人一直再用而已。总之一句话,有台能部署网站并且能在外网访问的服务器就行。
1、准备接口配置信息
A、服务器URL
该URL用于开发者接入时微信验证的GET请求地址,后继普通用户通过您的微信公众账号发送的信息或各种操作产生的事件,微信服务器也会转发并POST到这个URL上。这样您就可以根据不同的消息类型做URL路由,分别处理不同的消息或事件。要注意的是,目前只支持http方式,不支持https方式,而且只支持默认的80端口。
B、Token字符串
Token是用来生成签名的一个字符串,您可以随便填写(必须是英文字母或数字,最少3个字符,最多32个字符),只要你验证微信加密签名有效性时使用这个Token就可以了。它生成微信加密签名的一个参数,主要用于验证接入的安全性。
提示:如果您用的是测试号,配置上述信息即可;但如果是正式开发中,微信最新的要求还需要填写“消息加密密钥”并选择“消息加解密方式”。
C、消息加密密钥
消息加密密钥(EncodingAESKey)是微信最新的要求,其由43个字符组成,你可以自己手动填写,也可以点击“随机生成”。消息加密密钥只能是英文字母或数字,它的作用是“给消息体加密和解密”。
D、消息加解密方式
消息加解密的方式有三种,即“明文方式”、“兼容模式”和“安全模式”。
明文模式下消息加密密钥就废了,消息体不会使用上述密钥进行加密,安全系统较低;
兼容模式主要用于开发者调试程序,此时明明文和密文共同存在;
安全模式是微信推荐使用的方式,消息体被加密成纯密文,安全系统较高,但开发者需要自己加密和解密。
2、编写响应微信GET请求的代码
A、判断GET请求
///
/// 开发者指定的Token
///
const string token = "test";
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
switch (context.Request.HttpMethod)
{
case "GET":
//接入成功后可以注释此行
//JoinWeixin(context);
break;
case "POST":
//解析微信请求的XML消息文档
ParseXmlDocument(context);
break;
default:
context.Response.Write("不支持" + context.Request.HttpMethod + "方式!");
break;
}
context.Response.End();
}
B、验证微信签名有效性
///
/// 验证微信加密签名有效性
/// 加密/校验流程如下:
/// 1. 将token、timestamp、nonce三个参数进行字典序排序
/// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
/// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
///
///
/// 微信加密签名
/// signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
///
/// 时间戳
/// 随机数
///
private bool CheckSignature(string signature, string timestamp, string nonce)
{
string[] tmpArr = { token, timestamp, nonce };
Array.Sort(tmpArr);
string tmpStr = string.Join("", tmpArr);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
return tmpStr == signature;
}
C、原样返回echostr参数
///
/// 接入微信
/// 返回echostr参数内容,则接入生效,否则接入失败。
///
///
private void JoinWeixin(HttpContext context)
{
string signature = context.Request.QueryString["signature"];
string timestamp = context.Request.QueryString["timestamp"];
string nonce = context.Request.QueryString["nonce"];
string echostr = context.Request.QueryString["echostr"];
if (CheckSignature(signature, timestamp, nonce))
{
if (!string.IsNullOrEmpty(echostr))
{
context.Response.Write(echostr);
}
else
{
context.Response.Write("随机字符串为空!");
}
}
else
{
context.Response.Write("微信加密签名验证失败!");
}
context.Response.End();
}
3、配置页面提交申请
完成上述代码编写并部署到您的服务器后,您就可以在微信公众平台“开发者中心”->“配置项”中填写上述准备好的接口配置信息,然后点击“提交”按钮将配置信息提交给微信服务器。微信服务器收到信息之后,会向您提交的URL地址发送一条GET请求。该请求携带了四个参数,下面是用C#在一般处理程序(ashx)中获取参数的代码:
string signature = context.Request.QueryString["signature"];
string timestamp = context.Request.QueryString["timestamp"];
string nonce = context.Request.QueryString["nonce"];
string echostr = context.Request.QueryString["echostr"];
拿到这些参数后,结合您自己设置的Token,您就可以根据微信提供的算法进行验证。具体算法如下:
a、将token、timestamp、nonce三个参数进行字典序排序;
b、 将三个参数字符串拼接成一个字符串进行sha1加密;
c、开发者获得加密后的字符串可与signature对比,标识该请求来源于微信;
A、您算出来的签名字符串
(token, timestamp, nonce)->您算出来的签名字符串
B、比较两个签名字符串
if(您算出来的签名字符串 == signature)
C、原样返回随机字符串
return echostr
当您提交验证通过之后,那么恭喜您,您的服务器就已经成功接入微信服务器,您也就成为了微信开发者。接下来就可以根据微信提供的接口,处理各种微信服务器转发过来的消息和事件了。后继文章将会进行详细介绍,敬请期待!