前期準備
廢話不多說,只想通過自己在開發過程中遇到的一些問題,提供給想要入手開發的微信公衆號開發的人一些幫助(如遇大神,請指出不妥之處)。
首先,需要一個認證過的公衆號,本系列文章以已通過認證的服務號爲例。如果沒有,也可以通過申請測試賬號進行開發。
測試賬號申請地址: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;
}
}
相信到了這一步就能成功提交了。至此,初步告捷!