phpアクセスDingding登録コールバック

フレームワークの例-Yii2.0 + mysql + crm + crm管理システム

1:まず、DingTalkが提供する公式のphp暗号化デモをダウンロードする必要があります
ここに画像の説明を挿入

2:登録承認コールバックを行っているブロガーはすでにDingding SDKに接続していると思います。アクセスプロセスを1つずつ表示しません-コード例を直接開始します(覚えておくにはaeskeyは43である必要があります)
ここに画像の説明を挿入

3:公式のオープンプラットフォームによって提供されるPHPデモ:pkcs7Encoder.phpファイルの変更

function Prpcrypt($ k){ 
    $ this-> key = base64_decode($ k。 "=");}コンストラクター形式に変更:function __construct($ k){ 
    $ this-> key = base64_decode($ k。 "= ");} 12345678

4:公式のオープンプラットフォームによって提供されるPHPデモ:DingtalkCrypt.phpファイルの変更

//暗号
	化パブリック関数encrypt($ text、$ corpid)
	{ 
		try { 
			// 16ビットのランダムな文字列を取得し、プレーンテキストの前に入力します
			$ random = $ this-> getRandomStr(); 
			$ text = $ random。Pack ( "N"、strlen($ text))。$ text。$ corpid; 
			//ネットワークバイトオーダー
			// $ size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128、MCRYPT_MODE_CBC); 
			// $ module = mcrypt_module_open(MCRYPT_RIJNDAEL_128、 ''、MCRYPT_MODE_CBC、 ' '); 
			$ iv = substr($ this-> key、
			0、16 ); 
			//カスタムパディングメソッドを使用してプレーンテキストを埋める$ pkc_encoder = new PKCS7Encoder; 
			$ text = $ pkc_encoder-> encode($ text); 
			/ / mcrypt_generic_init($ module、$ this-> key、$ iv); 
			////
			暗号化// $ encoding = mcrypt_generic($ module、$ text);
			// mcrypt_generic_deinit($ module); 
			// mcrypt_module_close($ module);

			// print(base64_encode($ encoding)); 
			//使用BASE64对加密后的字符串进行编码
			$暗号化= openssl_encrypt($テキスト、 'AES-256-CBC'の$ this - >キー、OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING、$ IV); 
			配列を返す(ErrorCode :: $ OK、base64_encode($暗号化)); 
		} catch(Exception $ e){ 
			print $ e; 
			配列を返す(ErrorCode :: $ EncryptAESError、null); 
		} 
	} 
	//解密
	パブリック関数decrypt($ encoding、$ corpid)
	{ 
		try { 
			$ ciphertext_dec = base64_decode($ encoding); 
			// $ module = mcrypt_module_open(MCRYPT_RIJNDAEL_128、 ''、MCRYPT_MODE_CBC、 ''); 
			$ iv = substr($ this-> key、0、16);
			// mcrypt_generic_init($ module、$ this-> key、$ iv); 
			// $ decoded = mdecrypt_generic($ module、$ ciphertext_dec); 
			// mcrypt_generic_deinit($ module); 
			// mcrypt_module_close($ module); 
			$ decodet = openssl_decrypt($ ciphertext_dec、 'AES-256-CBC'、$ this-> key、OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING、$ iv); 
		} catch(Exception $ e){ 
			return array(ErrorCode :: $ DecryptAESError、null); 
		} 
		try { 
			//去除补位文字符
			$ pkc_encoder = new PKCS7Encoder; 
			$ result = $ pkc_encoder-> decode($ decoded); 
			//去除16位入机文字列串、0042络字节序和AppId 
			if(strlen($ result)<16)
				return ""; 
			$ content = substr($ result、16、strlen($ result));
			$ len_list = unpack( "N"、substr($ content、0、4)); 
			$ xml_len = $ len_list [1]; 
			$ xml_content = substr($ content、4、$ xml_len); 
			$ from_corpid = substr($ content、$ xml_len + 4);  
		} catch(Exception $ e){ 
			print $ e;
			配列を返す(ErrorCode :: $ DecryptAESError、null); 
		} 
		if($ from_corpid!= $ corpid)
			return array(ErrorCode :: $ ValidateSuiteKeyError、null); 
		array(0、$ xml_content);を返します。

	} 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465

6:コールバックURLの例をテストする

public function actionReceiveCallBack(){ 
        //値のサインタイムスタンプを受信   
        $ signature = $ _ GET ['signature'];     
        $ nonce = $ _ GET ['nonce'];          
        $ timeStamp = $ _ GET ['timestamp']; 
        $ suiteKey = Yii: :$ app-> params ['corpid']; //必須、エンタープライズID 
        $ token = "dingtalk"; //登録時と同じである必要があります//
        復号化する必要のある渡された値を受け取ります
        $ postdata = file_get_contents( "php:// input"); 
        $ postList = json_decode($ postdata、true); 
        $ encrypt = $ postList ['encrypt']; 
        //登録時に暗号化されたキー
        $ aesKey = \ Yii :: $ app-> params [ 'aes_key'];     
        $ aes_key_encode = base64_encode($ aesKey); 
        $ aes_key = substr($ aes_key_encode、0、-1);
        $ decodeMsg = "";
        $ crypt = new DingCallbackCrypt($ token、$ aes_key、$ suiteKey); 
        $ encryData = $ crypt-> DecryptMsg($シグニチャ、$タイムスタンプ、$ノンス、$暗号化、$復号化Msg); //解密
        if($ encryData ['errcode']!== 0){ 
         
        } else { 
            if($ newData-> EventType == "bpms_task_change" || $ newData-> EventType == "bpms_instance_change"){ 
                    $ dingtalk =新しいDingtalkController(); 
                    $ dingtalk-> UpdateProcess($ newData-> processInstanceId); 
            } 
            $ msg = "success"; 
            $ encryptMsg = ""; 
            $ data = $ crypt-> EncryptMsg($ msg、$ timeStamp、$ nonce、$ encryptMsg); //加密
            if($ data ['errcode']!= 0){
               
                return $ data ['data']; //暗号化されたjsonデータを返す 
            }     
        } 
    } 1234567891011121314151617181920212223242526272829303132333435

私は登録されたイベントを直接書くためにここにいます、そしてあなたは他の変更を登録する必要があります。

  1. DingTalkビジネスイベントコールバック-コールバック管理API

  2. コールバックイベントメッセージ本文の暗号化

おすすめ

転載: blog.csdn.net/an17822307871/article/details/113878603