原文出自传智播客官方公众号!(https://mp.weixin.qq.com/s?__biz=MjM5OTM4NDMyMg==&mid=208251305&idx=1&sn=44449fcfb1e82c26b3c821f317ed037b&key=2877d24f51fa538481aa2a603e35146c742c0af306917cf20ec620fa7df40c05b568b07a7e52ec5a6720fcc2819df5a8&ascene=4&uin=MjQ3MDk5Mjc4MA%3D%3D&devicetype=android-19&version=26020533&pass_ticket=o6lDRGq5VoZY6lsx8tDDfa1h0%2BiVP0Rs%2BVVYjWZVNaNBby1ui2OxIVHmA56%2B31J%2B)
微信公众平台支持向用户回复音乐消息,用户收到音乐消息后,点击即可播放音乐。
通过微信公众平台提供的回复音乐消息,公众号可以实现音乐搜索(歌曲点播)功能,即用户输入需要搜索的音乐(歌曲)名称,公众号返回对应的音乐(歌曲)。
效果是当用户要搜索歌曲《朋友》,发送内容“歌曲朋友”到公众号。当用户要搜索周华健演唱的《朋友》,可发送“歌曲朋友@周华健”到公众号。
1. 音乐消息数据格式
微信公众平台开发者文档中提供了公众号向用户回复音乐消息的XML数据格式。
1. <xml> 2. <ToUserName><![CDATA[toUser]]></ToUserName> 3. <FromUserName><![CDATA[fromUser]]></FromUserName> 4. <CreateTime>12345678</CreateTime> 5. <MsgType><![CDATA[music]]></MsgType> 6. <Music> 7. <Title><![CDATA[TITLE]]></Title> 8. <Description><![CDATA[DESCRIPTION]]></Description> 9. <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl> 10. <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl> 11. <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId> 12.</Music> 13.</xml>
参数说明:
参数 |
是否必须 |
说明 |
ToUserName |
是 |
接收方账号(收到的OpenID) |
FromUserName |
是 |
开发者微信号 |
CreateTime |
是 |
消息创建时间(整型) |
MsgType |
是 |
music |
Title |
否 |
音乐标题 |
Description |
否 |
音乐描述 |
MusicURL |
否 |
音乐链接 |
HQMusicUrl |
否 |
高质量音乐链接,WIFI环境优先使用该链接播放音乐 |
ThumbMediaId |
是 |
缩略图的媒体ID,通过素材管理接口上传多媒体文件,得到的ID |
2. 百度音乐搜索
百度音乐搜索API的请求地址如下:http://box.zhangmen.baidu.com/x?op=12&count=1&title=TITLE$$AUTHOR$$$$
其中:http://box.zhangmen.baidu.com为百度音乐盒的首页地址,参数TITLE表示歌曲名称,AUTHOR表示演唱者,AUTHOR可以为空,参数TITLE和AUTHOR需要进行URL编码(UTF-8或GB2312均可)。例如,要搜索歌曲零点乐队的“相信自己”,可以像下面这样:
1. // GB2312编码的音乐搜索链接
2. http://box.zhangmen.baidu.com/x?op=12&count=1&title=%CF%E0%D0%C5%D7%D4%BC%BA$$%C1%E3%B5%E3%C0%D6%B6%D3$$$$
3. // UTF-8编码的音乐搜索链接
4. http://box.zhangmen.baidu.com/x?op=12&count=1&title=%E7%9B%B8%E4%BF%A1%E8%87%AA%E5%B7%B1$$%E9%9B%B6%E7%82%B9%E4%B9%90%E9%98%9F$$$$
通过浏览器访问上面的地址,返回的是如下格式的XML数据:
1. <result> 2. <count>1</count> 3. <url> 4. <encode> 5. <![CDATA[http://zhangmenshiting.baidu.com/data2/music/44277542/ZWZla2xra2pfn6NndK6ap5WXcJVob5puZ2trbWprmnBjZ2xolpeZa2drZmWZmZmdl2hjZWhvnWlpYmRtZmltcGplZFqin5t1YWBobW5qcGxia2NmZ2twbzE$]]> 6. </encode> 7. <decode> 8. <![CDATA[44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931&mid=0.59949419022597]]> 9. </decode> 10. <type>8</type> 11. <lrcid>64644</lrcid> 12. <flag>1</flag> 13. </url> 14. <durl> 15. <encode> 16. <![CDATA[http://zhangmenshiting2.baidu.com/data2/music/44277530/ZWZla2xramhfn6NndK6ap5WXcJVob5puZ2trbWprmnBjZ2xolpeZa2drZmWZmZmdl2hjaGhvnZ5qlGRpbpedamJla1qin5t1YWBobW5qcGxia2NmZ2twbzE$]]> 17. </encode> 18. <decode> 19. <![CDATA[44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138&mid=0.59949419022597]]> 20. </decode> 21. <type>8</type> 22. <lrcid>64644</lrcid> 23. <flag>1</flag> 24. </durl> 25. <p2p> 26. <hash>022bc0fbf66cd19bea96db49634419dc2600393f</hash> 27. <url> 28. <![CDATA[ ]]> 29. </url> 30. <type>mp3</type> 31. <size>5236902</size> 32. <bitrate>192</bitrate> 33. </p2p> 34.</result>
返回结果中的主要参数说明如下:
1)<count>表示搜索到的音乐数;
2)<url>中包含了普通品质的音乐链接,<durl>中包含了高品质音乐的链接;
3)<encode>中包含了加密后的音乐链接,实际上只是对音乐名称进行了加密,<decode>中包含了解密后的音乐名称;
4)<type>表示音乐文件的类型,如rm、wma、mp3等;
5)<lrcid>是歌词的ID,<url>中的歌词ID为64644,那么如何得到歌词呢?本例并不关心歌词,只是附带提一下。歌词的地址如下:http://box.zhangmen.baidu.com/bdlrc/646/64644.lrc,其中,http://box.zhangmen.baidu.com/bdlrc/是固定值;646为歌词所在目录名,计算方法为歌词ID(64644)除以100,取整数部分;64644.lrc是歌词文件名。
下面介绍如何获得音乐链接:
上图中,1和2拼接可成普通品质音乐的链接,3和4拼接可拼接成高品质音乐的链接。拼接普通品质和高品质的音乐链接如下:
1. // 普通品质音乐链接
2. http://zhangmenshiting.baidu.com/data2/music/44277542/44277542.mp3?xcode=a39c6698955c82594aab36931dcbef60139f180191368931
3. // 高品质音乐链接
4. http://zhangmenshiting2.baidu.com/data2/music/44277530/44277530.mp3?xcode=a39c6698955c82594aab36931dcbef60439ff9b159af2138
参数xcode可以理解为随机验证码,每次搜索得到的值都不一样。
3. 编程调用百度音乐搜索API
编写PHP程序来实现,编写_getMusicURL方法,代码如下:
1. private function _getMusicURL($song, $singer){ 2. if($singer==''){ 3. $curl ='http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'; 4. } else { 5. $curl ='http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'.$singer.'$$$$'; 6. } 7. $content = $this->_request($curl, false); 8. $content = simplexml_load_string($content,'SimpleXMLElement', LIBXML_NOCDATA); 9. $musicUrl =substr($content->url->encode,0,strrpos($content->url->encode,'/')+1).substr($content->url->decode,0,strrpos($content->url->decode,'&')); 10. return $musicUrl; 11. }
4. 发送音乐(歌曲)
在公众账号后台,需首先对用户发送的文本消息进行判断,如果是以“歌曲”两个字开头,就认为用户是在使用“歌曲点播”功能,此时需要对“歌曲”两个字之后的内容进行判断,如果包含“@”符号,就表示需要按演唱者搜索,否则不指定演唱者。PHP代码如下:
1. private function _sendMusic($postObj){ 2. $postObj->Content = 3. mb_substr( 4. $postObj->Content, 5. 2, 6. mb_strlen($postObj->Content,'UTF-8')-2, 7. 'UTF-8'); 8. $songinfo = explode('@',$postObj->Content); 9. $song = trim($songinfo[0]); 10.$singer=''; 11.if(isset($songinfo[1])){ 12.$singer = trim($songinfo[1]); 13.} 14.$musicURL = $this->_getMusicURL($song, $singer); 15.$musicTpl = 16.'<xml> 17.<ToUserName><![CDATA[%s]]></ToUserName> 18.<FromUserName><![CDATA[%s]]></FromUserName> 19.<CreateTime>%s</CreateTime> 20.<MsgType><![CDATA[music]]></MsgType> 21.<Music> 22.<Title><![CDATA[%s]]></Title> 23.<Description><![CDATA[]]></Description> 24.<MusicUrl><![CDATA[%s]]></MusicUrl> 25.<HQMusicUrl><![CDATA[%s]]></HQMusicUrl> 26.<ThumbMediaId><![CDATA[l-mhCs8ecIACGP48FKvyI6k4MIdHdikR9UEW_COLq30]]></ThumbMediaId> 27.</Music> 28.</xml>'; 29.$resultStr = sprintf( 30.$musicTpl, 31.$postObj->FromUserName, 32.$postObj->ToUserName, 33.time(), 34.$song, 35.$singer, 36.$musicURL, 37.$musicURL); 38.echo $resultStr; 39.exit; 40.}
在 <ThumbMediaId><![CDATA[MEDIA_ID]]></ThumbMediaId>中MEDIA_ID必须用公众号的永久图片素材的media_id替换。
以上是关于音乐的两个方法,功能是获取音乐的URL并发送给用户,用户发送“歌曲朋友”或者“歌曲朋友@周华健”到公众号时,公众号进行歌曲搜索,并将搜索到的歌曲以music类型发送给用户。