微信公衆號對接第三方平臺開發

前言

        微信公衆號對接第三方開發的前提就是受權。首先是開通開放平臺。開通時填寫資料包括公司信息,還須要300大洋。開放平臺包括移動應用、網站應用、公衆號帳號、小程序、第三方平臺。這裏咱們開通第三方平臺。html

         開通第三方平臺時填寫基本信息,好比平臺名稱、平臺介紹、平臺圖片。下一步是選擇權限集、開發資料。權限集就是託管公衆號的功能、好比回覆消息、建立菜單、會話管理等等。  開發資料這裏有3個地方須要注意,受權事件接收url、受權測試公衆號列表、公衆號消息於事件接收url。  受權測試公衆號列表主要是在全網發佈以前,在列表內的公衆號才能進行受權。redis

 

一鍵受權給第三方平臺

       先來看一下官方提供的流程圖,有一個直觀的認識。數據庫

       

      受權官方提供了兩種方式,受權註冊頁面掃碼受權、點擊移動端連接快速受權。這裏我用的是第一種,在本身的頁面上放一個連接,點擊後會生成一個二維碼讓公衆號管理員掃碼受權。 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就要從這裏的密文消息中獲取。 api

        用下面這個示意圖來消化一下。分3步來獲取預受權碼服務器

 

獲取component_verify_ticket

獲取component_access_token

 

      這裏注意一下,獲取component_access_token參數是JSON字符串,在對接第三方平臺開發時這兩個參數相當重要。component_verify_ticket是公衆平臺和第三方平臺溝通的橋樑。這兩個參數能夠根據本身的須要保存在數據庫或者redis裏。後續調用其餘高級接口和網頁受權時都須要用到。    微信

   獲取預受權碼(pre_auth_code)

 

 

     知道了具體獲取的方法,那咱們就看下具體的處理方法,第一步先獲取verify_ticket。app

 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_tokenpost

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

http://www.javashuo.com/article/p-pytcxtbj-gh.html

http://www.cnblogs.com/iCoffee/p/4815746.html

相關文章
相關標籤/搜索