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


Posted in PHP onMarch 20, 2014

1.构造微信提供的XML格式的音乐消息
音乐的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里面的数据,前者普通品质的音乐,后面HQ是高品质的,wifi下会优先播放HQ的。
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>
      $item_str
      <FuncFlag>%d</FuncFlag>
      </xml>";
  $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $flag);
  return $resultStr;
    }

2.构造参数$musicArray

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

其中的$songstr和$singerstr变量是得从接受关注者的文本,你先提醒关注者按照一定的格式输入文本,安然按这个固定格式截取出其中的歌曲歌手名。这个不难实现
我是这么写的,其中的$keyword就是用户输入的内容,我要求的格式是这样:格式为音乐+歌名 歌手;例如:音乐大约在冬季 齐秦,歌曲名称和歌手中间用空格分隔。
$aa = substr($keyword,strpos($keyword,"音乐")+strlen("音乐"));//一个汉字2个位置
       $song = substr($aa,0,strpos($aa," "));
       $singer = substr($aa,strpos($aa," "));
             $songstr = trim((string)$song);
             $singerstr = trim((string)$singer);
             $musicArray = array("Title"=>$songstr, "Description"=>"歌手:".$singerstr, "MusicUrl"=>$this->getMusicUrl($this->getMusic($songstr,$singerstr)),"HQMusicUrl"=>$this->getHQMusicUrl($this->getMusic($songstr,$singerstr)));
             $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语法,我花了许多时间

//音乐点播
function read_child($node) 
{ 
  global $musicstr ;
  $children = $node->childNodes; //获得$node的所有子节点 
  foreach($children as $e) //循环读取每一个子节点 
  { 
      /*if($e->nodeType == XML_TEXT_NODE) //如果子节点为文本型则输出 
      { 
          echo $e->nodeValue."---------"."<BR>"; 
      }*/
      if($e->nodeType == XML_ELEMENT_NODE&&$e->nodeName=='encode') //如果子节点为文本型则输出 
      { 
          $musicstr.=$e->nodeValue; 
      } 
      if($e->nodeType == XML_ELEMENT_NODE&&$e->nodeName=='decode') //如果子节点为文本型则输出 
      { 
          $musicstr.=$e->nodeValue."|"; 
      } 
      if($e->nodeType == XML_ELEMENT_NODE) //如果子节点为节点对象,则调用函数处理 
      { 
        $this->read_child($e); //注意这里的$this->是因为的这些方法都是写在微信的那个wechatCallbackapiTest类中的,所以得加才能调用到这些函数。
      } 
  }
  return  $musicstr ;
}function getMusic($song,$singer)
{
  $dom = new DomDocument(); //创建 DOM对象 
  $dom->load('http://box.zhangmen.baidu.com/x?op=12&count=1&title='.$song.'$$'.$singer.'$$$$'); //读取 XML文件 
  $root = $dom->documentElement; //获取 XML数据的根 
  return $this->read_child($root);
  //return $b; //调用 read_child函数读取根对象 
}

function getMusicUrl($url)
{
  // echo strpos($url,"&")."musciURL";
    return substr($url,0,strpos($url,"&"));
}
function getHQMusicUrl($url)
{
    //echo  strripos($url,"&")."HQmusicURL";
    return substr($url,strripos($url,"http"),strripos($url,"&")-strripos($url,"http"));
}

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

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

最后实现成果截图:


关键的内容和知识点都已经讲完了,叙述能力拙计,可能讲不太清楚,有什么不懂的欢迎评论,尽力回答。

 

PHP 相关文章推荐
Mysql数据库操作类( 1127版,提供源码下载 )
Dec 02 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
Sep 13 PHP
ThinkPHP之N方法实例详解
Jun 20 PHP
destoon后台网站设置变成空白的解决方法
Jun 21 PHP
ThinkPHP表单数据智能写入create方法实例分析
Sep 27 PHP
thinkphp多层MVC用法分析
Dec 30 PHP
PHP中explode函数和split函数的区别小结
Aug 24 PHP
Zend Framework数据库操作方法实例总结
Dec 11 PHP
php cli模式下获取参数的方法
May 05 PHP
yii2安装详细流程
May 23 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
Laravel实现批量更新多条数据
Apr 06 PHP
一个PHP针对数字的加密解密类
Mar 20 #PHP
php的array数组和使用实例简明教程(容易理解)
Mar 20 #PHP
PHP引用(&amp;)各种使用方法实例详解
Mar 20 #PHP
PHP使用imagick读取PDF生成png缩略图的两种方法
Mar 20 #PHP
递归删除一个节点以及该节点下的所有节点示例
Mar 19 #PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 #PHP
php实现保存submit内容之后禁止刷新
Mar 19 #PHP
You might like
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
php计算两个整数的最大公约数常用算法小结
2015/03/05 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
Thinkphp通过一个入口文件如何区分移动端和PC端
2017/04/18 PHP
PHPMAILER实现PHP发邮件功能
2018/04/18 PHP
PHP-FPM和Nginx的通信机制详解
2019/02/01 PHP
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
js验证上传图片的方法
2015/05/12 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
jquery ajaxfileupload异步上传插件使用详解
2017/02/08 Javascript
div中文字内容溢出常见的解决方法
2017/03/16 Javascript
Element-UI中Upload上传文件前端缓存处理示例
2019/02/21 Javascript
详解vue-router的导航钩子(导航守卫)
2020/11/02 Javascript
[02:30]联想杯DOTA2完美世界全国高校联赛—北京站现场
2015/11/16 DOTA
python抓取网页图片并放到指定文件夹
2014/04/24 Python
Python编码类型转换方法详解
2016/07/01 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python文件操作基本流程代码实例
2017/12/11 Python
django+mysql的使用示例
2018/11/23 Python
Keras自定义IOU方式
2020/06/10 Python
深入浅析Python代码规范性检测
2020/07/31 Python
全网最全python库selenium自动化使用详细教程
2021/01/12 Python
flask框架中的cookie和session使用
2021/01/31 Python
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
html5给汉字加拼音加进度条的实现代码
2020/04/07 HTML / CSS
马来西亚网上美容店:Hermo.my
2017/11/25 全球购物
新闻学毕业生自荐信
2013/11/15 职场文书
关于爱情的广播稿
2014/01/16 职场文书
酒店中秋节促销方案
2014/01/30 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
学雷锋日活动总结
2015/02/06 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
认识实习感想
2015/08/10 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python