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&amp;MYSQL分页原理及实现
Jan 02 PHP
真正的ZIP文件操作类(php)
Jul 21 PHP
基于OpenCV的PHP图像人脸识别技术
Oct 11 PHP
PHP在字符断点处截断文字的实现代码
Apr 21 PHP
PHP函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
Jul 01 PHP
解析百度搜索结果link?url=参数分析 (全)
Oct 09 PHP
微信营销平台系统?刮刮乐的开发
Jun 10 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
ZendFramework2连接数据库操作实例
Apr 18 PHP
php实现JWT(json web token)鉴权实例详解
Nov 05 PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 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 __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
php中 $$str 中 &quot;$$&quot; 的详解
2015/07/06 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP 记录访客的浏览信息方法
2018/01/29 PHP
自制轻量级仿jQuery.boxy对话框插件代码
2010/10/26 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
js/jquery获取浏览器窗口可视区域高度和宽度以及滚动条高度实现代码
2012/12/17 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
JS使用getComputedStyle()方法获取CSS属性值
2014/04/23 Javascript
使用window.prompt()实现弹出用户输入的对话框
2015/04/13 Javascript
nodeJS删除文件方法示例
2016/12/25 NodeJs
JS库之Particles.js中文开发手册及参数详解
2017/09/13 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
详解vue.js根据不同环境(正式、测试)打包到不同目录
2018/07/13 Javascript
在React项目中使用Eslint代码检查工具及常见问题
2018/10/10 Javascript
js replace替换字符串同时替换多个方法
2018/11/27 Javascript
vue实现可视化可拖放的自定义表单的示例代码
2019/03/20 Javascript
JQuery表单元素取值赋值方法总结
2020/05/12 jQuery
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
[44:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#4EG VS Fnatic第二局
2016/03/03 DOTA
python解析文件示例
2014/01/23 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
2018/04/19 Python
tensorflow 打印内存中的变量方法
2018/07/30 Python
python中的decimal类型转换实例详解
2019/06/26 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python 实现PIL模块在图片画线写字
2020/05/16 Python
python判断正负数方式
2020/06/03 Python
canvas实现二维码和图片合成的示例代码
2018/08/01 HTML / CSS
教师节促销方案
2014/03/22 职场文书
抗洪抢险事迹材料
2014/05/06 职场文书
贪污受贿检讨书范文
2014/11/19 职场文书
小学教师自我评价
2015/03/04 职场文书
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫