微信公眾號對接第三方平台開發


前言

        微信公眾號對接第三方開發的前提就是授權。首先是開通開放平台。開通時填寫資料包括公司信息,還需要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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM