概念
由于這種模式多了很多稀奇古怪的概念,首先我們來理一理這個概念浓利。
- 三種token
- 企業(yè)接口的token
- 應(yīng)用授權(quán)的token
- 服務(wù)商的token
參考文檔:https://work.weixin.qq.com/api/doc#11791
- 各種ID
- CorpID:整個企業(yè)微信的ID
- SuiteID:服務(wù)商新建的每一個應(yīng)用特有的ID
- Secret:服務(wù)商新建的每一個應(yīng)用特有的Secret
構(gòu)造登錄URL
做過oauth的同學(xué)都知道鼎俘,oauth登錄的第一步是引導(dǎo)用戶到第三方服務(wù)器示惊,然后用戶確認(rèn)授權(quán)登錄(或者靜默授權(quán))之后渣锦,跳轉(zhuǎn)回自己的服務(wù)器欧芽,同時帶上code這個參數(shù)值男韧。
企業(yè)微信服務(wù)商構(gòu)建url的文檔地址在:
https://work.weixin.qq.com/api/doc#10975/構(gòu)造第三方oauth2鏈接
就是說我們要構(gòu)建出一個地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={redirect_uri}&response_type=code&scope={scope}&state=STATE#wechat_redirect
參數(shù)名 | 含義 |
---|---|
appid | 服務(wù)商應(yīng)用ID |
redirect_uri | urlencode之后的回調(diào)地址 |
scope | 應(yīng)用授權(quán)作用域朴摊。 snsapi_base:靜默授權(quán),可獲取成員的基礎(chǔ)信息此虑; snsapi_userinfo:靜默授權(quán)甚纲,可獲取成員的詳細(xì)信息,但不包含手機(jī)朦前、郵箱介杆; snsapi_privateinfo:手動授權(quán)鹃操,可獲取成員的詳細(xì)信息,包含手機(jī)春哨、郵箱荆隘。 |
注:snsapi_privateinfo的時候,必須在服務(wù)商應(yīng)用那里打開敏感信息授權(quán)赴背,并且注意椰拒,已經(jīng)安裝測試的應(yīng)用打開授權(quán)必須要先取消再安裝。
根據(jù)code獲取用戶的相關(guān)信息
其實(shí)就是通過get請求獲取用戶信息凰荚,請求的地址是:
https://qyapi.weixin.qq.com/cgi-bin/service/getuserinfo3rd?access_token={SUITE_ACCESS_TOKEN}&code={CODE}
當(dāng)然燃观,如果是想獲取成員信息(之前的scope不是snsapi_base),則還需要用從這個接口獲取到的user_ticket再一次請求接口https://qyapi.weixin.qq.com/cgi-bin/service/getuserdetail3rd?access_token={SUITE_ACCESS_TOKEN}
注意:如果用戶的企業(yè)沒有安裝這個應(yīng)用可以拿到openid便瑟,已經(jīng)安裝則返回userid
獲取SUITE_ACCESS_TOKEN
先上文檔:
https://work.weixin.qq.com/api/doc#11791/應(yīng)用授權(quán)的token
這個接口需要三個參數(shù)缆毁,其中suite_id和suite_secret是應(yīng)用特有的參數(shù),而suite_ticket是微信服務(wù)器通過指令回調(diào)URL每10分鐘推送過來的數(shù)據(jù)
處理企業(yè)微信指令回調(diào)
首先這個URL是應(yīng)用配置的到涂,然后post過來是xml格式的字符串脊框,當(dāng)然企業(yè)微信提供了各種語言的sdk解密這個xml數(shù)據(jù)
SDK下載地址:
https://work.weixin.qq.com/api/doc#10128
- 如何通過URL的校驗(yàn),首先在企業(yè)微信的應(yīng)用管理里面要校驗(yàn)通過URL才能安裝應(yīng)用践啄,然后這個校驗(yàn)就是發(fā)送一個GET請求到這個地址浇雹,然后我們只需要調(diào)用sdk的VerifyURL函數(shù),把運(yùn)算結(jié)果直接返回即可通過校驗(yàn)
下面以python作為例子:
from WXBizMsgCrypt import WXBizMsgCrypt
wxcpt=WXBizMsgCrypt(sToken,sEncodingAESKey,sCorpID)
ret,sEchoStr=wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,sVerifyNonce,sVerifyEchoStr)
輸出到瀏覽器(sEchoStr)
參數(shù)含義:
- sToken:應(yīng)用配置的回調(diào)配置的Token
- sEncodingAESKey:應(yīng)用配置的回調(diào)配置的EncodingAESKey
- sCorpID:企業(yè)微信的CorpID
- sVerifyMsgSig:GET參數(shù)msg_signature
- sVerifyTimeStamp:GET參數(shù)timestamp
- sVerifyNonce:GET參數(shù)nonce
- sVerifyEchoStr:GET參數(shù)echostr
- 如何拿到suite_ticket
因?yàn)閟uite_ticket是10分鐘一次post到上面的URL往核,但是我們接收到的是一段xml箫爷,然后我們需要用sdk的DecryptMsg函數(shù)解碼出真正明文的xml字符串
下面以python代碼為例子:
from WXBizMsgCrypt import WXBizMsgCrypt
wxcpt=WXBizMsgCrypt(sToken,sEncodingAESKey,sCorpID)
ret,sMsg=wxcpt.DecryptMsg( sReqData, sReqMsgSig, sReqTimeStamp, sReqNonce)
- sToken:應(yīng)用配置的回調(diào)配置的Token
- sEncodingAESKey:應(yīng)用配置的回調(diào)配置的EncodingAESKey
- sCorpID:企業(yè)微信的CorpID
- sRespData: 收到的xml字符串
- sReqNonce:GET參數(shù)nonce
- sReqTimeStamp:GET參數(shù)timestamp
- sReqMsgSig:GET參數(shù)msg_signature
- sMsg:解碼后的明文xml
總結(jié)
其實(shí)服務(wù)商模式的企業(yè)微信oauth跟普通微信公眾號的oauth就只有一點(diǎn)點(diǎn)差別,首先獲取的access_token需要一個動態(tài)參數(shù)值聂儒,其中這個參數(shù)值是企業(yè)微信服務(wù)器定時發(fā)送到我們的服務(wù)器的虎锚。
然后我們調(diào)用的一些API是有IP限制的,這個需要在服務(wù)商后臺配置白名單(作用域是整個服務(wù)商所有應(yīng)用)
注意:本文寫于2017年12月19日衩婚,僅代表當(dāng)前可用窜护,不保證之后升級策略導(dǎo)致的影響
本文首發(fā)于:http://blog.yubangweb.com/qi-ye-wei-xin-fu-wu-shang-mo-shi-oauth/