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 相关文章推荐
再次研究下cache_lite
Feb 14 PHP
PHPMyAdmin 快速配置方法
May 11 PHP
PHP高级对象构建 多个构造函数的使用
Feb 05 PHP
ThinkPHP登录功能的实现方法
Aug 20 PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 PHP
php实现格式化多行文本为Js可用格式
Apr 15 PHP
PHP对文件夹递归执行chmod命令的方法
Jun 19 PHP
降低PHP Redis内存占用
Mar 23 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP抽象类基本用法示例
Dec 28 PHP
PHP addcslashes()函数讲解
Feb 03 PHP
PHP常用函数之获取汉字首字母功能示例
Oct 21 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 Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php读取csv实现csv文件下载功能
2013/12/18 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
js带按钮的提示框可供选择示例代码
2013/09/17 Javascript
轻松实现jquery手风琴效果
2016/01/14 Javascript
Ajax的概述与实现过程
2016/11/18 Javascript
网络传输协议(http协议)
2016/11/18 Javascript
BootStrap 可编辑表Table格
2016/11/24 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
Jquery Easyui表单组件Form使用详解(30)
2016/12/19 Javascript
COM组件中调用JavaScript函数详解及实例
2017/02/23 Javascript
基于jquery日历价格、库存等设置插件
2020/07/05 jQuery
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
jquery 通过ajax请求获取后台数据显示在表格上的方法
2018/08/08 jQuery
Makefile/cmake/node-gyp中区分判断不同平台的方法
2018/12/18 Javascript
html+jQuery实现拖动滑块图片拼图验证码插件【移动端适用】
2019/09/10 jQuery
jquery实现上传图片功能
2020/06/29 jQuery
VueCli生产环境打包部署跨域失败的解决
2020/11/13 Javascript
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
Python 3中print函数的使用方法总结
2017/08/08 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
python数字图像处理实现直方图与均衡化
2018/05/04 Python
Django后台获取前端post上传的文件方法
2018/05/28 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
python定时复制远程文件夹中所有文件
2019/04/30 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
python3.7调试的实例方法
2020/07/21 Python
请问软件开发中的设计模式你会使用哪些
2015/05/13 面试题
会计专业毕业生自我评价
2013/09/25 职场文书
主持人婚宴答谢词
2014/01/28 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
Python基础详解之邮件处理
2021/04/28 Python
JS ES6异步解决方案
2021/04/29 Javascript
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL