前言
在微信公众号开发中,经常需要上传视频素材到微信服务器。本文将介绍如何使用PHP实现微信永久素材视频上传功能。
一、a.php - 微信消息回复(视频消息示例)
以下代码处理微信消息回调,当收到视频消息时回复一个视频:
$msg=$GLOBALS['HTTP_RAW_POST_DATA'];
$msgstr=(array)simplexml_load_string($msg, 'SimpleXMLElement', LIBXML_NOCDATA);
$com=com($msgstr);
if($msgstr['MsgType']=='video'){ //回复视频
echo "<xml>
$com
<![CDATA[video]]>
<Video>
<![CDATA[1VkhJyhTjbIz9ZL-7EPCMsLgS05FlGX86iOFgI_Bm7tTmGUqOpqQAXdn5VEUedAy]]>
<Title><![CDATA[不容易阿]]></Title>
<![CDATA[总算出来了]]>
</Video>
</xml>";
exit;
}
//公共头部
function com($msgstr){
$str="
<![CDATA[{$msgstr['FromUserName']}]]>
<![CDATA[{$msgstr['ToUserName']}]]>
".time()." ";
return $str;
}
二、b.php - 上传视频到微信永久素材
以下是上传视频文件到微信服务器的核心代码:
$sucai="https://api.weixin.qq.com/cgi-bin/material/add_material?access_token={$token['access_token']}&type=video";
//视频地址
$img='1.mp4';
$res=curla($sucai,$img);
var_dump($res);
die;
function curla($sucai,$img){
$ch = curl_init();
//判断curl类的扩展是否存在可用
if(class_exists('CURLFile')){
//存在就new
curl_setopt($ch,CURLOPT_SAFE_UPLOAD,true);
$data=array('media'=>new \CURLFile(realpath($img)));//必须加上realpath()否则读取不到文件的路径
}else{
//不存在
if(defined('CURLOPT_SAFE_UPLOAD')){
curl_setopt($ch,CURLOPT_SAFE_UPLOAD,false);
}
//realpath读取文件的所在的地址
$data=array('media'=>"@".realpath($img));
}
curl_setopt($ch, CURLOPT_URL, $sucai);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
//请求https协议时必须加上ssl安全验证
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
// post数据
curl_setopt($ch, CURLOPT_POST, 1);
// post的变量
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$output = curl_exec($ch);
curl_close($ch);
return $output;
}
三、关键要点说明
- 接口地址差异:临时素材使用
/cgi-bin/media/upload,永久素材使用/cgi-bin/material/add_material - CURLFile类:PHP 5.5+ 推荐使用
CURLFile类上传文件,旧版本使用@前缀 - realpath():必须使用
realpath()获取文件绝对路径,否则会读取不到文件 - SSL验证:调用微信API时需要关闭SSL证书验证
- 参数type:上传视频时
type=video
四、返回结果说明
上传成功后会返回JSON格式数据,包含 media_id 和 url:
{
"media_id": "IhdaUC-Ucn7D2pYiPe0beQ-7MgocGh4WzWBoikLG8L7KvmL0NfY4cobl686N1yYe",
"url": "http://mmbiz.vip.qq.com/...
}
获取到 media_id 后就可以在公众号消息回复、自定义菜单等功能中使用该视频素材了。

发表评论 取消回复