腾讯云通讯IM

后台php

static private $private_key_string = <<<'EOT'
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQg1vO5O6aTwatkxuTx
EO40+4t3og2hfOAsxyLAelcL6sChRANCAATL0UvOyVnE78Y8GjUFSwlA7ze/1X8z
eHD4lOYF1DWhf0yrIUtA6cCU/5ysnAr3QARkhsNg3wM2Dkw206POqpVN
-----END PRIVATE KEY-----
EOT;

public function getSig(){
/**************************************************************************/
        // 生成用户 IM 签名

        $sig = $this->genSig($nickName);//生成usersig
$dataReturn['sig'] = $sig;
            $dataReturn['identifier'] = $nickName;
            $dataReturn['avChatRoomId'] = $avChatRoomId;
            response('0',$dataReturn);
}
 /**
     * 生成usersig
     * @param string $identifier 用户名
     * @param uint $expire usersig有效期 默认为180天
     * @return string 生成的UserSig 失败时为false
     */
    public function genSig($identifier, $expire = 15552001) {
        $json = Array(
            'TLS.account_type' => '0',
            'TLS.identifier' => $identifier,
            'TLS.appid_at_3rd' => '0',
            'TLS.sdk_appid' => '1400187604',
            'TLS.expire_after' => (string) $expire,
            'TLS.version' => '201512300001',
            'TLS.time' => (string) time()
        );
        $err = '';
        $content = $this->genSignContent($json, $err);
        $signature = $this->signs($content, $err);

        $json['TLS.sig'] = base64_encode($signature);

        if ($json['TLS.sig'] === false) {
            throw new \Exception('base64_encode error');
        }
        $json_text = json_encode($json);
        if ($json_text === false) {
            throw new \Exception('json_encode error');
        }
        $compressed = gzcompress($json_text);
        if ($compressed === false) {
            throw new \Exception('gzcompress error');
        }

        return $this->base64Encode($compressed);
    }

    /**
     * 根据json内容生成需要签名的buf串
     * @param array $json 票据json对象
     * @return string 按标准格式生成的用于签名的字符串
     * 失败时返回false
     */
    private function genSignContent(array $json) {
        $content = '';
        static $aid3rd = 'TLS.appid_at_3rd';
        if(isset($json[$aid3rd])) {
            $content .= "{$aid3rd}:{$json[$aid3rd]}\n";
        }
        static $members = Array(
            'TLS.account_type',
            'TLS.identifier',
            'TLS.sdk_appid',
            'TLS.time',
            'TLS.expire_after'
        );
        foreach ($members as $member) {
            if (!isset($json[$member])) {
                throw new \Exception('json need ' . $member);
            }
            $content .= "{$member}:{$json[$member]}\n";
        }
        return $content;
    }

    /**
     * ECDSA-SHA256签名
     * @param string $data 需要签名的数据
     * @return string 返回签名 失败时返回false
     */
    private function signs($data) {
        $signature = '';
        if (!openssl_sign($data, $signature, self::$private_key_string, 'SHA256')) {
            throw new \Exception(openssl_error_string());
        }

        return $signature;
    }


    /**
     * 用于url的base64encode
     * '+' => '*', '/' => '-', '=' => '_'
     * @param string $string 需要编码的数据
     * @return string 编码后的base64串,失败返回false
     */
    private function base64Encode($string) {
        static $replace = Array('+' => '*', '/' => '-', '=' => '_');
        $base64 = base64_encode($string);
        if ($base64 === false) {
            throw new \Exception('base64_encode error');
        }
        return str_replace(array_keys($replace), array_values($replace), $base64);
    }

    // 生成管道id
    public function getAvChatRoomId()
    {
        //日期:10位 timestamp
        $datetime = time();
        //随机数
        $newnum = $this->getNonceNums();
        return $datetime . $newnum;
    }

    //生成随机数字
    function getNonceNums($numLen = 4)
    {
        $chars = "0123456789";
        $str = "";
        for ($i = 0; $i < $numLen; $i++) {
            $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
        }
        return $str;
    }

小程序前端

下载demo修改参数即可

猜你喜欢

转载自blog.csdn.net/Neil_1993/article/details/87975458