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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
Apr 09 PHP
一个简单的网页密码登陆php代码
Jul 17 PHP
php数组的概述及分类与声明代码演示
Feb 26 PHP
php下获取http状态的实现代码
May 09 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
php解决抢购秒杀抽奖等大流量并发入库导致的库存负数的问题
Jun 19 PHP
Laravel 中获取上一篇和下一篇数据
Jul 27 PHP
PHP文件上传问题汇总(文件大小检测、大文件上传处理)
Dec 24 PHP
mac系统下安装多个php并自由切换的方法详解
Apr 21 PHP
PHP实现的AES双向加密解密功能示例【128位】
Sep 03 PHP
php+ajax 文件上传代码实例
Mar 18 PHP
PHP session垃圾回收机制实例分析
Jun 28 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
LotusPhp笔记之:Logger组件的使用方法
2013/05/06 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
PHP获取文件夹大小函数用法实例
2015/07/01 PHP
Thinkphp3.2.3整合phpqrcode生成带logo的二维码
2016/07/21 PHP
用javascript获取地址栏参数
2006/12/22 Javascript
List Information About the Binary Files Used by an Application
2007/06/11 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
JavaScript 模式之工厂模式(Factory)应用介绍
2012/11/15 Javascript
iframe调用父页面函数示例详解
2014/07/17 Javascript
jQuery实现跟随鼠标运动图层效果的方法
2015/02/02 Javascript
关于JavaScript数组你所不知道的3件事
2016/08/24 Javascript
原生js实现弹出层登录拖拽功能
2016/12/05 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
AngularJS 防止页面闪烁的方法
2017/03/09 Javascript
全面解析vue中的数据双向绑定
2017/05/10 Javascript
jQuery Validate表单验证插件实现代码
2017/06/08 jQuery
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
js实现Tab选项卡切换效果
2020/07/17 Javascript
通过js控制时间,一秒一秒自己动的实例
2017/10/25 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
VUE 3D轮播图封装实现方法
2018/07/03 Javascript
Vue中的Props(不可变状态)
2018/09/29 Javascript
Nuxt.js SSR与权限验证的实现
2018/11/21 Javascript
js实现图片局部放大效果详解
2019/03/18 Javascript
js实现转动骰子模型
2019/10/24 Javascript
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
[47:48]DOTA2上海特级锦标赛D组小组赛#2 Liquid VS VP第三局
2016/02/28 DOTA
Python入门教程之运算符与控制流
2016/08/17 Python
基于python读取.mat文件并取出信息
2019/12/16 Python
python3.6连接mysql数据库及增删改查操作详解
2020/02/10 Python
Marlies Dekkers内衣荷兰官方网店:荷兰奢侈内衣品牌
2020/03/27 全球购物
淘宝活动策划方案
2014/02/06 职场文书
个人培训自我鉴定
2014/03/28 职场文书
文明班级建设方案
2014/05/15 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
linux下安装redis图文详细步骤
2021/12/04 Redis