微信於9月份推出企業(yè)號(hào)後引起了業(yè)界不小的反響,許多企業(yè)都在思索企業(yè)號(hào)將如何影響企業(yè)的運(yùn)營(yíng),從本文開(kāi)始,我將詳細(xì)闡述微信企業(yè)號(hào)開(kāi)發(fā)的相關(guān)知識(shí),而本文將著重於如何實(shí)現(xiàn)更高安全機(jī)制的二次驗(yàn)證。
?
申請(qǐng)企業(yè)體驗(yàn)號(hào):
企業(yè)號(hào)顧名思義就是企業(yè)來(lái)申請(qǐng)的號(hào),申請(qǐng)時(shí)就像申請(qǐng)服務(wù)號(hào)碼一樣,需要提供各種組織證明文件,對(duì)廣大開(kāi)發(fā)者來(lái)說(shuō)很難操作,好在騰訊公司也像服務(wù)號(hào)一樣開(kāi)通了體驗(yàn)號(hào)申請(qǐng),留意企業(yè)體驗(yàn)號(hào)的有效期間非常短,只有90天(服務(wù)號(hào)測(cè)試帳號(hào)有1年有效期),且如果企業(yè)體驗(yàn)號(hào)長(zhǎng)期不使用還會(huì)收到騰訊公司提前失效的提醒郵件。企業(yè)體驗(yàn)號(hào)碼的申請(qǐng)連結(jié)如下,開(kāi)發(fā)者只需要依照騰訊公司的引導(dǎo)完成註冊(cè)步驟,立刻就能取得體驗(yàn)號(hào)碼:
http://qydev.weixin.qq.com/try?t= experience
?
通訊錄新增成員:
與公眾號(hào)不同的是,因?yàn)槭敲嫦蚱髽I(yè)內(nèi)部,所以騰訊允許企業(yè)主動(dòng)添加粉絲,具體操作是進(jìn)入到通訊錄後點(diǎn)選+按鈕新增成員,留意作為唯一識(shí)別個(gè)人訊息,微訊號(hào)、手機(jī)號(hào)碼或信箱必須至少有一個(gè),直接蒐集微訊號(hào)通常比較困難,一般可以使用企業(yè)HR資料庫(kù)裡的手機(jī)號(hào)碼和信箱等訊息,具體操作上除了手動(dòng)添加還可以透過(guò)Excel模板導(dǎo)入以及透過(guò)騰訊企業(yè)號(hào)微信API來(lái)添加,關(guān)於API添加用戶稍後章節(jié)介紹。
#?????
#?
輸入完成以後,可以將企業(yè)微訊號(hào)的二維碼傳送給員工,員工掃描後會(huì)自動(dòng)出現(xiàn)系統(tǒng)預(yù)設(shè)的企業(yè)號(hào)小助手,小助手會(huì)自動(dòng)引導(dǎo)員工經(jīng)過(guò)信箱或手機(jī)驗(yàn)證碼來(lái)完成員工身分綁定的過(guò)程,此為一次驗(yàn)證,企業(yè)自行確保通訊錄員工資料的正確性,後續(xù)依賴騰訊公司來(lái)進(jìn)行員工驗(yàn)證,驗(yàn)證通過(guò)後通訊錄狀態(tài)列的問(wèn)號(hào)會(huì)消失,顯示一次驗(yàn)證通過(guò):
?
#?
##為此我們可以參考企業(yè)號(hào)官方介面文件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平臺(tái)開(kāi)發(fā)對(duì)應(yīng)頁(yè)面。
?開(kāi)發(fā)二次驗(yàn)證用頁(yè)面:
同樣,頁(yè)面分成兩個(gè)部分,一部分是顯示部分,用來(lái)輸入用戶名和密碼,頁(yè)面示意圖如下,用戶輸入使用者名稱user以及密碼123點(diǎn)選綁定按鈕既可以完成綁定:
################## ###?#########此時(shí)會(huì)彈出下列視窗需要輸入企業(yè)的二次驗(yàn)證頁(yè)面位址:###################### ##?##################為此我們可以參考企業(yè)號(hào)官方介面文件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平臺(tái)開(kāi)發(fā)對(duì)應(yīng)頁(yè)面。 ######?######發(fā)展二次驗(yàn)證用頁(yè):###同樣,頁(yè)面分成兩個(gè)部分,一部分是顯示部分,用來(lái)輸入使用者名稱和密碼,頁(yè)面示意圖如下,使用者輸入使用者名稱user以及密碼123點(diǎn)擊綁定按鈕既可以完成綁定:
?
#頁(yè)名是EmployeeAuth,頁(yè)面程式碼如下,有些屬於apex程式碼特有的標(biāo)籤,無(wú)需做深入理解,重要是在第13行按鈕的action屬性指定了bind方法,當(dāng)點(diǎn)擊按鈕的時(shí)候?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控制器類別的程式碼前我們先來(lái)看看微信二次認(rèn)證的步驟。
?
二次驗(yàn)證的步驟與機(jī)制:
1. 首先,當(dāng)微信一次驗(yàn)證(或郵箱或手機(jī)號(hào)碼等認(rèn)證)完成後,微信會(huì)發(fā)送如下圖所示的訊息給到用戶:
2. 頁(yè)面跳轉(zhuǎn):
當(dāng)使用者點(diǎn)擊這個(gè)圖文的時(shí)候?qū)嶋H上打開(kāi)了一個(gè)位於open.weixin.qq.com網(wǎng)站下面的網(wǎng)頁(yè),這個(gè)頁(yè)面會(huì)做一些處理後跳到前面在二次驗(yàn)證裡設(shè)定的URL也就是我們正在開(kāi)發(fā)的這個(gè)頁(yè)面,在跳轉(zhuǎn)的時(shí)候還會(huì)再我們?cè)O(shè)定的URL後面加上參數(shù)code=CODE&state=STATE,例如在本例裡二次驗(yàn)證配置的URL是http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth,那麼從騰訊openweixin.qq. com跳轉(zhuǎn)後實(shí)際打開(kāi)的URL是http://johnson0001-developer-edition.ap1.force.com/EmployeeAuth?code=CODE&state=STATE?。這裡的state參數(shù)是幹嘛的騰訊公司並沒(méi)有說(shuō)明目前看也不重要。重要的是code參數(shù),利用這個(gè)參數(shù)可以呼叫騰訊的oauth2介面換取員工的userid,留意userid是一個(gè)很重要的概念,在企業(yè)號(hào)裡沒(méi)有微信OpenId一說(shuō),只有userid用來(lái)唯一標(biāo)識(shí)用戶,這個(gè)userid實(shí)際上就是我們?cè)诰S護(hù)通訊錄時(shí)的帳號(hào)欄位值:
3. 透過(guò)code呼叫騰訊oauth2介面換取員工userid
關(guān)於這個(gè)介面的說(shuō)明請(qǐng)參考騰訊文件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,也可以參加下方說(shuō)明,這裡需要特別說(shuō)明的是access token和agentid:
做過(guò)微信公共號(hào)開(kāi)發(fā)或看過(guò)前面介紹相關(guān)開(kāi)發(fā)文章的讀者應(yīng)該不會(huì)陌生,當(dāng)主動(dòng)呼叫騰訊的api時(shí)都需要access token已確保訪問(wèn)的正當(dāng)性,獲得access token相應(yīng)的也有一個(gè)專門的接口,具體的介紹可以參見(jiàn)騰訊公司文檔http://qydev.weixin.qq.com/wiki/index.php?title=%E4%B8%BB%E5%8A %A8%E8%B0%83%E7%94%A8,簡(jiǎn)單點(diǎn)說(shuō)獲得access token實(shí)際上就是透過(guò)以下介面:
https://qyapi.weixin.qq.com/cgi-bin/gettoken ?corpid=id&corpsecret=secrect
這個(gè)介面裡Corpid好找,開(kāi)啟設(shè)定就能找到,如下圖:
?
不過(guò)corpsecret就沒(méi)那么好找,實(shí)際是需要系統(tǒng)管理員在后臺(tái)創(chuàng)建管理組,創(chuàng)建管理組后就可以擁有相應(yīng)的Secret,而這個(gè)Secret所擁有的訪問(wèn)權(quán)限就是系統(tǒng)管理員創(chuàng)建的管理組所擁有的權(quán)限,騰訊文章http://qydev.weixin.qq.com/wiki/index.php?title=Secret也有提到:
再回過(guò)頭來(lái)說(shuō)agentid騰訊文檔里提到指的是“跳轉(zhuǎn)鏈接時(shí)所在的企業(yè)應(yīng)用ID”,在本例里其實(shí)指的就是發(fā)送“身份驗(yàn)證”圖文消息的那個(gè)應(yīng)用也就是“企業(yè)小助手”的應(yīng)用ID,當(dāng)然在不同的用戶場(chǎng)景里可能會(huì)是不同的應(yīng)用在調(diào)用換取userid接口,如何查看“企業(yè)小助手”的應(yīng)用ID呢?進(jìn)到應(yīng)用中心,第一個(gè)就是企業(yè)小助手,點(diǎn)擊進(jìn)入就可以看到如下圖所示的企業(yè)應(yīng)用ID了:
4. 二次驗(yàn)證
拿到userid后實(shí)際就可以進(jìn)行二次驗(yàn)證了,二次驗(yàn)證的方式有很多種,例如如果公司已經(jīng)建立起良好的通訊錄管理機(jī)制(userid等和企業(yè)人力資源數(shù)據(jù)庫(kù)同步,入職離職員工均能和企業(yè)號(hào)通訊錄同步),拿到userid后只要判斷這個(gè)userid是一位在職員工就可以自動(dòng)判斷為二次驗(yàn)證通過(guò),或者再保險(xiǎn)點(diǎn)如本例演示的,要求員工輸入公司的員工用戶名和密碼進(jìn)行驗(yàn)證。留意,輸入用戶名和密碼驗(yàn)證的頁(yè)面也就是我們前面提到的二次驗(yàn)證頁(yè)面是屬于企業(yè)擁有也是企業(yè)開(kāi)發(fā)的,這樣就確保了企業(yè)對(duì)安全的控制,具體操作上,用戶輸入用戶名和密碼后企業(yè)可以調(diào)用已有的接口進(jìn)行驗(yàn)證,如果驗(yàn)證成功則將員工的userid等信息保存在業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)中一遍后續(xù)操作。
5.通知騰訊關(guān)注成功
現(xiàn)在最后一步等企業(yè)在自己的網(wǎng)頁(yè)里完成了用戶驗(yàn)證后只剩下通知騰訊該用戶已經(jīng)驗(yàn)證成功讓相應(yīng)員工關(guān)注成功,此時(shí)應(yīng)該調(diào)用如下接口,可以看到接口需要的第二個(gè)參數(shù)即是我們前面換回來(lái)的userid:
https://qyapi.weixin.qq.com/cgi-bin/user/authsucc?access_token=ACCESS_TOKEN&userid=USERID
此接口的詳細(xì)說(shuō)明如下:
二次驗(yàn)證的代碼實(shí)現(xiàn):
按照前面的思路,我們首先獲取從騰訊跳轉(zhuǎn)過(guò)來(lái)的code,并通過(guò)code換取用戶的userid,換取的這個(gè)過(guò)程在頁(yè)面加載中完成,為此主要代碼應(yīng)放在類構(gòu)造器里。下面的代碼里設(shè)置了五個(gè)變量,其中strPassword和strUsername和用戶在頁(yè)面里輸入的用戶名和密碼相對(duì)應(yīng),userID用來(lái)存儲(chǔ)換回來(lái)的userid信息,msg用來(lái)調(diào)試幫助在頁(yè)面里顯示中間信息,accessToken則用來(lái)存儲(chǔ)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ù)會(huì)介紹該方法的詳情,accessToken兩個(gè)小時(shí)內(nèi)會(huì)失效,所以這里采取實(shí)時(shí)獲取的方式,當(dāng)然可以設(shè)計(jì)的再巧妙些以省卻每次實(shí)時(shí)獲取accessToken的網(wǎng)絡(luò)開(kāi)銷。第10行獲得了從騰訊跳轉(zhuǎn)過(guò)來(lái)時(shí)帶的code參數(shù),從第11行通過(guò)HttpRequest方法來(lái)調(diào)用換取接口獲得userid,留意第18行指定了agentid為0,這是因?yàn)轵?yàn)證消息是從企業(yè)小助手應(yīng)用發(fā)起的,而企業(yè)小助手應(yīng)用id是0。第29行開(kāi)始解析返回來(lái)的JSON數(shù)據(jù)獲取userid。
下面是obtainAccessToken方法,方法內(nèi)容也比較直接,主要通過(guò)調(diào)用gettoken接口來(lái)獲取accessToken,并通過(guò)JSONParser類來(lái)解析返回的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; }
接下來(lái)最重要的方法是bind方法,該方法將負(fù)責(zé)用戶身份驗(yàn)證以及通知騰訊用戶關(guān)注成功,可以看到下面代碼里第2行到第6行只做了很簡(jiǎn)單的用戶名密碼校驗(yàn),真實(shí)場(chǎng)景里可以根據(jù)企業(yè)的具體認(rèn)證機(jī)制進(jìn)行替換,從第9行開(kāi)始也即企業(yè)內(nèi)部用戶認(rèn)證通過(guò)后開(kā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è)號(hào)開(kāi)發(fā)系列- 啟用二次驗(yàn)證相關(guān)文章請(qǐng)關(guān)注PHP中文網(wǎng)!
?

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

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

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

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

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

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

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

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