ピンコールバックイベント
ピンのコールバックイベントのリスト: user_add_org:通信録ユーザー増加 user_modify_org:通信録ユーザー変更 user_leave_org:通信録ユーザー離職 org_admin_add:通信録ユーザが管理者 に設定されている org_admin_remove:通信録ユーザーは管理者 の設定をキャンセルされました. org_dept_create:通信録企業部門作成 org_dept_modify:通信録企業部門修正 org_dept_remove:通信録企業部門削除 org_remove:企業が解散 org_change:企業情報変更 label_user_change:従業員ロール情報変更 label_conf_add:ロールまたはロールグループを追加 label_conf_del:ロールまたはロールグループの削除 label_conf_modify:ロールまたはロールグループの変更 また、サードパーティ企業アプリケーションの開発に際しては、コールバックURLにてsuite_をプッシュするticket.
すべてのコールバックイベントが発生したときにURL POSTデータにデータを復号する必要があります.
すべてのコールバックは、暗号化された文字列'seccess'のjsonデータをサーバに返す必要があります.
文字列の復号化について説明します.
https://open-doc.dingtalk.com/microapp/faquestions/ltr370これは、ドキュメントが与える復号化の方法です.
次にpythonを使用してプロセス全体を実装します.
そしてPOSTのデータを入手して'success'に戻ります
すべてのコールバックイベントが発生したときにURL POSTデータにデータを復号する必要があります.
{
"SuiteKey": "suitexxxxxx",
"EventType": "suite_ticket ",
"TimeStamp": 1234456,
"SuiteTicket": "adsadsad"
}
すべてのコールバックは、暗号化された文字列'seccess'のjsonデータをサーバに返す必要があります.
{
"msg_signature":"111108bb8e6dbce3c9671d6fdb69d15066227608",
"timestamp":"1783610513",
"nonce":"123456",
"encrypt":"1ojQf0NSvw2WPvW7LijxS8UvISr8pdDP+rXpPbcLGOmIBNbWetRg7IP0vdhVgkVwSoZBJeQwY2zhROsJq/HJ+q6tp1qhl9L1+ccC9ZjKs1wV5bmA9NoAWQiZ+7MpzQVq+j74rJQljdVyBdI/dGOvsnBSCxCVW0ISWX0vn9lYTuuHSoaxwCGylH9xRhYHL9bRDskBc7bO0FseHQQasdfghjkl" // "Random"
}
文字列の復号化について説明します.
https://open-doc.dingtalk.com/microapp/faquestions/ltr370これは、ドキュメントが与える復号化の方法です.
次にpythonを使用してプロセス全体を実装します.
from base64 import b64encode, b64decode
from Crypto.Cipher import AES
from hashlib import sha1
import struct, random,
class prpcrypt():
def __init__(self, key):
self.key = key
self.mode = AES.MODE_CBC
self.Aec_key = b64decode(self.key + '=')
def encrypt(self, text, key):
#
rand_txt = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
txt = ''.join(random.sample(rand_txt, 16))
text_len = struct.pack('!i', len(text)).decode()
crypto = AES.new(self.Aec_key, self.mode, self.key[:16])
text = txt + text_len + text + key
text = text + (16-len(text) % 16)*chr(16-len(text)%16)
ciphertext = crypto.encrypt(text)
return b64encode(ciphertext).decode().strip()
def decrypt(self, text):
#
crypto = AES.new(self.Aec_key, self.mode, self.key[:16])
plain_text = crypto.decrypt(b64decode(text))
raw = plain_text.rstrip(b'\0')
length = struct.unpack('!i', raw[16:20])[0]
return raw[20:20+length].decode().strip()
def gen_signature(self, token, timestamp, nonce, encrypt):
#
sign = sha1(''.join(sorted([token, timestamp, nonce, encrypt])).encode())
return sign.hexdigest()
そしてPOSTのデータを入手して'success'に戻ります
@csrf_exempt
def callback(request):
token = 'token' # token
aes_key = 'aes_key' #
suiteKey = 'suiteKey'
suiteSecret = 'suiteSecret'
crypt = prpcrypt(aes_key)
signature = request.GET.get('signature')
timestamp = request.GET.get('timestamp')
nonce = request.GET.get('nonce')
msg_encrypt = json.loads(request.body, encoding='utf-8').get('encrypt')
msg_signature = crypt.gen_signature(token, timestamp, nonce, msg_encrypt)
if signature == msg_signature:
data = json.loads(crypt.decrypt(text=msg_encrypt))
EventType = data.get('EventType')
( EventType )...
# encrypt = crypt.encrypt("success", suiteKey)
encrypt = crypt.encrypt("success", corpId)
result = json.dumps(dict(
encrypt=encrypt,
msg_signature=crypt.gen_signature(token, timestamp, nonce, encrypt),
nonce=nonce,
timeStamp=timestamp,
))
return HttpResponse(result)