返回说明
正常情况下,JSON数据包:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
图3-2 token成功返回参数图
错误时JSON数据包举例:
{"errcode":40013,"errmsg":"invalid appid"}
3.2 接收消息接口
3.2.1 验证消息真实性
开发中第一次提交验证申请时,微信会发送GET请求到用户提供的URL上,加上(signature、timestamp、nonce、echostr)四个参数,开发时通过对签名(即signature)效验,判断消息真实性。
然后,每次开发者接收用户消息的时候,微信服务器会带上前面三个参数(signature、timestamp、nonce)访问提供的URL,此时还是通过对签名的效验来判断此条消息是否真实。
图3-3 验证消息参数图
本设计检验signature的代码:
/// <summary>
/// 验证微信签名
/// </summary>
/// <returns></returns>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密文献综述
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
private bool CheckSignature()
{
string WeChat_Token = "";
string WeChat_Key = Request.QueryString["key"];
DataTable dtWeChat = wechatdal.GetList("wechat_key='" + WeChat_Key + "'").Tables[0];
if (dtWeChat.Rows.Count > 0)
{
WeChat_Token = dtWeChat.Rows[0]["wechat_token"].ToString();
}
string signature = Request.QueryString["signature"];
string timestamp = Request.QueryString["timestamp"];
string nonce = Request.QueryString["nonce"];
string[] ArrTmp = { WeChat_Token, timestamp, nonce };
Array.Sort(ArrTmp); //字典排序
string tmpStr = string.Join("", ArrTmp);//串联字符串数组?
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
tmpStr = tmpStr.ToLower();
if (tmpStr == signature)
{
return true;
}
else
{
return false;
}
}
3.2.2 接收普通消息
当粉丝向用户的公众账号发消息时,微信将POST消息的XML数据包发送到指定的URL上。各种消息类型推送XML数据包的结构如下: