PHP微信公众号开发:获取临时素材之语音文件

一、前言

        微信公众号为开发者提供了丰富的接口,使得开发者可以轻松实现各种业务场景。在开发过程中,我们可能会遇到需要获取用户上传的临时素材的场景,例如语音、图片等。本文将重点介绍如何使用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成功获取了微信公众号的临时素材语音文件。在实际开发中,根据业务需求,我们可以将获取到的语音文件进一步处理,例如转码、存储等。     

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值