?釘釘SDK
對接sdk還是遇到不少問題的
釘釘python版SDK文檔地址:https://dingtalk-sdk.readthedocs.io/zh_CN/latest/
釘釘官方服務端文檔:https://open-doc.dingtalk.com/microapp/serverapi2
為了避免調試出現不必要的參數錯誤,前期釘釘配置要做好,血和淚的教訓
準備好下面幾個參數
DINGTALK_CORP_ID = "重點:企業應用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網站掃碼登錄1. 流程
釘釘掃碼―>判斷是否公司員工―>登錄
關于web系統的兩種接入方式,都只能獲取到用戶的釘釘身份,并不能獲取到用戶是否在企業中
解決方法:
批量同步 釘釘人員信息到數據庫,登錄后匹配數據庫,新進員工通過 釘釘回調 同步到數據庫,回調未生效人工審核后 手動更新 數據庫
由于釘釘開發文檔讀的不夠仔細導致調試頻繁出錯,所以開發流程我簡單說,把細節放大
前端導入 釘釘scrpit文件 開發掃碼頁面
配置掃碼后跳轉頁面(
就是第一步goto參數里的url
),釘釘會自動在跳轉頁面路由后添加
code
和
state
參數
拿到code請求后端接口
后端用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網站,沒有使用E應用,所以我的corp_id填的是微應用的id,而不是企業應用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"])
二. 加解密
應用場景: 釘釘回調
事件流程:注冊回調事件―>處理事件內容(新增員工、更新部門等),返回釘釘加密json
就是說你調用注冊事件API,釘釘會給你需要注冊的url發送一個post請求,你得按要求返回success,否則注冊失敗
1.注冊事件
再看看什么是
success
的加密json數據
如果你沒有看懂的話,很巧 我也看不懂…
json數據包含這些參數
時間戳和
nonce
容易拿,問題在于
encrypt
和
msg_signature
的生成
因為釘釘沒有提供python的加解密庫,所以看到這塊我有點懵
釘釘的文檔看不太懂…
百度搜了下 發現有人自己封裝了這個庫,我看了下名字
XXXcrypto
,
crypto這個單詞
好像在sdk里邊見過。
看了sdk目錄,果然,雖然釘釘sdk雖然沒寫關于加解密的內容,但是它其實已經封裝了這個庫
使用
from dingtalk.crypto import DingTalkCrypto class Crypto(object): def __init__(self): # 隨便填的字符串 self.token = DINGTALK_TOKEN # 自己生成的43位隨機字符串 self.aes_key = DINGTALK_AES_TOKEN # 釘釘企業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
的時候,只需要填參數就可以,經過我反復的調試,發現因為我開發的是企業內部應用-微應用,而不是E應用,所以這里填的corp_id其實是微應用
app_key
,參數不正確導致后邊調試一直返回
文本非success
錯誤,為了不與上邊填的參數沖突,所以自己封裝
Crypto
類,填寫的corp_id是
企業應用id
封裝好
Crypto
這個類,就可以調用啦, 先測試返回給釘釘的結果是否正確
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
事情沒這么容易結束…
這個post方法你需要對回調事件作出處理而不是僅僅返回success,所以最終需要這樣, 對結果進行處理
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可以把字符串轉為字典,否則取值失敗 # 安裝 pip install demjson callback = demjson.decode(callback) # 判斷事件類型,作出相應回調 if callback["EventType"] == "user_add_org": # 添加員工 ... elif callback["EventType"] == "org_dept_create": # 添加部門 ... return result
三. 調試
# 釘釘內網穿透工具,主要作用是方便本地調試需要回調域名的接口 # 地址: https://open-doc.dingtalk.com/microapp/debug/ucof2g 可以后臺啟動
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
