微信於9月份推出企業(yè)號後引起了業(yè)界不小的反響,許多企業(yè)都在思索企業(yè)號將如何影響企業(yè)的運營,從本文開始,我將詳細闡述微信企業(yè)號開發(fā)的相關(guān)知識,而本文將著重於如何實現(xiàn)更高安全機制的二次驗證。
?
申請企業(yè)體驗號:
企業(yè)號顧名思義就是企業(yè)來申請的號,申請時就像申請服務(wù)號碼一樣,需要提供各種組織證明文件,對廣大開發(fā)者來說很難操作,好在騰訊公司也像服務(wù)號一樣開通了體驗號申請,留意企業(yè)體驗號的有效期間非常短,只有90天(服務(wù)號測試帳號有1年有效期),且如果企業(yè)體驗號長期不使用還會收到騰訊公司提前失效的提醒郵件。企業(yè)體驗號碼的申請連結(jié)如下,開發(fā)者只需要依照騰訊公司的引導(dǎo)完成註冊步驟,立刻就能取得體驗號碼:
http://qydev.weixin.qq.com/try?t= experience
?
通訊錄新增成員:
與公眾號不同的是,因為是面向企業(yè)內(nèi)部,所以騰訊允許企業(yè)主動添加粉絲,具體操作是進入到通訊錄後點選+按鈕新增成員,留意作為唯一識別個人訊息,微訊號、手機號碼或信箱必須至少有一個,直接蒐集微訊號通常比較困難,一般可以使用企業(yè)HR資料庫裡的手機號碼和信箱等訊息,具體操作上除了手動添加還可以透過Excel模板導(dǎo)入以及透過騰訊企業(yè)號微信API來添加,關(guān)於API添加用戶稍後章節(jié)介紹。
#?????
#?
輸入完成以後,可以將企業(yè)微訊號的二維碼傳送給員工,員工掃描後會自動出現(xiàn)系統(tǒng)預(yù)設(shè)的企業(yè)號小助手,小助手會自動引導(dǎo)員工經(jīng)過信箱或手機驗證碼來完成員工身分綁定的過程,此為一次驗證,企業(yè)自行確保通訊錄員工資料的正確性,後續(xù)依賴騰訊公司來進行員工驗證,驗證通過後通訊錄狀態(tài)列的問號會消失,顯示一次驗證通過:
?
#?
##為此我們可以參考企業(yè)號官方介面文件http://qydev.weixin.qq.com/wiki/index.phptitle=%E5%85%B3%E6%B3%A8% E4%B8%8E%E5%8F%96%E6%B6%88%E5%85%B3%E6%B3%A8在Force.com平臺開發(fā)對應(yīng)頁面。
?開發(fā)二次驗證用頁面:
同樣,頁面分成兩個部分,一部分是顯示部分,用來輸入用戶名和密碼,頁面示意圖如下,用戶輸入使用者名稱user以及密碼123點選綁定按鈕既可以完成綁定:
################## ###?#########此時會彈出下列視窗需要輸入企業(yè)的二次驗證頁面位址:###################### ##?##################為此我們可以參考企業(yè)號官方介面文件http://qydev.weixin.qq.com/wiki/index.phptitle=%E5 %85%B3%E6%B3%A8%E4%B8%8E%E5%8F%96%E6%B6%88%E5%85%B3%E6%B3%A8在Force.com平臺開發(fā)對應(yīng)頁面。 ######?######發(fā)展二次驗證用頁:###同樣,頁面分成兩個部分,一部分是顯示部分,用來輸入使用者名稱和密碼,頁面示意圖如下,使用者輸入使用者名稱user以及密碼123點擊綁定按鈕既可以完成綁定:
?
#頁名是EmployeeAuth,頁面程式碼如下,有些屬於apex程式碼特有的標(biāo)籤,無需做深入理解,重要是在第13行按鈕的action屬性指定了bind方法,當(dāng)點擊按鈕的時候?qū)⒄{(diào)用控制器類別EmployeeAuthController的bind方法:
<apex:page standardstylesheets="false" showHeader="false" sidebar="false" controller="EmployeeAuthController"> <font size="50"> <h1>Please input your user name and password</h1> </font> <font size="30"> UserName: user<br /> Password: 123<br /><br /> <hr/> <apex:form > UserName: <apex:inputText size="100" style="height:100px" value="{!strUsername}" id="strUsername"/><br /><br /> Password: <apex:inputText size="100" style="height:100px" value="{!strPassword}" id="strPassword"/><br /><br /> <center> <apex:commandButton value="Bind" style="width:600px; height:100px;font-size:50px" action="{!bind}" id="bind" /> </center> </apex:form> {!msg} </font> </apex:page>
#?
在解讀EmployeeAuthController控制器類別的程式碼前我們先來看看微信二次認證的步驟。
?
二次驗證的步驟與機制:
1. 首先,當(dāng)微信一次驗證(或郵箱或手機號碼等認證)完成後,微信會發(fā)送如下圖所示的訊息給到用戶:
2. 頁面跳轉(zhuǎn):
當(dāng)使用者點擊這個圖文的時候?qū)嶋H上打開了一個位於open.weixin.qq.com網(wǎng)站下面的網(wǎng)頁,這個頁面會做一些處理後跳到前面在二次驗證裡設(shè)定的URL也就是我們正在開發(fā)的這個頁面,在跳轉(zhuǎn)的時候還會再我們設(shè)定的URL後面加上參數(shù)code=CODE&state=STATE,例如在本例裡二次驗證配置的URL是http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth,那麼從騰訊openweixin.qq. com跳轉(zhuǎn)後實際打開的URL是http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth?code=CODE&state=STATE?。這裡的state參數(shù)是幹嘛的騰訊公司並沒有說明目前看也不重要。重要的是code參數(shù),利用這個參數(shù)可以呼叫騰訊的oauth2介面換取員工的userid,留意userid是一個很重要的概念,在企業(yè)號裡沒有微信OpenId一說,只有userid用來唯一標(biāo)識用戶,這個userid實際上就是我們在維護通訊錄時的帳號欄位值:
3. 透過code呼叫騰訊oauth2介面換取員工userid
關(guān)於這個介面的說明請參考騰訊文件http://qydev.weixin.qq.com/wiki/ index.phptitle=%E6%A0%B9%E6%8D%AEcode%E8%8E%B7%E5%8F%96%E6%88%90%E5%91%98%E4%BF%A1%E6%81 %AF,也可以參加下方說明,這裡需要特別說明的是access token和agentid:
做過微信公共號開發(fā)或看過前面介紹相關(guān)開發(fā)文章的讀者應(yīng)該不會陌生,當(dāng)主動呼叫騰訊的api時都需要access token已確保訪問的正當(dāng)性,獲得access token相應(yīng)的也有一個專門的接口,具體的介紹可以參見騰訊公司文檔http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E5%8A %A8%E8%B0%83%E7%94%A8,簡單點說獲得access token實際上就是透過以下介面:
https://qyapi.weixin.qq.com/cgi-bin/gettoken ?corpid=id&corpsecret=secrect
這個介面裡Corpid好找,開啟設(shè)定就能找到,如下圖:
?
不過corpsecret就沒那么好找,實際是需要系統(tǒng)管理員在后臺創(chuàng)建管理組,創(chuàng)建管理組后就可以擁有相應(yīng)的Secret,而這個Secret所擁有的訪問權(quán)限就是系統(tǒng)管理員創(chuàng)建的管理組所擁有的權(quán)限,騰訊文章http://qydev.weixin.qq.com/wiki/index.php?title=Secret也有提到:
再回過頭來說agentid騰訊文檔里提到指的是“跳轉(zhuǎn)鏈接時所在的企業(yè)應(yīng)用ID”,在本例里其實指的就是發(fā)送“身份驗證”圖文消息的那個應(yīng)用也就是“企業(yè)小助手”的應(yīng)用ID,當(dāng)然在不同的用戶場景里可能會是不同的應(yīng)用在調(diào)用換取userid接口,如何查看“企業(yè)小助手”的應(yīng)用ID呢?進到應(yīng)用中心,第一個就是企業(yè)小助手,點擊進入就可以看到如下圖所示的企業(yè)應(yīng)用ID了:
4. 二次驗證
拿到userid后實際就可以進行二次驗證了,二次驗證的方式有很多種,例如如果公司已經(jīng)建立起良好的通訊錄管理機制(userid等和企業(yè)人力資源數(shù)據(jù)庫同步,入職離職員工均能和企業(yè)號通訊錄同步),拿到userid后只要判斷這個userid是一位在職員工就可以自動判斷為二次驗證通過,或者再保險點如本例演示的,要求員工輸入公司的員工用戶名和密碼進行驗證。留意,輸入用戶名和密碼驗證的頁面也就是我們前面提到的二次驗證頁面是屬于企業(yè)擁有也是企業(yè)開發(fā)的,這樣就確保了企業(yè)對安全的控制,具體操作上,用戶輸入用戶名和密碼后企業(yè)可以調(diào)用已有的接口進行驗證,如果驗證成功則將員工的userid等信息保存在業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫中一遍后續(xù)操作。
5.通知騰訊關(guān)注成功
現(xiàn)在最后一步等企業(yè)在自己的網(wǎng)頁里完成了用戶驗證后只剩下通知騰訊該用戶已經(jīng)驗證成功讓相應(yīng)員工關(guān)注成功,此時應(yīng)該調(diào)用如下接口,可以看到接口需要的第二個參數(shù)即是我們前面換回來的userid:
https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=ACCESS_TOKEN&userid=USERID
此接口的詳細說明如下:
二次驗證的代碼實現(xiàn):
按照前面的思路,我們首先獲取從騰訊跳轉(zhuǎn)過來的code,并通過code換取用戶的userid,換取的這個過程在頁面加載中完成,為此主要代碼應(yīng)放在類構(gòu)造器里。下面的代碼里設(shè)置了五個變量,其中strPassword和strUsername和用戶在頁面里輸入的用戶名和密碼相對應(yīng),userID用來存儲換回來的userid信息,msg用來調(diào)試幫助在頁面里顯示中間信息,accessToken則用來存儲access token:
public class EmployeeAuthController { public String strPassword { get; set; } public String strUsername { get; set; } public String msg { get; set; } public String userID { get; set; } public String accessToken { get; set; } public EmployeeAuthController (){ accessToken = obtainAccessToken(); String code = ApexPages.currentPage().getParameters().get('code'); //Obtain user ID Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=' + accessToken + '&code=' + code + '&agentid=0'); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes ; //String operation to obtain userID: JSONParser parser = JSON.createParser(bodyRes); while(parser.nextToken() != null){ if((parser.getCurrentToken() == JSONToken.FIELD_NAME)){ String fieldName = parser.getText(); parser.nextToken(); if(fieldName == 'UserId'){ userID = parser.getText(); } } } msg = userID; } }
上述代碼第9行調(diào)用obtainAccessToken方法獲取accessToken,后續(xù)會介紹該方法的詳情,accessToken兩個小時內(nèi)會失效,所以這里采取實時獲取的方式,當(dāng)然可以設(shè)計的再巧妙些以省卻每次實時獲取accessToken的網(wǎng)絡(luò)開銷。第10行獲得了從騰訊跳轉(zhuǎn)過來時帶的code參數(shù),從第11行通過HttpRequest方法來調(diào)用換取接口獲得userid,留意第18行指定了agentid為0,這是因為驗證消息是從企業(yè)小助手應(yīng)用發(fā)起的,而企業(yè)小助手應(yīng)用id是0。第29行開始解析返回來的JSON數(shù)據(jù)獲取userid。
下面是obtainAccessToken方法,方法內(nèi)容也比較直接,主要通過調(diào)用gettoken接口來獲取accessToken,并通過JSONParser類來解析返回的JSON數(shù)據(jù)以獲得accessToken:
private String obtainAccessToken(){ String token; Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=wx548178d7f347f582&corpsecret=9pwWy0AVoT6V65hnwZLYdi4jnLLx65ofBRb_Ds0mAozysQoywDaqbqYCqglm2vhr'); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes; JSONParser parser = JSON.createParser(bodyRes); while(parser.nextToken() != null){ if((parser.getCurrentToken() == JSONToken.FIELD_NAME)){ String fieldName = parser.getText(); parser.nextToken(); if(fieldName == 'access_token'){ token= parser.getText(); } } } msg = token; return token; }
接下來最重要的方法是bind方法,該方法將負責(zé)用戶身份驗證以及通知騰訊用戶關(guān)注成功,可以看到下面代碼里第2行到第6行只做了很簡單的用戶名密碼校驗,真實場景里可以根據(jù)企業(yè)的具體認證機制進行替換,從第9行開始也即企業(yè)內(nèi)部用戶認證通過后開始調(diào)用authsucc接口通知騰訊用戶關(guān)注成功。
public PageReference bind() { if(!strUsername.equals('user')){ msg = 'Please input correct user name'; } else if(!strPassword.equals('123')){ msg = 'Please input correct password'; } else{ msg = 'Bind successfully!'; //Notify tencent to add user Http h = new Http(); HttpRequest req = new HttpRequest(); req.setMethod('GET'); req.setHeader('Accept-Encoding','gzip,deflate'); req.setHeader('Content-Type','text/xml;charset=UTF-8'); req.setHeader('User-Agent','Jakarta Commons-HttpClient/3.1'); req.setEndpoint('https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=' + accessToken + '&userid=' + userID); String bodyRes = ''; try{ HttpResponse res = h.send(req); bodyRes = res.getBody(); } catch(System.CalloutException e) { System.debug('Callout error: '+ e); ApexPages.addMessage(new ApexPages.Message(ApexPages.Severity.FATAL, e.getMessage())); } msg = bodyRes ; } }
?更多Force.com微信企業(yè)號開發(fā)系列- 啟用二次驗證相關(guān)文章請關(guān)注PHP中文網(wǎng)!
?

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)