很长一段时间没有更新博客了,是因为最近比较忙,
接了2个项目实在抽不开身,这2天终于将项目交接了,
终于可以更新2篇文章,还是往常的套路,我们还是以
实战为主,分享实际案例,希望能够帮助到你们!
当然了你们可以更好的建议我分享一些什么内容给你们!
说正题,相信大家有用过微信公众号的语音录制功能,
我们要做的是,如何将录制的语音上传至微信平台,然后
再将语音本地持久化。
1、首先使用微信语音录制接口,获取signPackage在PHP里以前在微信地理定位有讲到,还是老方法将获取到的值返回,必要的!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <script src= "http://res.wx.qq.com/open/js/jweixin-1.0.0.js" ></script> <script> //语音 wx.config({ debug: false, appId: '<?php echo $signPackage["appId"];?>' , timestamp: '<?php echo $signPackage["timestamp"];?>' , nonceStr: '<?php echo $signPackage["nonceStr"];?>' , signature: '<?php echo $signPackage["signature"];?>' , jsApiList: [ 'startRecord' , 'stopRecord' , 'onVoiceRecordEnd' , 'playVoice' , 'stopVoice' , 'uploadVoice' , ] }); |
2、开始录制语音
1 | wx.startRecord(); |
3、获取localId
1 2 3 4 5 6 | wx.onVoiceRecordEnd({ // 录音时间超过一分钟没有停止的时候会执行 complete 回调 complete: function (res) { var localId = res.localId; } }); |
4、上传语音
1 2 3 4 5 6 7 | wx.uploadVoice({ localId: '' , // 需要上传的音频的本地ID,由stopRecord接口获得 isShowProgressTips: 1, // 默认为1,显示进度提示 success: function (res) { var serverId = res.serverId; // 返回音频的服务器端ID } }); |
上述这几点大家看下文档其实都会做,很简单,重点是语音上传之后,我们如何将文件本地化。
5、文件本地化接口地址
1 2 3 | //token和serverID不用多说,获取token的方法不必多介绍,serverid在上传之后会返回。 $url = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={$token}&media_id={$post['serverId']}" ; |
6、http get方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | function httpGet( $url ){ $ch = curl_init( $url ); curl_setopt( $ch ,CURLOPT_HEADER,0); curl_setopt( $ch ,CURLOPT_NOBODY,0); curl_setopt( $ch ,CURLOPT_SSL_VERIFYPEER,false); curl_setopt( $ch ,CURLOPT_SSL_VERIFYHOST,false); curl_setopt( $ch ,CURLOPT_RETURNTRANSFER,1); $package = curl_exec( $ch ); $http_info = curl_getinfo( $ch ); curl_close( $ch ); $res = array_merge ( array_merge ( array ( 'header' => $http_info )), array ( 'body' => $package )); return $res ; } |
7、保存下载的文件的方法
1 2 3 4 5 6 7 8 9 10 11 12 | function saveWeixinFile( $file_name , $file_content ){ $local_file = fopen ( $file_name , 'w' ); if (false !== $local_file ){ if (false !== fwrite( $local_file , $file_content )){ fclose( $local_file ); } else { return false; } } else { return false; } } |
8、调用下载和保存的方法
1 2 3 4 5 6 7 | $res = httpGet( $url ); //文件保存路径 $file_name = ROOT_PATH . 'public/uploads/audio/' . $post [ 'serverId' ]. '.mp3' ; $save = saveWeixinFile( $file_name , $res [ 'body' ]); if (false === $save ){ exit ( '音频文件本地化失败' ); } |
9、保存下来的音频文件为amr格式的,大家懂得audio是播放不了的,我们需要进行转码,而利用程序转码我们可以使用七牛云提供的转码存储,资源o s s化是必须的嘛。
七牛云这里就不做介绍了吧,直接帖代码,七牛云封装的上传转码类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | <?php namespace app\extra; use Qiniu\Auth; use Qiniu\Storage\BucketManager; use Qiniu\Storage\UploadManager; class Qiniu{ private $accessKey = '' ; private $secretKey = '' ; private $bucket = '' ; public function uploads( $media_id , $file_path ){ $auth = new Auth( $this ->accessKey, $this ->secretKey); $bucket = trim( $this ->bucket); $savekey = \Qiniu\base64_urlSafeEncode( $bucket . ':' . $media_id . '.mp3' ); //设置转码参数 $fops = "avthumb/mp3/ab/320k/ar/44100/acodec/libmp3lame" ; $fops = $fops . '|saveas/' . $savekey ; $policy = array ( 'persistentOps' => $fops ); $up_token = $auth ->uploadToken( $bucket , null, 3600, $policy ); $key = $media_id . '.mp3' ; //七牛云中保存的amr文件名 $uploadMgr = new UploadManager(); list( $ret , $err ) = $uploadMgr ->putFile( $up_token , $key , $file_path ); if ( $err !== null) { return false; } else { //此时七牛云中同一段音频文件有amr和MP3两个格式的两个文件同时存在 $bucketMgr = new BucketManager( $auth ); //为节省空间,删除amr格式文件 $bucketMgr -> delete ( $bucket , $key ); return $ret [ 'key' ]; } } } |
10、调用
1 | $up_audio = $qiniu ->uploads( $post [ 'serverId' ], $file_name ); |
11、处理商户业务逻辑
整理下业务逻辑
1、首先调用微信语音录制接口录制语音,
2、然后上传录制好的语音文件
3、a ja x将serverId传入后台使用http get方式下载语音文件,使文件本地化
4、本地化文件不能使用,我们使用七牛云存储将文件上传至云空间并转码返回能够播放的mp3文件地址。
问题:为何要将文件上传至七牛,犹豫http get下载的语音文件格式在h5中不能播放我们需要转码,第二是为了节约服务器资源。
友情提示:垃圾评论一律封号...