前言 微信公眾號對接第三方開發的前提就是授權。首先是開通開放平臺。開通時填寫資料包括公司信息,還需要300大洋。開放平臺包括移動應用、網站應用、公眾號賬號、小程式、第三方平臺。這裡我們開通第三方平臺。 開通第三方平臺時填寫基本信息,比如平臺名稱、平臺介紹、平臺圖片。下一步是選擇許可權集、開發資料。許可權 ...
前言
微信公眾號對接第三方開發的前提就是授權。首先是開通開放平臺。開通時填寫資料包括公司信息,還需要300大洋。開放平臺包括移動應用、網站應用、公眾號賬號、小程式、第三方平臺。這裡我們開通第三方平臺。
開通第三方平臺時填寫基本信息,比如平臺名稱、平臺介紹、平臺圖片。下一步是選擇許可權集、開發資料。許可權集就是托管公眾號的功能、比如回覆消息、創建菜單、會話管理等等。 開發資料這裡有3個地方需要註意,授權事件接收url、授權測試公眾號列表、公眾號消息於事件接收url。 授權測試公眾號列表主要是在全網發佈之前,在列表內的公眾號才能進行授權。
一鍵授權給第三方平臺
先來看一下官方提供的流程圖,有一個直觀的認識。
授權官方提供了兩種方式,授權註冊頁面掃碼授權、點擊移動端鏈接快速授權。這裡我用的是第一種,在自己的頁面上放一個鏈接,點擊後會生成一個二維碼讓公眾號管理員掃碼授權。 https://mp.weixin.qq.com/cgi-bin/componentloginpage?component\_appid=xxxx&pre\_auth\_code=xxxxx&redirect\_uri=xxxx&auth\_type=xxx。
這裡看到了鏈接路徑包括包括4個參數。前3個是必填。component_appid是第三方平臺的appid、redirect_uri是你需要用來獲取授權信息的url。同意授權後微信伺服器會請求這給地址。 到這裡繞了一圈還有一個參數pre_auth_code。 這個參數怎麼獲取?這裡先看一下官方文檔 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1453779503&token=&lang=zh_CN 。 這裡就該使用創建第三方平臺時填寫的授權事件url了。微信伺服器會每隔10分鐘向改地址發起請求,接收到的消息是密文,需要自己解密,官方已經提供了demo,可以參考。pre_auth_code就要從這裡的密文消息中獲取。
用下麵這個示意圖來消化一下。分3步來獲取預授權碼
獲取component_verify_ticket
獲取component_access_token
這裡註意一下,獲取component_access_token參數是JSON字元串,在對接第三方平臺開發時這兩個參數至關重要。component_verify_ticket是公眾平臺和第三方平臺溝通的橋梁。這兩個參數可以根據自己的需要保存在資料庫或者redis里。後續調用其他高級介面和網頁授權時都需要用到。
獲取預授權碼(pre_auth_code)
知道了具體獲取的方法,那我們就看下具體的處理方法,第一步先獲取verify_ticket。
string sToken = "第三方平臺token"; string sAppID = "第三方平臺appid"; string sEncodingAESKey = "第三方平臺aeskey"; WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sAppID); if (Request.HttpMethod.ToLower() == "post") { string sig = Request.QueryString["msg_signature"]; string timestamp = Request.QueryString["timestamp"]; string nonce = Request.QueryString["nonce"]; StreamReader sr = new StreamReader(Request.InputStream, Encoding.UTF8); string respData = sr.ReadToEnd(); string sMsg = ""; //解析之後的明文 int ret = 0; ret = wxcpt.DecryptMsg(sig, timestamp, nonce, respData, ref sMsg); if (ret != 0) { return; } XmlDocument doc = new XmlDocument(); doc.LoadXml(sMsg); string infotype = doc.SelectSingleNode("xml").SelectSingleNode("InfoType").InnerText; string componentVerifyTicket = doc.SelectSingleNode("xml").SelectSingleNode("ComponentVerifyTicket").InnerText; switch (infotype) { case "component_verify_ticket": LogHelper.Info("ticket:" + componentVerifyTicket);//這裡就拿到了component_verify_ticket Response.Write("success"); Response.End(); break; case "unauthorized"://用戶取消授權 Response.End(); break; } }
第二步獲取componet_access_token
private static ResponseComponentToken GetComponentToken(string appid,string appsecret,string verifyticket) { var urlFormat = "https://api.weixin.qq.com/cgi-bin/component/api_component_token"; object data = null; data = new { component_appid = appid, component_appsecret = appsecret, component_verify_ticket = verifyticket }; return CommonJsonSend.Send<ResponseComponentToken>("", urlFormat, data); }
OK。這裡pre_auth_code就不羅列了,可以用程式調,也可以用postman調用。
到這裡,拿到pre_auth_code就可以點擊上面的授權地址生成二維碼,掃碼。授權結束。有點費勁!!!
代公眾號網頁授權
對接第三方平臺後,網頁授權還是分為兩種方式,靜默方式只能拿到openid、需要用戶授權的可以拿到更多的用戶信息。實現方式相比公眾號略有不同:
這裡做開發時我用senparc SDK, 參數包括公眾號appid、第三方平臺appid、第三方平臺accesstoken。
OAuthAccessTokenResult result = OAuthApi.GetAccessToken(appid, compAppid, compAccessToken, code);
代公眾號處理消息和事件
創建第三方平臺時填寫了消息和事件接收url。第三方平臺會把用戶和微信互動的消息和事件轉發到次url。也就是在這裡你可以處理具體的消息和事件,比如關註、取消關註、發送文本消息、圖片消息。 這裡和公眾號處理消息不同的地方在於回覆用戶的消息全部要加密。加密方式同verify_ticket獲取。
這裡不需要再自己封裝互動的消息和事件。直接用senparcSDK的CustomerMessageHandler處理即可。 最後回覆用戶消息時需要用到加密消息:FinalResponseDocument。可以參考senparcSDK demo。
if (Request.HttpMethod.ToLower() == "post") { var postModel = new PostModel() { Signature = Request.QueryString["signature"], Msg_Signature = Request.QueryString["msg_signature"], Timestamp = Request.QueryString["timestamp"], Nonce = Request.QueryString["nonce"], EncodingAESKey = sEncodingAESKey, Token = sToken, AppId = sAppID }; var maxRecordCount = 10; var messageHandler = new CustomMessageHandler(Request.InputStream, postModel, maxRecordCount); try { //messageHandler.RequestDocument.Save( // Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Request_" + // messageHandler.RequestMessage.FromUserName + ".txt")); messageHandler.Execute();//執行微信處理過程(關鍵) //messageHandler.ResponseDocument.Save( // Server.MapPath("~/App_Data/" + DateTime.Now.Ticks + "_Response_" + // messageHandler.ResponseMessage.ToUserName + ".txt")); Response.Output.Write(messageHandler.FinalResponseDocument.ToString()); //Response.Write("success"); return; } catch (Exception ex) { LogHelper.Error(ex.Message,ex); } finally { Response.End(); } }
參考資料
http://www.cnblogs.com/szw/archive/2013/05/14/weixin-course-index.html
https://www.cnblogs.com/sujingnan/p/4418882.html
http://www.cnblogs.com/iCoffee/p/4815746.html