最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python項目對接釘釘SDK的實現(xiàn)

 更新時間:2019年07月15日 15:17:16   作者:宅神kin  
這篇文章主要介紹了python項目對接釘釘SDK的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

 釘釘SDK

對接sdk還是遇到不少問題的

釘釘python版SDK文檔地址:https://dingtalk-sdk.readthedocs.io/zh_CN/latest/

釘釘官方服務端文檔:https://open-doc.dingtalk.com/microapp/serverapi2

為了避免調(diào)試出現(xiàn)不必要的參數(shù)錯誤,前期釘釘配置要做好,血和淚的教訓😭

準備好下面幾個參數(shù)

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="http://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/oauth2/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/oauth2/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)頁面路由后添加codestate參數(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容易拿,問題在于encryptmsg_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

三. 調(diào)試

# 釘釘內(nèi)網(wǎng)穿透工具,主要作用是方便本地調(diào)試需要回調(diào)域名的接口
# 地址: https://open-doc.dingtalk.com/microapp/debug/ucof2g
可以后臺啟動

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • .img/.hdr格式轉(zhuǎn).nii格式的操作

    .img/.hdr格式轉(zhuǎn).nii格式的操作

    這篇文章主要介紹了.img/.hdr格式轉(zhuǎn).nii格式的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python程序自動以管理員權(quán)限運行的實現(xiàn)方法

    Python程序自動以管理員權(quán)限運行的實現(xiàn)方法

    Windows上為了安全起見,python語言啟動的應用程序默認都不會使用admin管理員權(quán)限,但是在有些情況下我們又需要使用管理員權(quán)限啟動應用,這篇文章主要給大家介紹了關(guān)于Python程序自動以管理員權(quán)限運行的實現(xiàn)方法,需要的朋友可以參考下
    2023-11-11
  • nginx黑名單和django限速,最簡單的防惡意請求方法分享

    nginx黑名單和django限速,最簡單的防惡意請求方法分享

    今天小編就為大家分享一篇nginx黑名單和django限速,最簡單的防惡意請求方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • 學懂Python字符編碼避免亂碼陷阱

    學懂Python字符編碼避免亂碼陷阱

    在Python編程中,處理字符編碼和亂碼問題是一個常見的挑戰(zhàn),特別是在處理文本數(shù)據(jù)、文件輸入/輸出和網(wǎng)絡(luò)通信時,可能會遇到各種字符編碼問題,本文章將深入探討Python中的亂碼問題,解釋其原理,并提供解決辦法,以確保你的應用程序能夠正確處理各種編碼情況
    2023-12-12
  • Python format補0的實現(xiàn)方法

    Python format補0的實現(xiàn)方法

    對于一些數(shù)字的處理,我們可能需要讓它們滿足一定格式的要求,本文主要介紹了Python format補0的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • 8種Python異常檢測算法總結(jié)

    8種Python異常檢測算法總結(jié)

    異常檢測是通過數(shù)據(jù)挖掘方法發(fā)現(xiàn)與數(shù)據(jù)集分布不一致的異常數(shù)據(jù),也被稱為離群點、異常值檢測等等。本文為大家整理了8個常見的Python異常檢測算法,希望對大家有所幫助
    2023-02-02
  • python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能示例

    python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能示例

    這篇文章主要介紹了python實現(xiàn)的登錄與提交表單數(shù)據(jù)功能,結(jié)合實例形式分析了Python表單登錄相關(guān)的請求與響應操作實現(xiàn)技巧,需要的朋友可以參考下
    2019-09-09
  • peewee創(chuàng)建連接前的前置操作wireshark抓包實現(xiàn)

    peewee創(chuàng)建連接前的前置操作wireshark抓包實現(xiàn)

    這篇文章主要為大家介紹了peewee創(chuàng)建連接前的前置操作wireshark?抓包實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • Python配置pip國內(nèi)鏡像源的實現(xiàn)

    Python配置pip國內(nèi)鏡像源的實現(xiàn)

    這篇文章主要介紹了Python配置pip國內(nèi)鏡像源的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • django如何自己創(chuàng)建一個中間件

    django如何自己創(chuàng)建一個中間件

    這篇文章主要介紹了django如何自己創(chuàng)建一個中間件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-07-07

最新評論

彰武县| 鲁山县| 六枝特区| 黄龙县| 紫云| 甘南县| 资中县| 深水埗区| 长岛县| 富阳市| 桑日县| 濮阳县| 临沧市| 将乐县| 蓬莱市| 理塘县| 天柱县| 方山县| 江油市| 南京市| 佛坪县| 靖边县| 淅川县| 海兴县| 济源市| 旺苍县| 德钦县| 邮箱| 磐石市| 南安市| 阿拉善左旗| 洛阳市| 望谟县| 靖州| 尼玛县| 怀仁县| 出国| 玛多县| 林口县| 井研县| 廉江市|