您的位置:首页 > 移动开发 > 微信开发

微信永久素材上传视频并通过mediaid获取微信url调用视频

2016-12-20 18:43 1196 查看
摘要: 微信新增永久素材接口,获取永久素材接口,上传视频,调用视频,PHP

今天解决一个调用微信永久素材上传视频的问题,在网上查了很久,上传视频的接口写的都不一样而且到处复制,感觉很乱,于是在做完case之后做了一个整理,希望能够帮助到你们.

涉及到如何调用微信永久素材上传视频以及上传后如何通过mediaid和获取永久素材接口得到该视频对应的url的,然后保存至本地,然后通过调用微信的url直接读取视频,拿默认回复中的视频来举例。(YII1框架)

首先:

前端页面中一个上传按钮,在上传了之后通过js回调将视频文件先上传到服务器上对应的文件夹中,这个没什么好说的。

[code=plain]jQuery('#video_upload').dmUploader({
url: '<?php echo Yii::app()->createAbsoluteUrl('Manager/DefaultMessages/videoUpload'); ?>',
dataType : 'json',
fileName : 'upload',
allowedTypes : 'video/*',
maxFileSize : 10485760,

onUploadSuccess: function(id, data){
if(data.result == 'success'){
videoUpload.find('video').attr('src',data.url);
}else{
alert(data.result);
}
},
onFileSizeError: function(file){
alert('<?php echo Yii::t("manager", "Unsupported file size!"); ?>')
},
onFileTypeError: function(file){
alert('<?php echo Yii::t("manager", "Unsupported file type!"); ?>')
}
});

这个是Controller中上传video的方法

[code=plain]public function actionVideoUpload(){
$fileName = $_FILES['upload']['name'];
$extensions = array('.mp4');
$extensionName = '';
foreach ($extensions as $extension) {
if(stripos($fileName, $extension) !== false){
$extensionName = $extension;
break;
}
}
if($extensionName){
$filePath = $_FILES['upload']['tmp_name'];
$des = dirname(__FILE__).'/../../../../upload/videos/defaultMessage/';
&nbs
3ff0
p;//目录及权限
if(!is_dir($des)){
mkdir($des, 0777, true);
}

$timeStamp = time();
//成功则返回服务器所在视频的地址
if(move_uploaded_file($filePath, $des.$timeStamp.$extensionName)){
echo json_encode(array('result'=>'success','url'=>'http://'.$_SERVER['HTTP_HOST'].'/upload/videos/defaultMessage/'.$timeStamp.$extensionName));
}else{
echo json_encode(array('result'=>'failed'));
}
}else{
echo json_encode(array('result'=>Yii::t('manager', 'Unsupported file type!')));
}
}

然后是save以后的处理。

[code=plain]public function actionModify()
{
//这里是我项目里面获取defaultmessage的内容的,不用看
$mid = Helper::getManagerId();
$model = DefaultMessages::model()->find('mid = :mid', array(':mid' => $mid));
if (!$model) {
$model = new DefaultMessages();
$model->mid = $mid;
}
if(isset($_POST['DefaultMessages']))
{
//上传或修改如果改变了视频,则同步上传到微信并保存微信的mediaId,这里根据前端自己做相应的判断,注意如果视频没有改变的话不要上传视频,否则素材空间很快就会满掉。
if($_POST['DefaultMessages']['replyType']==5&&($model->mediaId !=$_POST['DefaultMessages']['mediaId'])){
$filePath = $_POST['DefaultMessages']['mediaId'];
//微信需要的title
$video_title = substr($filePath,-14);
//视频所在服务器上的路径
$filePath= dirname(__FILE__).'/../../../../upload/videos/defaultMessage/'.$mid.$video_title;
//微信需要的introduction描述
$introduction = 'default_message_video';
//上传并获取media_id
$media_id = Media::addMaterial($mid, 'video', $filePath,true, $video_title, $introduction);
//通过mediaid调用获取永久素材接口获取微信视频存储的url
$wechat_url = Media::getMaterial($mid,$media_id);
//保存mediaid为微信视频存放的url
$_POST['DefaultMessages']['mediaId'] = $wechat_url;

$model->attributes=$_POST['DefaultMessages'];
}
if ($model->save()) {
$this->redirect(array('modify'));
}else{
var_dump($model->getErrors());die();
}
}
$this->render('modify', array(
'model' => $model,
));
}

上面调用的addmaterial函数

[code=plain]public static function addMaterial($mid, $type, $filePath, $is_video=false, $video_title='', $introduction='')
{
$json = WechatMedia::addMaterial(AccessToken::getAccessToken($mid), $type, $filePath, $is_video, $video_title, $introduction);//下面有函数,token的拼接就不贴出来了
$result = json_decode($json, TRUE);
//成功则返回mediaid用于后面根据mediaid获取视频url
if (!isset($result['media_id'])) {
return false;
}
return $result['media_id'];
}

上面调用的material函数

[code=plain]public static function addMaterial($access_token, $type, $filePath, $is_video, $video_title, $introduction)
{
//$api_url 类似这个https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=....&type=video
$api_url = self::getApiUrl('add_material');
if ($api_url) {
$params = array();
if ($is_video) {
$params['description'] = urldecode(json_encode(array(
'title' => $video_title,
'introduction' => $introduction
)));
}
//版本不同好像media有所不同
if (version_compare(PHP_VERSION, '5.5.0') < 0 ) {
$params['media'] = '@'.$filePath;
} else {
$params['media'] = new CURLFile($filePath);
}
return HttpCurl::post($api_url, $params);
}
return false;
}

post方法

[code=plain]public static function post($url, $keysArr, $header=array(), $flag = 0)
{
$ch = curl_init();
if (!$flag) {
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
}
if(count($header) > 0) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
curl_setopt($ch, CURLOPT_URL, $url);
$ret = curl_exec($ch);
$err = curl_error($ch);
//yii记录日志用的不用看
if($err){
Yii::log("curl error ::".$err, 'error', 'Curl Error');
Yii::log("curl error url ::".$url, 'error', 'Curl Error');
}
curl_close($ch);
return $ret;
}

通过mediaid调用微信获取永久素材接口获取微信视频存储的地址

[code=plain]public static function getMaterial($mid, $media_id)
{
$json = WechatMedia::getMaterial(AccessToken::getAccessToken($mid), $media_id);
$result = json_decode($json, TRUE);
//微信那里的地址是down_url,存在则返回
if(isset($result['down_url'])){
return $result['down_url'];
}
return false;
}

获取永久素材的地址

[code=plain]public static function getMaterial($access_token, $media_id)
{
//Apiurl类似于https://api.weixin.qq.com/cgi-bin/material/get_material?access_token.....
$apiUrl = self::getApiUrl('get_material');
if ($apiUrl) {
$params = array(
'media_id' => $media_id
);
//这里注意要json一下,至于post方法上面有就不贴了
return HttpCurl::post($apiUrl, json_encode($params));
} else {
return false;
}
}

这样存在数据库中的mediaid就是微信的视频的地址了,应该算是比较完整的一段流程了0.0
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: