フレームワークの例-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
私は登録されたイベントを直接書くためにここにいます、そしてあなたは他の変更を登録する必要があります。