当前位置:首页 > PHP教程 > php高级应用 > 列表

PHP实现微信公众平台音乐点播

发布:smiling 来源: PHP粉丝网  添加日期:2020-10-29 13:47:28 浏览: 评论:0 

首先说一下思路,微信提供了接口,只要数据格式满足它所给的接口的XML格式即可以发送给关注者对应的音乐。

1.构造微信提供的XML格式的音乐消息

音乐的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> 

我们写个函数将数据转换成这样的格式,这里面主要的数据是MusicUrl和HQMusicUrl里面的数据,前者普通品质的音乐,后面HQ是高品质的,wifi下会优先播放HQ的,代码如下:

  1. private function transmitMusic($object$musicArray$flag = 0) 
  2.     { 
  3.   $itemTpl = "<Music> 
  4.         <Title><![CDATA[%s]]></Title> 
  5.       <Description><![CDATA[%s]]></Description> 
  6.       <MusicUrl><![CDATA[%s]]></MusicUrl> 
  7.       <HQMusicUrl><![CDATA[%s]]></HQMusicUrl> 
  8.     </Music>"; 
  9.  
  10.   $item_str = sprintf($itemTpl$musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']); 
  11.  
  12.   $textTpl = "<xml> 
  13.       <ToUserName><![CDATA[%s]]></ToUserName> 
  14.       <FromUserName><![CDATA[%s]]></FromUserName> 
  15.       <CreateTime>%s</CreateTime> 
  16.       <MsgType><![CDATA[music]]></MsgType> 
  17.       $item_str 
  18.       <FuncFlag>%d</FuncFlag> 
  19.       </xml>"; 
  20.  
  21.   $resultStr = sprintf($textTpl$object->FromUserName, $object->ToUserName, time(), $flag); 
  22.   return $resultStr
  23.     } 

2.构造参数$musicArray,代码如下:

  1. $musicArray = array("Title"=>$songstr"Description"=>"歌手:".$singerstr"MusicUrl"=>$this->getMusicUrl($this->getMusic($songstr,$singerstr)),"HQMusicUrl"=>$this->getHQMusicUrl($this->getMusic($songstr,$singerstr))); 

其中的$songstr和$singerstr变量是得从接受关注者的文本,你先提醒关注者按照一定的格式输入文本,安然按这个固定格式截取出其中的歌曲歌手名。这个不难实现

我是这么写的,其中的$keyword就是用户输入的内容,我要求的格式是这样:格式为音乐+歌名 歌手;例如:音乐大约在冬季 齐秦,歌曲名称和歌手中间用空格分隔,代码如下:

  1. $aa = substr($keyword,strpos($keyword,"音乐")+strlen("音乐"));//一个汉字2个位置 
  2.        $song = substr($aa,0,strpos($aa," ")); 
  3.        $singer = substr($aa,strpos($aa," ")); 
  4.              $songstr = trim((string)$song); 
  5.              $singerstr = trim((string)$singer); 
  6.              $musicArray = array("Title"=>$songstr"Description"=>"歌手:".$singerstr"MusicUrl"=>$this->getMusicUrl($this->getMusic($songstr,$singerstr)),"HQMusicUrl"=>$this->getHQMusicUrl($this->getMusic($songstr,$singerstr))); 
  7.              $resultStr = $this->transmitMusic($object$musicArray$funcFlag); 

具体字符串截取的函数用法可以去w3c上去查阅我就不细讲了,主要是MusicUrl和HQMusicUrl内容的获取。百度音乐接口 http://box.zhangmen.baidu.com/x?op = 12&count=1&title=TITLE $$AUTHOR$$$$

你在浏览器中输入 http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$观察一下接口提供的XML数据的内容,主要是要encode和decode中的数据,这两个数据是连在一起的,里面的CDATA中的内容取到xcode后面为止,即 &mid=0.74155984312224这些内容不要,我试过,加上这部分歌曲是放不出来的。拼接好的数据就是所要的MusicUrl和HQMusicUrl。

3.下面是重点,用PHP解析XML数据

由于不懂PHP语法,我花了许多时间,代码如下:

  1. //音乐点播 
  2. function read_child($node)  
  3. {  
  4.   global $musicstr ; 
  5.   $children = $node->childNodes; //获得$node的所有子节点  
  6.   foreach($children as $e//循环读取每一个子节点  
  7.   {  
  8.       /*if($e->nodeType == XML_TEXT_NODE) //如果子节点为文本型则输出  
  9.       {  
  10.           echo $e->nodeValue."---------"."<BR>";  
  11.       }*/ 
  12.       if($e->nodeType == XML_ELEMENT_NODE&&$e->nodeName=='encode'//如果子节点为文本型则输出  
  13.       {  
  14.           $musicstr.=$e->nodeValue;  
  15.       }  
  16.       if($e->nodeType == XML_ELEMENT_NODE&&$e->nodeName=='decode'//如果子节点为文本型则输出  
  17.       {  
  18.           $musicstr.=$e->nodeValue."|";  
  19.       }  
  20.       if($e->nodeType == XML_ELEMENT_NODE) //如果子节点为节点对象,则调用函数处理  
  21.       {  
  22.         $this->read_child($e); //注意这里的$this->是因为的这些方法都是写在微信的那个wechatCallbackapiTest类中的,所以得加才能调用到这些函数。 
  23.       }  
  24.   } 
  25.   return  $musicstr ; 
  26.  
  27. function getMusic($song,$singer
  28.   $dom = new DomDocument(); //创建 DOM对象  
  29.   $dom->load('http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'.$singer.'$$$$'); //读取 XML文件  
  30.   $root = $dom->documentElement; //获取 XML数据的根  
  31.   return $this->read_child($root); 
  32.   //return $b; //调用 read_child函数读取根对象  
  33.  
  34. function getMusicUrl($url
  35.   // echo strpos($url,"&")."musciURL"; 
  36.     return substr($url,0,strpos($url,"&")); 
  37. function getHQMusicUrl($url
  38.     //echo  strripos($url,"&")."HQmusicURL"; 
  39.     return substr($url,strripos($url,"http"),strripos($url,"&")-strripos($url,"http")); 

我是用DOM做的,百度知道上问别人的。当然取XML数据中的MusicUrl还有更好的方法:

  1. xml = file_get_contents('http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$'); 
  2. $result = simplexml_load_string($xml); 
  3. echo strval($result->url->encode); 
  4. echo strval($result->url->decode); 
  5. //输出:http://zhangmenshiting.baidu.com/data2/music/64380827/Z2ZmbGVuaW9fn6NndK6ap5WXcGVpZpuaZJdrbGtqmm1mY2lolppnmpSXZWZubZyclmlmmZaXa3CTZJeZmW1ncGVll1qin5t1YWBmbGxsamxlaGVrbG9taTE$ 
  6. 64380827.mp3?xcode=140db3e8864c55164ad0bce2297ede73eaa48b2ded70843d&mid=0.38763446277961 

Tags: PHP微信公众平台音乐点播

分享到: