一、前言
微信公众号为开发者提供了丰富的接口,使得开发者可以轻松实现各种业务场景。在开发过程中,我们可能会遇到需要获取用户上传的临时素材的场景,例如语音、图片等。本文将重点介绍如何使用PHP获取临时素材中的语音文件。
二、准备工作
在开始编写代码之前,需要确保以下准备工作已完成:
1.注册并设置微信公众号,获取AppID和AppSecret。
2.开启开发者模式,获取服务器配置信息。
3.确保服务器可以访问外网,以便调用微信API。
三、获取access_token
在获取临时素材之前,首先需要获取access_token。以下是获取access_token的代码示例:
//获取access_token
function getAccessToken() {
$appId = 'you appId';
$appSecret = 'you appSecret';
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(get_php_file("access_token.php"));
if ($data->expire_time < time()) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret";
$res = json_decode(file_get_contents($url));
$access_token = $res->access_token;
if ($access_token) {
$data->expire_time = time() + 7000;
$data->access_token = $access_token;
set_php_file("access_token.php", json_encode($data));
}
} else {
$access_token = $data->access_token;
}
return $access_token;
}
//获取文件内容
function get_php_file($filename) {
return trim(substr(file_get_contents($filename), 15));
}
//修改文件内容
function set_php_file($filename, $content) {
$fp = fopen($filename, "w");
fwrite($fp, "<?php exit();?>" . $content);
fclose($fp);
}
//access_token.php文件内容
//<?php exit();?>{"access_token":"access_token","expire_time":1713958004}
四、完整代码
<?php
// 获取微信POST过来的数据
$postStr = file_get_contents('php://input');
// 如果不是来自微信服务器的请求,则直接返回
if (!checkSignature()) {
echo "";
exit;
}
// 解析用户发送的消息
$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
$fromUsername = $postObj->FromUserName; // 发送方帐号(一个OpenID)
$toUsername = $postObj->ToUserName; // 开发者微信号
$msgType = $postObj->MsgType; // 消息类型
$keyword = trim($postObj->Content); // 获取用户发送的消息内容
switch ($msgType) {
case 'text':
//文本消息处理
break;
case 'voice':
$mediaId = $postObj->MediaId;
//$recognition = $postObj->Recognition;
$content = responseVoiceMsg($fromUsername, $toUsername, $mediaId);
break;
default:
echo "";
}
// 验证签名函数
function checkSignature() {
// 从微信服务器获取签名
$signature = $_GET["signature"];
// 获取时间戳
$timestamp = $_GET["timestamp"];
// 获取随机数
$nonce = $_GET["nonce"];
// 你的Token,与微信公众平台后台设置的Token一致
$token = "Token";
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode($tmpArr);
$tmpStr = sha1($tmpStr);
if ($tmpStr == $signature) {
return true;
} else {
return false;
}
}
//处理语音信息
function responseVoiceMsg($toUser, $fromUser, $mediaId) {
$access_token = getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/media/get?access_token=$access_token&media_id=$mediaId";
//获取文件信息
$content = downloadWeiXinFile($url);
//保存文件
$filename = "voice.amr";
saveWeiXinFile($filename, $content);
//保存语音文件后的后续处理
}
//获取文件信息
function downloadWeiXinFile($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
curl_close($ch);
return $package;
}
//保存文件
function saveWeiXinFile($filename, $filecontent){
$local_file = fopen($filename, 'w');
if (false !== $local_file) {
if (false !== fwrite($local_file, $filecontent)) {
fclose($local_file);
}
}
}
//获取access_token
function getAccessToken() {
$appId = 'you appId';
$appSecret = 'you appSecret';
// access_token 应该全局存储与更新,以下代码以写入到文件中做示例
$data = json_decode(get_php_file("access_token.php"));
if ($data->expire_time < time()) {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$appId&secret=$appSecret";
$res = json_decode(file_get_contents($url));
$access_token = $res->access_token;
if ($access_token) {
$data->expire_time = time() + 7000;
$data->access_token = $access_token;
set_php_file("access_token.php", json_encode($data));
}
} else {
$access_token = $data->access_token;
}
return $access_token;
}
//获取文件内容
function get_php_file($filename) {
return trim(substr(file_get_contents($filename), 15));
}
//修改文件内容
function set_php_file($filename, $content) {
$fp = fopen($filename, "w");
fwrite($fp, "<?php exit();?>" . $content);
fclose($fp);
}
五、总结
通过以上步骤,我们使用了PHP成功获取了微信公众号的临时素材语音文件。在实际开发中,根据业务需求,我们可以将获取到的语音文件进一步处理,例如转码、存储等。