在C#公众平台(一)—— 接入配置 写了公众平台的基本配置,这篇文章讲的是关注回调事件。
基础帮助类
接收事件推送文档
接入指南
///
/// WeChatEvent 的摘要说明
///
public class WeChatEvent : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
if (context.Request.HttpMethod.ToUpper() == "POST")
{
Message message = new Message();
WxPayData data = message.GetMessageData(context);
string msgType = data.GetValue("MsgType").ToString();
//这里进行判断MsgType
switch (msgType)
{
case "text":
//SendToWx = WxText.GetWxTextXml(postString);
break;
case "image":
//SendToWx = WxImage.GetWxImageXml(postString);
break;
case "voice":
break;
case "video":
break;
case "shortvideo":
break;
case "location":
break;
case "link":
break;
case "event":
string eventType = data.GetValue("Event").ToString();
switch (eventType)
{
case "subscribe":
//用户未关注的情况下KEY值: qrscene_为前缀,后面为二维码的参数值
string eventKey = data.GetValue("EventKey").ToString();
if (!string.IsNullOrEmpty(eventKey))
{
//获取二维码的分销商ID
int CusID = CInt(eventKey.Substring(eventKey.IndexOf("qrscene_") + 8));
//记录OPENID
string openID = data.GetValue("FromUserName").ToString();
//根据OPENID获取UnionID
WCQRCode WCQRCode = new WCQRCode();
string access_token = string.Empty;
if (string.IsNullOrWhiteSpace(Config.SubscriptionAppID))
{
access_token = WCQRCode.GetJSAPIAccessToken(Config.AppID, Config.AppSecret);
}
else
{
access_token = WCQRCode.GetJSAPIAccessToken(Config.SubscriptionAppID, Config.SubscriptionAppSecret);
}
WxPayData userInfo = WCQRCode.GetUserInfo(access_token, openID);
string unionid = string.Empty;
//是否使用了微信企业模式,使用了就会有unionid
if (userInfo.IsSet("unionid"))
{
unionid = userInfo.GetValue("unionid").ToString();
}
//判断是否存在,记录到数据库
WeChatSubscribeDAO dao = new WeChatSubscribeDAO();
bool isExists = dao.Exists(openID);
if (!isExists)
{
//存入数据库
}
}
break;
case "unsubscribe":
break;
case "SCAN":
break;
case "LOCATION":
break;
case "CLICK":
break;
case "VIEW":
break;
default:
break;
}
break;
default:
//result = "没有识别的类型消息:" + xmlElement.SelectSingleNode("MsgType").InnerText;
//WriteLog(result);
break;
}
}
else if (context.Request.HttpMethod.ToUpper() == "GET")
{
string token = Config.Token;//从配置文件获取Token
if (string.IsNullOrEmpty(token))
{
//写到日志文件
LogUtil.WriteLog("微信Token配置项没有配置!");
}
// 微信加密签名
String signature = context.Request["signature"];
// 时间戳
String timestamp = context.Request["timestamp"];
// 随机数
String nonce = context.Request["nonce"];
// 随机字符串
String echostr = context.Request["echostr"];
Message message = new Message();
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (message.DockingCheckSignature(token, timestamp, nonce, signature))
{
context.Response.Write(echostr);
}
else
{
context.Response.Write("error");
}
}
}
public static Int32 CInt(Object obj)
{
return (int)CDec(obj);
}
public static Decimal CDec(Object obj)
{
if (null == obj || DBNull.Value == obj)
{
return 0;
}
String s = obj.ToString();
//if (String.IsNullOrEmpty(s))
//{
// return 0;
//}
Decimal r = 0;
//if ( IsNumber(s))
//{
// r = Decimal.Parse(s);
//}
//else
//{
// r = 0;
//}
//try
//{
//r = Decimal.Parse(s);
bool ok = decimal.TryParse(s, out r);
// if(ok == false){
// r = 0;
// }
//}
//catch
//{
// r = 0;
//}
return r;
}
public bool IsReusable
{
get
{
return false;
}
}
}
当是Get的时候就是服务器和微信握手,这个看下接入指南就清楚了,就是验证下signature合不合法就行,合法了就把echostr返回去就是握手成功,反之失败。
当时Post的时候就是公众号发生事件了,这里只处理了关注回调,这里扫描的是带参数的二维码 所以会多一串内容,这内容存的就是具体参数,根据这个二维码存的参数,去进行下一步的处理,比如将扫码的用户和这个二维码去绑定之类的,这个根据具体逻辑而定了。