【微信公众号入“坑”:①】
前期准备
废话不多说,只想通过自己在开发过程中遇到的一些问题,提供给想要入手开发的微信公众号开发的人一些帮助(如遇大神,请指出不妥之处)。
首先,需要一个认证过的公众号,本系列文章以已通过认证的服务号为例。如果没有,也可以通过申请测试账号进行开发。
测试账号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login&token=&lang=zh_CN。
为了方便在开发过程中进行调试,推荐使用花生壳进行内网穿透。
一、服务器配置
登录微信公众平台,开发-基本配置-服务器配置。
在点击提交时,微信会通过我们配置的URL进行加密验证,所以需要我们在后台服务器进行解密验证
public class WechatController : PublicController
{
//log4net.ILog log = log4net.LogManager.GetLogger("LogInfo");
/// <summary>
/// 微信回调地址
/// </summary>
public void WeChatCallback()
{
//log.Info("微信回调");
//POST为微信回调请求
if (Request.HttpMethod == "POST")
{
//因为微信所有的请求都是POST,除了第一次的验证
}
else if (Request.HttpMethod == "GET")
{
//用于第一次配置验证
FirstValid();
}
}
#region 微信验证
/// <summary>
/// 用于第一次配置验证
/// </summary>
private void FirstValid()
{
//实际为上图中填写的Token
string token = "fo**";
var echoStr = Request["echoStr"];
var signature = Request["signature"];
var timestamp = Request["timestamp"];
var nonce = Request["nonce"];
if (CheckSignature(token) && !string.IsNullOrEmpty(echoStr))
{
Response.Write(echoStr);
Response.End();
}
}
/// <summary>
/// 验证微信签名
/// </summary>
/// * 将token、timestamp、nonce三个参数进行字典序排序
/// * 将三个参数字符串拼接成一个字符串进行sha1加密
/// * 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
/// <returns></returns>
private bool CheckSignature(string token)
{
string signature = Request.QueryString["signature"];
string timestamp = Request.QueryString["timestamp"];
string nonce = Request.QueryString["nonce"];
string[] arrTmp = { token, timestamp, nonce };
Array.Sort(arrTmp);
string tmpStr = string.Join("", arrTmp);
tmpStr = FormsAuthentication.HashPasswordForStoringInConfigFile(tmpStr, "SHA1");
if (tmpStr != null)
{
tmpStr = tmpStr.ToLower();
return tmpStr == signature;
}
return false;
}
}
相信到了这一步就能成功提交了。至此,初步告捷!