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 相关文章推荐
PHP写的求多项式导数的函数代码
Jul 04 PHP
phpmailer发送gmail邮件实例详解
Jun 24 PHP
CodeIgniter安全相关设置汇总
Jul 03 PHP
PHP+Ajax检测用户名或邮件注册时是否已经存在实例教程
Aug 23 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
php判断输入是否是纯数字,英文,汉字的方法
Mar 05 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
joomla实现注册用户添加新字段的方法
May 05 PHP
SAE实时日志接口SDK用法示例
Oct 09 PHP
THinkPHP获取客户端IP与IP地址查询的方法
Nov 14 PHP
Yii2.0多文件上传实例说明
Jul 24 PHP
PHP单元测试配置与使用方法详解
Dec 27 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文件去掉PHP注释空格的函数分析(PHP代码压缩)
2013/07/02 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
PHP获取windows登录用户名的方法
2014/06/24 PHP
JavaScript入门教程(11) js事件处理
2009/01/31 Javascript
JavaScript和CSS交互的方法汇总
2014/12/02 Javascript
js插件YprogressBar实现漂亮的进度条效果
2015/04/20 Javascript
js实现a标签超链接提交form表单的方法
2015/06/24 Javascript
JS实现DIV容器赋值的方法
2015/12/14 Javascript
JSON 必知必会 观后记
2016/10/27 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
Javascript快速实现浏览器系统通知
2017/08/26 Javascript
微信小程序url与token设置详解
2017/09/26 Javascript
vue2中的keep-alive使用总结及注意事项
2017/12/21 Javascript
JavaScript继承定义与用法实践分析
2018/05/28 Javascript
VUE搭建手机商城心得和遇到的坑
2019/02/21 Javascript
jqGrid表格底部汇总、合计行footerrow处理
2019/08/21 Javascript
[03:56]还原FTP电影首映式 DOTA2群星拼出遗迹世界
2014/03/26 DOTA
python 打印对象的所有属性值的方法
2016/09/11 Python
python学生管理系统代码实现
2020/04/05 Python
浅谈Python中的作用域规则和闭包
2018/03/20 Python
使用django-guardian实现django-admin的行级权限控制的方法
2018/10/30 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python应用领域和就业形势分析总结
2019/05/14 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Django模板语言 Tags使用详解
2019/09/09 Python
python爬虫实现获取下一页代码
2020/03/13 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
精神文明单位申报材料
2014/05/02 职场文书
室内设计专业毕业生求职信
2014/05/02 职场文书
公司法人授权委托书范本
2014/09/12 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
2016年幼儿园教师师德承诺书
2016/03/25 职场文书
Django REST framework 限流功能的使用
2021/06/24 Python