“出於安全考慮,在第三方平台創建審核通過后,微信服務器每隔10分鍾會向第三方的消息接收地址推送一次component_verify_ticket,用於獲取第三方平台接口調用憑據”。這是文檔中的原話,也就是說我們在獲取access_token的時候是要先得到component_verify_ticket的,而component_verify_ticket是每10分鍾向我們的接收地址推送一次。
而域名地址是由我們自己去服務器上去部署,如下圖:

/// <summary>
/// 一.推送component_verify_ticket
/// </summary>
/// <param name="collection"></param>
/// <returns></returns>
[HttpPost]
public ActionResult Index(FormCollection collection)
{
//在公眾號第三方平台創建審核通過后,微信服務器會向其“授權事件接收URL”每隔10分鍾定時推送component_verify_ticket。第三方平台方在收到ticket推送后也需進行解密
byte[] data = Request.BinaryRead(Request.TotalBytes);
string postData = Encoding.Default.GetString(data);
//公眾號第三方平台的appid
string appId = ConfigurationManager.AppSettings["WeixinAppID"];
//第三方平台申請時填寫的接收消息的校驗token
string token = ConfigurationManager.AppSettings["WeixinToken"];
//第三方平台申請時填寫的接收消息的加密symmetric_key
string encodingAesKey = ConfigurationManager.AppSettings["WeixinEncodingAESKey"];
string sMsg = "";//解密后的內容
var msg = new Tencent.WXBizMsgCrypt(token, encodingAesKey, appId);
int ret = msg.DecryptMsg(
Request.QueryString["msg_signature"],
Request.QueryString["timestamp"],
Request.QueryString["nonce"],
postData,
ref sMsg);
var xDoc = XDocument.Parse(sMsg);
var q = (from c in xDoc.Elements() select c).ToList();
var infoType = q.Elements("InfoType").First().Value;
switch (infoType)
{
case "component_verify_ticket":
//q.Elements("ComponentVerifyTicket").First()
//這里就是component_verify_ticket的值,保存起來就可以了,處理完成后在頁面上輸出success,通知微信服務器已經接收到ticket
string _AppId = q.Elements("AppId").First().Value;
string _CreateTime = q.Elements("CreateTime").First().Value;
string _InfoType = q.Elements("InfoType").First().Value;
string _ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value;
DateTime dt = DateTime.Now;
var datacvt = from t in dbContext.tb_ComponentVerifyTicket
select t;
tb_ComponentVerifyTicket tb = new tb_ComponentVerifyTicket();
if (datacvt.ToList().Count == 0)//添加
{
tb.Cvt_AppId = _AppId;
tb.Cvt_CreateTime = _CreateTime;
tb.Cvt_InfoType = _InfoType;
tb.Cvt_ComponentVerifyTicket = _ComponentVerifyTicket;
tb.Cvt_DateTime = dt;
dbContext.tb_ComponentVerifyTicket.Add(tb);
dbContext.SaveChanges();
}
else//修改
{
foreach (var item in datacvt)
{
item.Cvt_Id = item.Cvt_Id;
item.Cvt_AppId = _AppId;
item.Cvt_CreateTime = _CreateTime;
item.Cvt_InfoType = _InfoType;
item.Cvt_ComponentVerifyTicket = _ComponentVerifyTicket;
item.Cvt_DateTime = dt;
}
dbContext.SaveChanges();
}
Response.Write("success");
Response.End();
break;
default:
break;
}
return View();
}
這里我們得到了component_verify_ticket,也就是我要的“ string _ComponentVerifyTicket = q.Elements("ComponentVerifyTicket").First().Value; ”
OK,到這里之后我們接下來的就是要獲取access_token。
因為access_token的有效期為兩個小時“第三方平台compoment_access_token是第三方平台的下文中接口的調用憑據,也叫做令牌(component_access_token)。每個令牌是存在有效期(2小時)的,且令牌的調用不是無限制的,請第三方平台做好令牌的管理,在令牌快過期時(比如1小時50分)再進行刷新。” So,我們可以考慮做一個Windows服務每兩個小時去執行向微信服務發送請求又或者是時間對比法 (先記錄得到component_access_token的時間再取component_access_token值的時候查得當前時間,通過兩個時間差做比較,如果大於等於2小時就重新去查詢,否則去查詢數據庫或緩存中的component_access_token)
protected override void OnStart(string[] args)
{
string str = "服務開啟";
System.Threading.Timer t = new System.Threading.Timer
(new System.Threading.TimerCallback(testTheNet), null, 1000 * 60 * 120, 1000 * 60 * 120);
//System.Threading.Timer t = new System.Threading.Timer
// (new System.Threading.TimerCallback(_testime), null, 1000 * 60, 1000 * 60);
}


到這里access_token我們就已經獲取到了~~
