首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 實現微信公眾平台音樂點播:從 XML 組裝到百度音樂 API 串接全流程

     編輯:PHP 相關知識

微信公眾平台支援回覆音樂消息,只需按規定 XML 格式輸出。本文完整梳理「接收用戶指令 → 解析歌名/歌手 → 調用百度音樂 API → 組裝 XML 回覆」全鏈路,並提供可直接落地的代碼片段。

1. 微信音樂消息 XML 結構

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>12345678</CreateTime>
  <MsgType><![CDATA[music]]></MsgType>
  <Music>
    <Title><![CDATA[TITLE]]></Title>
    <Description><![CDATA[DESCRIPTION]]></Description>
    <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
    <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
    <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
  </Music>
</xml>

MusicUrl 為標準品質,HQMusicUrl 為高品質(WiFi 優先)。ThumbMediaId 需預先上傳縮略圖至微信素材庫獲取。

2. 組裝 XML 回覆函數

<?php
private function transmitMusic($object, $musicArray, $flag = 0) {
    $itemTpl = "<Music>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <MusicUrl><![CDATA[%s]]></MusicUrl>
        <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
    </Music>";
    $item_str = sprintf($itemTpl,
        $musicArray['Title'],
        $musicArray['Description'],
        $musicArray['MusicUrl'],
        $musicArray['HQMusicUrl']
    );
    $textTpl = "<xml>
        <ToUserName><![CDATA[%s]]></ToUserName>
        <FromUserName><![CDATA[%s]]></FromUserName>
        <CreateTime>%s</CreateTime>
        <MsgType><![CDATA[music]]></MsgType>
        %s
        <FuncFlag>%d</FuncFlag>
    </xml>";
    return sprintf($textTpl,
        $object->FromUserName,
        $object->ToUserName,
        time(),
        $item_str,
        $flag
    );
}

3. 解析用戶指令(格式:音樂 歌名 歌手)

<?php
// $keyword 為用戶原文,如 "音樂 大約在冬季 齊秦"
$aa = substr($keyword, strpos($keyword, '音樂') + 6); // 跳過「音樂」二字(UTF-8 每字3字節)
$song  = trim(substr($aa, 0, strpos($aa, ' ')));
$singer = trim(substr($aa, strpos($aa, ' ')));

4. 串接百度音樂盒子 API 獲取真實播放鏈接

API:https://box.zhangmen.baidu.com/x?op=12&count=1&title=歌名$$歌手$$$$

返回 XML 中關鍵節點:

  • <encode>:標準品質鏈接片段
  • <decode>:高品質鏈接片段

需拼接完整 URL:https://zhangmenshiting.baidu.com/.../xxx.mp3?xcode=...&mid=...,截取 &mid= 前的部分,否則播放失敗。

5. 兩種 XML 解析方案

方案 A:DOMDocument(健壯、支援大檔)

<?php
function getMusic($song, $singer) {
    $dom = new DOMDocument();
    $dom->load("https://box.zhangmen.baidu.com/x?op=12&count=1&title={$song}\$\$${singer}\$\$\$\$");
    $root = $dom->documentElement;
    return $this->read_child($root); // 遞歸提取 encode/decode
}

function read_child($node) {
    global $musicstr;
    foreach ($node->childNodes as $e) {
        if ($e->nodeType === XML_ELEMENT_NODE) {
            if ($e->nodeName === 'encode') $musicstr .= $e->nodeValue;
            if ($e->nodeName === 'decode') $musicstr .= $e->nodeValue . '|';
            $this->read_child($e);
        }
    }
    return $musicstr;
}

function getMusicUrl($url) { return substr($url, 0, strpos($url, '&')); }
function getHQMusicUrl($url) { return substr($url, strripos($url, 'http'), strripos($url, '&') - strripos($url, 'http')); }

方案 B:SimpleXML(代碼極簡)

<?php
$xml = file_get_contents("https://box.zhangmen.baidu.com/x?op=12&count=1&title=大約在冬季\$\$齊秦\$\$\$\$");
$result = simplexml_load_string($xml);
$musicUrl = strval($result->url->encode);
$hqMusicUrl = strval($result->url->decode);

6. 生產環境注意事項

  • API 穩定性:百度非官方開放接口,隨時可能失效,建議自建音樂庫或接入官方授權平台(QQ音樂/網易雲開放平台)。
  • 編碼處理:歌名/歌手含特殊字符需 urlencode()。
  • 並發與緩存:相同歌曲請求緩存 24h,減少外部 API 壓力。
  • HTTPS:微信強制回調 HTTPS,確保服務器已配置有效證書。

完整流程跑通後,用戶發送「音樂 歌名 歌手」即可收到可播放的音樂消息,是微信公眾號增強互動的經典功能之一。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved