ピンコールバックイベント


ピンのコールバックイベントのリスト:
  • 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データにデータを復号する必要があります.
    {
      "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)