墨香年少 32 发布于 2021年12月21日 <?php class DingCallbackCrypto { private $m_token; private $m_encodingAesKey; private $m_corpId; function __construct() { $this->m_token = "AAAAAAAAAAAAA"; $this->m_encodingAesKey = "BBBBBBBBBBBBBBBBBBBBBBBB"; $this->m_corpId = "CCCCCCCCCCCCCC"; } public function getEncryptedMap($plain){ $timeStamp = time(); $pc = new Prpcrypt($this->m_encodingAesKey); $nonce= $pc->getRandomStr(); return $this->getEncryptedMapDetail($plain, $timeStamp, $nonce); } public function getEncryptedMapDetail($plain, $timeStamp, $nonce) { $pc = new Prpcrypt($this->m_encodingAesKey); $array = $pc->encrypt($plain, $this->m_corpId); $ret = $array[0]; if ($ret != 0) { throw new Exception('AES加密错误',ErrorCode::$EncryptAESError); } if ($timeStamp == null) { $timeStamp = time(); } $encrypt = $array[1]; $sha1 = new SHA1; $array = $sha1->getSHA1($this->m_token, $timeStamp, $nonce, $encrypt); $ret = $array[0]; if ($ret != 0) { throw new Exception('ComputeSignatureError',ErrorCode::$ComputeSignatureError); } $signature = $array[1]; $encryptMsg = json_encode(array( "msg_signature" => $signature, "encrypt" => $encrypt, "timeStamp" => $timeStamp, "nonce" => $nonce )); return $encryptMsg; } public function getDecryptMsg($signature, $timeStamp = null, $nonce, $encrypt) { if (strlen($this->m_encodingAesKey) != 43) { throw new Exception('IllegalAesKey',ErrorCode::$IllegalAesKey); } $pc = new Prpcrypt($this->m_encodingAesKey); if ($timeStamp == null) { $timeStamp = time(); } $sha1 = new SHA1; $array = $sha1->getSHA1($this->m_token, $timeStamp, $nonce, $encrypt); $ret = $array[0]; if ($ret != 0) { throw new Exception('ComputeSignatureError',ErrorCode::$ComputeSignatureError); } $verifySignature = $array[1]; if ($verifySignature != $signature) { throw new Exception('ValidateSignatureError',ErrorCode::$ValidateSignatureError); } $result = $pc->decrypt($encrypt, $this->m_corpId); if ($result[0] != 0) { throw new Exception('DecryptAESError',ErrorCode::$DecryptAESError); } $decryptMsg = $result[1]; return $decryptMsg; } } class SHA1 { public function getSHA1($token, $timestamp, $nonce, $encrypt_msg) { try { $array = array($encrypt_msg, $token, $timestamp, $nonce); sort($array, SORT_STRING); $str = implode($array); return array(ErrorCode::$OK, sha1($str)); } catch (Exception $e) { print $e . "\n"; return array(ErrorCode::$ComputeSignatureError, null); } } } class ErrorCode { public static $OK = 0; public static $IllegalAesKey = 900004; public static $ValidateSignatureError = 900005; public static $ComputeSignatureError = 900006; public static $EncryptAESError = 900007; public static $DecryptAESError = 900008; public static $ValidateSuiteKeyError = 900010; } class PKCS7Encoder { public static $block_size = 32; function encode($text) { $block_size = PKCS7Encoder::$block_size; $text_length = strlen($text); $amount_to_pad = PKCS7Encoder::$block_size - ($text_length % PKCS7Encoder::$block_size); if ($amount_to_pad == 0) { $amount_to_pad = PKCS7Encoder::block_size; } $pad_chr = chr($amount_to_pad); $tmp = ""; for ($index = 0; $index < $amount_to_pad; $index++) { $tmp .= $pad_chr; } return $text . $tmp; } function decode($text) { $pad = ord(substr($text, -1)); if ($pad < 1 || $pad > PKCS7Encoder::$block_size) { $pad = 0; } return substr($text, 0, (strlen($text) - $pad)); } } class Prpcrypt { public $key; function __construct($k) { $this->key = base64_decode($k . "="); } public function encrypt($text, $corpid) { try { $random = $this->getRandomStr(); $text = $random . pack("N", strlen($text)) . $text . $corpid; $iv = substr($this->key, 0, 16); $pkc_encoder = new PKCS7Encoder; $text = $pkc_encoder->encode($text); $encrypted = openssl_encrypt($text, 'AES-256-CBC', $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv ); return array(ErrorCode::$OK, base64_encode($encrypted)); } catch (Exception $e) { print $e; return array(ErrorCode::$EncryptAESError, null); } } public function decrypt($encrypted, $corpid) { try { $ciphertext_dec = base64_decode($encrypted); $iv = substr($this->key, 0, 16); $decrypted = 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($decrypted); 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; return array(ErrorCode::$DecryptAESError, null); } if ($from_corpid != $corpid) return array(ErrorCode::$ValidateSuiteKeyError, null); return array(0, $xml_content); } function getRandomStr() { $str = ""; $str_pol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($str_pol) - 1; for ($i = 0; $i < 16; $i++) { $str .= $str_pol[mt_rand(0, $max)]; } return $str; } } function dispatch(){ $crypt = new DingCallbackCrypto(); $res = $crypt->getEncryptedMap("success"); $data = json_decode($res); header('Content-type: application/json'); //echo '{"msg_signature":"'.$data->msg_signature.'","timeStamp":"'.$data->timeStamp.'","nonce":"'.$data->nonce.'","encrypt":"'.$data->encrypt.'"}';die(); echo json_encode($data);die(); //$text = $crypt->getDecryptMsg($data->msg_signature, $data->timeStamp, $data->nonce, $data->encrypt); //echo $text;die(); } dispatch(); ?> 目之所及,皆是回忆,心之所想,皆是过往 分享这篇帖子 链接帖子 分享到其他站点
墨香年少 32 发布于 2021年12月21日 <?php namespace FrontBundle\Controller; use AppBundle\Controller\BaseController; use Symfony\Component\HttpFoundation\Request; class EventController extends BaseController { public function indexAction(Request $request) { $crypt = new \AppBundle\Utils\DingCallbackCrypto(); $input = file_get_contents("php://input"); $input = json_decode($input); $encrypt = $input->encrypt; $decryptMsg = $crypt->getDecryptMsg($_GET['signature'], $_GET['timestamp'], $_GET['nonce'], $encrypt); $struct = json_decode($decryptMsg,true); switch($struct['EventType']) { case "check_url": //检查url break; case "attendance_check_record": //员工打卡事件 $detail = $struct['DataList'][0]; //用户信息 $userId = $detail['userId']; $dduser = $this->db('User')->findOneBy(['userid'=>$userId]); $name = $dduser ? $dduser->getName() : ''; //打卡时间 $checkTime = substr($detail['checkTime'],0,10); $model = new \AppBundle\Entity\Attendance(); $model->setUserid($userId); $model->setName($name); $model->setY(date('Y',$checkTime)); $model->setM(date('n',$checkTime)); $model->setD(date('j',$checkTime)); $model->setH(date('G',$checkTime)); $model->setCheckTime($checkTime); $model->setMethod($detail['locationMethod']); $model->setSnapshot($decryptMsg); $model->setCreatedAt(time()); $this->save($model); break; case "user_add_org": //入职 break; case "user_leave_org": //离职 break; default: $file = '/www/Cache/default.txt'; $handle = fopen($file,"a+"); fwrite($handle,$decryptMsg); fclose($handle); break; } $res = $crypt->getEncryptedMap("success"); $data = json_decode($res); echo json_encode($data);die(); } } 目之所及,皆是回忆,心之所想,皆是过往 分享这篇帖子 链接帖子 分享到其他站点