1. 程式人生 > >微信公眾號開發之訂閱號如何獲取使用者資訊(一)

微信公眾號開發之訂閱號如何獲取使用者資訊(一)

最近在做微信的公眾號的開發。之前是在一個認證過的微信服務號上開發一些相應的功能。

比如說 對認證過的微信服務好進行 自定義選單的開發,模板訊息的回覆以及關鍵詞回覆的功能。

但是目前新接了這樣一個需求:要為一個微信的訂閱號做一個類似於推廣的活動,這樣就需要獲取登入這個活動的使用者的資訊,從而判斷該使用者有沒有關注過改訂閱號之類的功能。這樣就需要讓該微信訂閱號獲取到該使用者的個人資訊。

這個功能其實我們已經在微信的服務號上實現了,這裡來回顧一下具體是如何實現的。

我們先來看微信公眾號開發的文件:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 之微信網頁授權章節。

如果我們要在微信中開啟一個第三方的網頁,公眾號可以通過微信網頁授權機制,來獲取使用者的基本資訊,進而實現業務邏輯。這是文件中的原話。通俗的講,微信也可以認為是一個瀏覽器,我們發給某個人一個連結,一點這個連結,微信會開啟相關的頁面。但是如何讓微信知道是哪個使用者打開了這個頁面呢,這樣就需要獲取到一個使用者的資訊,當然及時微信獲取了使用者的資訊,也不是所有的資訊都能獲取到,僅僅能獲取到使用者的暱稱,所在城市,性別等資訊,獲取不到微訊號的,當然是可以獲取一個openid,也就是微訊號的一個編碼,通過openid來區分使用者。

我們再來看看文件,文件中寫到,微信公眾號請求使用者網頁授權之前,得先獲取網頁授權的介面,也就是說需要到開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,修改授權回撥域名。

1.需要獲取該介面許可權

2.需要填寫相關域名。

然後使用者訪問的連結url需要按照微信給的格式進行連結,也就是說你轉發給別人的連結或者分享的二維碼對應的連結需要按照微信的格式:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

其中appId是該微信公眾號的appId, redirect_uri的值為一個天轉到你的頁面的地址,這裡我說的可能不是太通俗易懂,那麼這裡借用別人的話:

這個redirect_url 就是 一個專案的對映地址,當用戶點選立即體驗超連結的時候,會跳轉到授權登入頁面,當點選授權登入之後微信公眾平臺會回撥這個地址,並在這個地址上追加code和state引數值

http://www.example.com/oauth2.do?code=0419p3Cc0YxTtG1nadCc0Ms7Cc09p3C8&state=1 此時我們在頁面的程式碼中可以獲取到code.

那我專案中的一個例子來講:

我訪問的 地址: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx40e06c595a46ca58&redirect_uri=http%3A%2F%2Fwww.17cooltech.com%2Fxledu_wx%2Flink%2Fforward.jsp%3FappId%3Dwx40e06c595a46ca58%26linkAction%3D4&response_type=code&scope=snsapi_base&state=789#wechat_redirect 

我這裡跳轉到我一個tomcat專案中的forward.jsp 頁面中了,而在 forward.jsp 中就可以獲得code 

<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	String appId = request.getParameter("appId");
	String code = request.getParameter("code");
	System.out.println("appId:"+appId+", code:"+code);
	
	String linkAction = request.getParameter("linkAction");
	if(linkAction==null){
		linkAction = "0";
	}
	String linkValue = request.getParameter("linkValue");
	if(linkValue==null){
		linkValue = "0";
	}
%>

當然獲得這個code 之後就可以獲得相應的openId  從而就可以區分出使用者來了。

但是這個認證過的服務好實現的辦法,訂閱號可以嗎? 

我試了下,將上述的 地址中的appId換成是訂閱號的appId ,但是結果發現不行,一點連結告我“Scope 引數錯誤或沒有Scope許可權”。

這是為什麼呢,因為發現訂閱中沒有獲取到微信網頁授權介面的許可權,即如圖:


訂閱號無法獲得該介面許可權。然而後面的事情就比較尷尬了,訂閱號沒有此介面,就無法獲取到使用者的資訊。但是怎麼辦呢,通過各種查網上的資訊,發現訂閱號是可以獲得微信的openId 的 ,那就是在微信開放平臺 將一個訂閱號和服務號做繫結,然後讓訂閱號借用服務號的介面 。但是這種方法還沒有驗證。但是已經有例子了:

在方倍工作室的網站上有這樣的需求

但是前提條件是先到微信開放平臺做繫結,那今天就先到這兒,寫的比較囉嗦,主要想把過程記錄下來。