后台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修改参数即可