PHP端微信JS-SDK録音アップロードとmp 3再生
4978 ワード
Thinkphp5.0の開発環境
WeChatの構成と使用
サーバ処理への録音保存
ファイルの保存
WeChatの構成と使用
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0; $i < $length; $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
/**
* access_token
* @return array access_token
*/
public function getAccessToken() {
if(!\think\Cache::get('access_token')){
$res = $this->http('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $this->config['appid'] . '&secret=' . $this->config['appsecret']);
if (!$res) {
$this->errorMsg = 'CURL ';
return false;
}
$resp = json_decode($res, true);
if (empty($resp['access_token'])) {
$this->errorCode($resp);
return false;
}
\think\Cache::set('access_token',$resp['access_token'],$resp['expires_in']);
return $resp['access_token'];
}else{
return \think\Cache::get('access_token');
}
}
public function getJsApiTicket() {
if(!\think\Cache::get('js_api_ticket')){
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = $this->http($url);
if (!$res) {
$this->errorMsg = 'CURL ';
return false;
}
$resp = json_decode($res, true);
if (empty($resp['ticket'])) {
$this->errorCode($resp);
return false;
}
\think\Cache::set('js_api_ticket',$resp['ticket'],$resp['expires_in']);
return $resp['ticket'];
}else{
return \think\Cache::get('js_api_ticket');
}
}
public function getSignPackage() {
$jsapiTicket = $this->getJsApiTicket();
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp = time();
$nonceStr = $this->createNonceStr();
// key ASCII
$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature = sha1($string);
$signPackage = array(
"appId" => $this->config['appid'],
"nonceStr" => $nonceStr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
return $signPackage;
}
public function get_sign_package(){
$jssdk = new \mumbaicat\my\Wechat();
$signPackage = $jssdk->getSignPackage();
return make_return_json(200,'success',$signPackage);
}
サーバ処理への録音保存
public function upload_voice(){
$jssdk = new \mumbaicat\my\Wechat();
$media_id = input('media_id');
$access_token = $jssdk->getAccessToken();
$path = "./uploads/voice"; // ,
$outPath = "/uploads/voice/"; // , show.php ,
if(!is_dir($path)){
mkdir($path);
}
//
$url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$access_token}&media_id={$media_id}";
$fname = "wxupload_".time().rand(1111,9999);
$filename = $fname.".amr";
$this->downAndSaveFile($url,$path."/".$filename);
$command = '/usr/bin/ffmpeg -i '.$path."/".$fname.'.amr '.$path."/".$fname.'.mp3';
// trace($command,'info');
exec($command);
// tarce($out,'info')
// composer require phansys/getid3
require '../vendor/phansys/getid3/GetId3/GetId3.php';
$getId3 = new \GetId3_GetId3();
$audio = @$getId3
// ->setOptionMD5Data(true)
// ->setOptionMD5DataSource(true)
// ->setEncoding('UTF-8')
->analyze($path."/".$fname.'.mp3');
return make_return_json(200,'success',[
'int' => round(@$audio['playtime_seconds'],0),
'time' => @$audio['playtime_seconds'],
'path' => $outPath.$fname.'.mp3',
]);
}
ファイルの保存
public function downAndSaveFile($url,$savePath){
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
$size = strlen($img);
$fp = fopen($savePath, 'a');
fwrite($fp, $img);
fclose($fp);
}