python項目對接釘釘SDK的實現(xiàn)?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。
成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供鹽湖網(wǎng)站建設、鹽湖做網(wǎng)站、鹽湖網(wǎng)站設計、鹽湖網(wǎng)站制作等企業(yè)網(wǎng)站建設、網(wǎng)頁設計與制作、鹽湖企業(yè)網(wǎng)站模板建站服務,十余年鹽湖做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡服務。DINGTALK_CORP_ID = "重點:企業(yè)應用ID" # 釘釘微應用 DINGTALK_APP_KEY = "微應用APP_KEY" DINGTALK_CORP_SECRET = "微應用SERCRET" # 釘釘移動應用(掃碼登錄),在移動應用接入菜單里配置 DINGTALK_APP_ID = "移動應用APP_ID" DINGTALK_APP_SECRET = "移動應用APP_SECRET" # 釘釘aes加密(隨機) DINGTALK_AES_TOKEN = "43位字符串 a-zA-Z0-9中生成" DINGTALK_TOKEN = "字符串隨便填"
一. 第三方web網(wǎng)站掃碼登錄1. 流程
釘釘掃碼—>判斷是否公司員工—>登錄
關(guān)于web系統(tǒng)的兩種接入方式,都只能獲取到用戶的釘釘身份,并不能獲取到用戶是否在企業(yè)中
解決方法:
批量同步釘釘人員信息到數(shù)據(jù)庫,登錄后匹配數(shù)據(jù)庫,新進員工通過釘釘回調(diào)同步到數(shù)據(jù)庫,回調(diào)未生效人工審核后手動更新數(shù)據(jù)庫
由于釘釘開發(fā)文檔讀的不夠仔細導致調(diào)試頻繁出錯,所以開發(fā)流程我簡單說,把細節(jié)放大
前端導入釘釘scrpit文件開發(fā)掃碼頁面
<script src="//g.alicdn.com/dingding/dinglogin/0.0.5/ddLogin.js"></script> <script> var url="http://erp.vaiwan.com/api/v1.0/ding_test"; var goto = encodeURIComponent('https://oapi.dingtalk.com/connect/oauth3/sns_authorize?appid=dingoadwjj1iszubeh9rnf&response_type=code&scope=snsapi_login&state=STATE&redirect_uri='+url); var obj = DDLogin({ id:"login_container", goto: goto, style: "border:none;background-color:#FFFFFF;", width : "365", height: "400" }); var hanndleMessage = function (event) { var origin = event.origin; console.log("origin", event.origin); //判斷是否來自ddLogin掃碼事件。 if( origin == "https://login.dingtalk.com" ) { //拿到loginTmpCode后就可以在這里構(gòu)造跳轉(zhuǎn)鏈接進行跳轉(zhuǎn)了 var loginTmpCode = event.data; console.log("loginTmpCode", loginTmpCode); if(loginTmpCode){ let uri="https://oapi.dingtalk.com/connect/oauth3/sns_authorize?appid=dingoadwjj1iszubeh9rnf&response_type=code&scope=snsapi_login&state=STATE&redirect_uri="+url+"&loginTmpCode="+loginTmpCode; // 跳轉(zhuǎn) location.href = uri; } } }; if (typeof window.addEventListener != 'undefined') { window.addEventListener('message', hanndleMessage, false); } else if (typeof window.attachEvent != 'undefined') { window.attachEvent('onmessage', hanndleMessage); } </script>
配置掃碼后跳轉(zhuǎn)頁面(就是第一步goto參數(shù)里的url),釘釘會自動在跳轉(zhuǎn)頁面路由后添加code
和state
參數(shù)
拿到code請求后端接口
<script src="https://cdn.bootcss.com/jquery/3.1.0/jquery.min.js"></script> <script> // location.search: "?code=bb42ec66ed5...&state=STATE" let code = location.search.split("&")[0].split("=")[1]; $.ajax({ type:"post", url:'http://erp.vaiwan.com.cn/api/v1.0/getinfo', data:{ "code":code }, success:function(data){ console.log(data) } }) </script>
后端用appid和appsecret獲取access_token
import requests from dingtalk.client import SecretClient class GetInfoByCode(object): def __init__(self): self.url = "https://oapi.dingtalk.com/sns" def get_access_token(self): resp = requests.get( url=self.url + "/gettoken", params=dict(appid=DINGTALK_APP_ID, appsecret=DINGTALK_APP_SECRET) ) resp = resp.json() return resp["access_token"]
用access_token和code獲取用戶unionid
def get_persistent_code(self, code, token): resp = requests.post( url="%s/get_persistent_code?access_token=%s" % (self.url, token), json=dict(tmp_auth_code=code), ) resp = resp.json() return resp["unionid"]
用unionid換取userid
ding_client = SecretClient(corp_id=DINGTALK_CORP_ID, corp_secret=DINGTALK_CORP_SECRET) # 這塊提醒下一定要做緩存,由于我之前沒做緩存,超過釘釘使用頻率而被限制了,修改下上面那句代碼 import redis from dingtalk.storage.kvstorage import KvStorage # redis做緩存 redis_ding = redis.StrictRedis(REDIS_HOST, REDIS_PORT, db=0) # 劃重點,因為我是第三方web網(wǎng)站,沒有使用E應用,所以我的corp_id填的是微應用的id,而不是企業(yè)應用ID(corp_id) ding_client = SecretClient( corp_id=DINGTALK_APP_KEY, corp_secret=DINGTALK_CORP_SECRET, storage=KvStorage(redis_ding)) userid = ding_client.user.get_userid_by_unionid(unionid)
userid換取user詳情
user = ding_client.user.get(userid["userid"])
二. 加解密
應用場景: 釘釘回調(diào)
事件流程:注冊回調(diào)事件—>處理事件內(nèi)容(新增員工、更新部門等),返回釘釘加密json
就是說你調(diào)用注冊事件API,釘釘會給你需要注冊的url發(fā)送一個post請求,你得按要求返回success,否則注冊失敗
1.注冊事件
再看看什么是success
的加密json數(shù)據(jù)
如果你沒有看懂的話,很巧 我也看不懂…
json數(shù)據(jù)包含這些參數(shù)
時間戳和nonce
容易拿,問題在于encrypt
和msg_signature
的生成
因為釘釘沒有提供python的加解密庫,所以看到這塊我有點懵
釘釘?shù)奈臋n看不太懂…
百度搜了下 發(fā)現(xiàn)有人自己封裝了這個庫,我看了下名字XXXcrypto
,crypto這個單詞
好像在sdk里邊見過。
看了sdk目錄,果然,雖然釘釘sdk雖然沒寫關(guān)于加解密的內(nèi)容,但是它其實已經(jīng)封裝了這個庫
使用
from dingtalk.crypto import DingTalkCrypto class Crypto(object): def __init__(self): # 隨便填的字符串 self.token = DINGTALK_TOKEN # 自己生成的43位隨機字符串 self.aes_key = DINGTALK_AES_TOKEN # 釘釘企業(yè)ID self.corpid = DINGTALK_APP_ID self.crypto = DingTalkCrypto( token=self.token, encoding_aes_key=self.aes_key, corpid_or_suitekey=self.corpid )
說明
原本是不需要自己封裝的??磀ingtalk的源碼
在開始定義ding_client
的時候,只需要填參數(shù)就可以,經(jīng)過我反復的調(diào)試,發(fā)現(xiàn)因為我開發(fā)的是企業(yè)內(nèi)部應用-微應用,而不是E應用,所以這里填的corp_id其實是微應用app_key
,參數(shù)不正確導致后邊調(diào)試一直返回文本非success
錯誤,為了不與上邊填的參數(shù)沖突,所以自己封裝Crypto
類,填寫的corp_id是企業(yè)應用id
封裝好Crypto
這個類,就可以調(diào)用啦, 先測試返回給釘釘?shù)慕Y(jié)果是否正確
from ... import Crypto class EventCallBack(Resource): def __init__(self): self.crypto = Crypto().crypto def post(self): # 返回加密success result = self.crypto.encrypt_message( msg="success", nonce="123456", timestamp=int(time.time()*1000) ) return result
事情沒這么容易結(jié)束…
這個post方法你需要對回調(diào)事件作出處理而不是僅僅返回success,所以最終需要這樣, 對結(jié)果進行處理
def post(self): po = request.json["encrypt"] data = request.values # 返回加密success result = self.crypto.encrypt_message( msg="success", nonce="123456", timestamp=int(time.time()*1000) ) # 獲取到事件及其他信息 callback = self.crypto.decrypt_encrypt_str( encrypt_str=po, nonce=data["nonce"], timestamp=data["timestamp"], signature=data["signature"] ) # demjson可以把字符串轉(zhuǎn)為字典,否則取值失敗 # 安裝 pip install demjson callback = demjson.decode(callback) # 判斷事件類型,作出相應回調(diào) if callback["EventType"] == "user_add_org": # 添加員工 ... elif callback["EventType"] == "org_dept_create": # 添加部門 ... return result
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識有進一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。
網(wǎng)站名稱:python項目對接釘釘SDK的實現(xiàn)-創(chuàng)新互聯(lián)
標題路徑:http://aaarwkj.com/article8/deddop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、靜態(tài)網(wǎng)站、全網(wǎng)營銷推廣、外貿(mào)網(wǎng)站建設、網(wǎng)站策劃、服務器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容