前提:
1.微信订阅号。
2.有自己的域名,且可以正常使用。
1.在微信公众平台注册账号,因为是个人使用,企业号和服务号个人都是无法注册的,我们只能注册一个订阅号,订阅号其实也有相对优势每天可以发布一篇文章。
2.注册后进入微信公众平台中,左侧菜单栏最下方“开发”是微信公众号开发的API,进入"基本配置"中,可以看到公众号的基本配置信息,最上方的“公众号开发信息”如下图,这里的内容先别管。
3.下面的“服务器配置”既是我们要做服务器接入的部分,截图如下(图中的账号已经配置好),其中包括“服务器地址”,“TOKEN”,“密匙”以及“加密方式”,这是个都是请求的必填项,服务器地址既URL必须是公网可以访问的,加密方式只需要选择明文方式,密匙是随机生成的,不用在意,TOKEN是要填写的,在下面的开发中会使用。
4.项目工程在GitHub中 https://github.com/wangqilong1225/WeChat,下面为接口API的代码:
- 下面的Wx()方法为公众平台填写URL接入的接口,接口验证为Get请求,且会有signature, timestamp, string nonce, echostr四个参数,都为字符串类型。接收到参数后需要去计算签名,既 CheckWeChatServer()方法,具体实现在下面第2步中,当签名比对成功后,再将接收的echostr返回给微信平台就可以了。
注意:微信公众号的一次请求中,会反复执行3次,建议在搭建好项目后,一遍调试,一遍写代码。
private static string TOKEN = "wangqilong"; //后期采用配置文件
/// <summary>
/// 服务器接入接口验证
/// </summary>
/// <param name="signature">微信加密签名</param>
/// <param name="timestamp">时间戳</param>
/// <param name="nonce">随机数</param>
/// <param name="echostr">随机字符串</param>
public void Wx(string signature, string timestamp, string nonce, string echostr)
{
//Get请求处理
if (System.Web.HttpContext.Current.Request.HttpMethod.ToUpper() == "Get")
{
//效验请求
bool signatureFlag = CheckWeChatServer(signature, timestamp, nonce, echostr);
if (signatureFlag)
{
System.Web.HttpContext.Current.Response.Write(echostr);
System.Web.HttpContext.Current.Response.End();
}
else
{
System.Web.HttpContext.Current.Response.Write("签名验证错误!");
System.Web.HttpContext.Current.Response.End();
}
}
}
- 计算签名以及比对,API的签名计算首先要将内容按字典序排序,然后进行指定方式加密,微信提供的加密方式一种是sha1加密,类似MD5加密。
#region 服务器接入签名计算和比对
public bool CheckWeChatServer(string signature, string timestamp, string nonce, string echostr)
{
//将token、timestamp、nonce三个参数进行字典序排序
string[] strs = new string[] { TOKEN, timestamp, nonce };
Array.Sort(strs);
//将三个参数字符串拼接成一个字符串进行sha1加密
string str = strs[0] + strs[1] + strs[2];
string mySignature = Sha1(str);
if (signature == mySignature)
{
return true;
}
else
{
Console.WriteLine(mySignature);
return false;
}
}
#endregion
- sha1加密
#region sha1加密
public string Sha1(string str)
{
var buffer = Encoding.UTF8.GetBytes(str);
var data = SHA1.Create().ComputeHash(buffer);
var sb = new StringBuilder();
foreach (var t in data)
{
//x2 签名全部为小写
sb.Append(t.ToString("x2"));
}
return sb.ToString();
}
#endregion
5.以上如有不足之处望指出,欢迎加入我的github项目中。