亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

python項目對接釘釘SDK的實現

系統 2058 0

?釘釘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. 流程

釘釘掃碼―>判斷是否公司員工―>登錄

python項目對接釘釘SDK的實現_第1張圖片

python項目對接釘釘SDK的實現_第2張圖片

關于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

python項目對接釘釘SDK的實現_第3張圖片

就是說你調用注冊事件API,釘釘會給你需要注冊的url發送一個post請求,你得按要求返回success,否則注冊失敗

1.注冊事件

python項目對接釘釘SDK的實現_第4張圖片

再看看什么是 success 的加密json數據

python項目對接釘釘SDK的實現_第5張圖片

如果你沒有看懂的話,很巧 我也看不懂…

json數據包含這些參數

python項目對接釘釘SDK的實現_第6張圖片

時間戳和 nonce 容易拿,問題在于 encrypt msg_signature 的生成

因為釘釘沒有提供python的加解密庫,所以看到這塊我有點懵

python項目對接釘釘SDK的實現_第7張圖片

釘釘的文檔看不太懂…

python項目對接釘釘SDK的實現_第8張圖片

百度搜了下 發現有人自己封裝了這個庫,我看了下名字 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的源碼

python項目對接釘釘SDK的實現_第9張圖片

在開始定義 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元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产中文 | a毛片视频免费观看影院 | 四虎hu| videoxxoo欧美老师 | 成人在线免费观看视频 | 伊人中文在线 | 久久99热成人精品国产 | 国产精品天干天干 | 久久精品视屏 | 亚洲欧美日韩综合一区久久 | h视频日本 | 欧美一级永久免费毛片在线 | 欧美综合国产 | 欧美成人亚洲国产精品 | 91精品国产免费久久国语麻豆 | 久久精品免视看国产成人2021 | 久久精品免费观看久久 | 亚洲成年网 | 亚洲高清中文字幕 | 亚洲综合亚洲 | 日本一级特大毛片 | 日本制服丝袜在线 | www.免费黄色 | 91成人精品视频 | 久久老色鬼天天综合网观看 | 国产高清不卡一区二区 | 四虎永久免费影院在线 | 欧美毛片在线播放观看 | 99精品久久久久久 | 欧美jizz18性欧美 | 一本久久a久久精品vr综合 | 久久99热成人精品国产 | 97久久国产一区二区三区四区 | 欧美一级视频在线观看 | 国产亚洲精品97在线观看 | 久草在线资源网 | 日韩久久久精品首页 | 久久精品国产亚洲综合色 | 91成人午夜在线精品 | 国产成人综合久久 | 夜夜骑日日操 |