1.关于盛派的微信第三方接口确实很实用,先强烈安利一波,详细接口内容可去官网根据需求调用Senparc 官方微信开发教程文档
2.先在NuGet上引用开放平台的Senparc.Weixin.dll、Senparc.Weixin.MP.dll、Senparc.Weixin.Open这三个dll
3.web api 接收推送的component_verify_ticket
/// <summary>
/// 授权推送及component_verify_ticket接收(消息与事件接受)
/// </summary>
[HttpPost]
[Route("Componentverifyticket")]
public HttpResponseMessage Componentverifyticket([FromUri]Senparc.Weixin.Open.Entities.Request.PostModel postModel)
{
try
{
Stream inputStream = Request.Content.ReadAsStreamAsync().Result;
XDocument encryptDoc = XmlUtility.Convert(inputStream);
Logger.Output("encryptDoc:" + encryptDoc);
postModel.Token = "xxxxxxxxx";//"在申请开放平台时,填写开发资料时,填写的消息校验Token";
postModel.AppId = "xxxxxxxxxx";//"开放平台发布成功之后,微信会为用户分配一个AppId,此处即为该参数";
postModel.EncodingAESKey = "xxxxxxxxxx";//"在申请开放平台时,填写开发资料时,填写的消息加解密Key";
Logger.Output("接收component_verify_ticket方法Auth,postModel:" + JsonConvert.SerializeObject(postModel));
//获取解密后的XDocument
XDocument decryptDoc = GetDecryptXDocument(encryptDoc, postModel.AppId, postModel.Token, postModel.EncodingAESKey, postModel.Signature, postModel.Timestamp, postModel.Nonce);
Senparc.Weixin.Open.IRequestMessageBase requestMessage = Senparc.Weixin.Open.RequestMessageFactory.GetRequestEntity(decryptDoc);
Logger.Output("接收component_verify_ticket", string.Format(@"WxController.Auth.requestMessage:{0}", JsonConvert.SerializeObject(requestMessage)));
if (requestMessage == null)
{
Logger.Output("接收component_verify_ticket信息:接收信息为空,requestMessage:" + JsonConvert.SerializeObject(requestMessage));
}
else
{
switch (requestMessage.InfoType)
{
case RequestInfoType.component_verify_ticket://推送component_verify_ticket
var messageComponentVerifyTicket = requestMessage as RequestMessageComponentVerifyTicket;
Logger.Output("接收component_verify_ticket", "方法ReceiveRequestType,信息:messageComponentVerifyTicket:" + JsonConvert.SerializeObject(messageComponentVerifyTicket));
string verifyTicket = messageComponentVerifyTicket.ComponentVerifyTicket;
HttpRuntime.Cache.Insert("verifyTicket", verifyTicket);
HttpRuntime.Cache.Insert("AppId", messageComponentVerifyTicket.AppId);
break;
case RequestInfoType.authorized://授权成功
var requestMessageAuthorized = requestMessage as RequestMessageAuthorized;
string authorizerAppid = requestMessageAuthorized.AuthorizerAppid;
Logger.Output("接收component_verify_ticket", "方法ReceiveRequestType,信息:授权成功!requestMessageAuthorized:" + JsonConvert.SerializeObject(requestMessageAuthorized));
if (!String.IsNullOrEmpty(authorizerAppid))
{
HttpRuntime.Cache.Insert("authorizerAppid", authorizerAppid);
}
break;
case RequestInfoType.unauthorized://取消授权
var requestMessageUnauthorized = requestMessage as RequestMessageUnauthorized;
string authorizerAppid01 = requestMessageUnauthorized.AuthorizerAppid;
Logger.Output("接收component_verify_ticket", "方法ReceiveRequestType,信息:取消授权!requestMessageUnauthorized:" + JsonConvert.SerializeObject(requestMessageUnauthorized));
if (!String.IsNullOrEmpty(authorizerAppid01))
{
HttpRuntime.Cache.Insert("authorizerAppid01", authorizerAppid01);
}
break;
case RequestInfoType.updateauthorized://更新授权
var requestMessageUpdateAuthorized = requestMessage as RequestMessageUpdateAuthorized;
string authorizerAppid02 = requestMessageUpdateAuthorized.AuthorizerAppid;
Logger.Output("接收component_verify_ticket", "方法ReceiveRequestType,信息:更新授权!requestMessageUpdateAuthorized:" + JsonConvert.SerializeObject(requestMessageUpdateAuthorized));
if (!String.IsNullOrEmpty(authorizerAppid02))
{
HttpRuntime.Cache.Insert("authorizerAppid02", authorizerAppid02);
}
break;
default:
break;
}
}
}
catch (Exception ex)
{
Logger.Output("接收component_verify_ticket异常信息:" + ex.ToString());
}
Component.component_verify_ticket = HttpRuntime.Cache.Get("verifyTicket").ToString();
return ControllerContext.Request.CreateResponse("success");
}
解密方法(关于解密方法WXBizMsgCrypt()可以直接使用盛派的,也可以自行到微信第三方进行下载使用):
/// <summary>
/// 获取解密后的XDocument
/// </summary>
/// <param name="doc"></param>
/// <param name="appId">授权方公众号AppId</param>
/// <returns></returns>
public XDocument GetDecryptXDocument(XDocument doc, string appId, string token, string encodingAESKey, string signature, string timestamp, string nonce)
{
try
{
WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAESKey, appId);
string msgXml = null;
var result = wxcpt.DecryptMsg(signature, timestamp, nonce, doc.ToString(), ref msgXml);
Logger.Output("处理加密时代码:" + result);
//判断result类型
if (result != 0)
{
Logger.Output(new { msg = "" }, "处理加密时失败");//失败,写入日志
//验证没有通过,取消执行
return null;
}
return XDocument.Parse(msgXml);//完成解密
}
catch (Exception ex)
{
Logger.Output("解密失败" + ex.ToString());
return null;
}
}
对于取出来的component_verify_ticket视情况保存,我是存在缓存中使用的。也可以存在数据库或者文件夹中,component_verify_ticket的过期时间相较Token会比较长。