PHP端微信JS-SDK录音上传并转mp3和播放

Thinkphp5.0 的开发环境

微信配置和使用

    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);
	}

 

你可能感兴趣的:(master)