跳转到帖子
登录关注  
墨香年少

钉钉应用开启事件订阅的代码

已推荐帖子

<?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();
?>

 


目之所及,皆是回忆,心之所想,皆是过往

分享这篇帖子


链接帖子
分享到其他站点
<?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();
    }
    
}


目之所及,皆是回忆,心之所想,皆是过往

分享这篇帖子


链接帖子
分享到其他站点

创建帐户或登录来提出意见

你需要成为会员才能提出意见

创建帐户

注册成为会员。只要几个简单步骤!

注册帐户

登录

已有帐户? 请登录。

现在登录
登录关注  

×
×
  • 创建新的...

重要信息

注册必须使用2-8个中文汉字作为账号