微信公眾平台支援回覆音樂消息,只需按規定 XML 格式輸出。本文完整梳理「接收用戶指令 → 解析歌名/歌手 → 調用百度音樂 API → 組裝 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 需預先上傳縮略圖至微信素材庫獲取。
<?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
);
}
<?php
// $keyword 為用戶原文,如 "音樂 大約在冬季 齊秦"
$aa = substr($keyword, strpos($keyword, '音樂') + 6); // 跳過「音樂」二字(UTF-8 每字3字節)
$song = trim(substr($aa, 0, strpos($aa, ' ')));
$singer = trim(substr($aa, strpos($aa, ' ')));
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= 前的部分,否則播放失敗。
<?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')); }
<?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);
urlencode()。完整流程跑通後,用戶發送「音樂 歌名 歌手」即可收到可播放的音樂消息,是微信公眾號增強互動的經典功能之一。