微信公众号开发之微信公共平台消息回复类实例


Posted in PHP onNovember 14, 2014

本文实例讲述了微信公众号开发之微信公共平台消息回复类。分享给大家供大家参考。具体如下:

微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位分享一个。

<?php

/**

 * 微信公共平台消息回复类

 *

 *

 */

class BBCweixin{

 

 private $APPID="******";

 private $APPSECRET="******";

 /*

  *文本消息回复

  *@param array object

  *@param string content

  *@return string

  */

 public function resText($object,$content,$flag=0){

  $xmlText="<xml>

                  <ToUserName><![CDATA[%s]]></ToUserName>

                  <FromUserName><![CDATA[%s]]></FromUserName>

                  <CreateTime>%s</CreateTime>

                  <MsgType><![CDATA[text]]></MsgType>

                  <Content><![CDATA[%s]]></Content>

                  <FuncFlag>%d</FuncFlag>

                  </xml>";

     $resultStr=sprintf($xmlText,$object->FromUserName,$object->ToUserName,time(),$content,$flag);

  echo $resultStr;exit();

 }

 /*

  *图片消息回复

  *@param array object

  *@param string url

  *@return string

  */

 public function resImage($object,$media_id){

  $xmlImage="<xml>";

  $xmlImage.="<ToUserName><![CDATA[%s]]></ToUserName>";

  $xmlImage.="<FromUserName><![CDATA[%s]]></FromUserName>";

  $xmlImage.="<CreateTime>%s</CreateTime>";

  $xmlImage.="<MsgType><![CDATA[image]]></MsgType>";

  $xmlImage.="<Image><MediaId><![CDATA[%s]]></MediaId></Image>";

  $xmlImage.="</xml>";

  $resultStr=sprintf($xmlImage,$object->FromUserName,$object->ToUserName,time(),$media_id);

  echo $resultStr;exit();

 }

 /*

  *图文消息回复

  *@param array object

  *@param array newsData 二维数组 必须包含[Title][Description][PicUrl][Url]字段

  *@return string

  */

 public function resNews($object,$newsData=array()){

     $CreateTime=time();

     $FuncFlag=0;

     $newTplHeader="<xml>

        <ToUserName><![CDATA[{$object->FromUserName}]]></ToUserName>

        <FromUserName><![CDATA[{$object->ToUserName}]]></FromUserName>

        <CreateTime>{$CreateTime}</CreateTime>

        <MsgType><![CDATA[news]]></MsgType>

        <Content><![CDATA[%s]]></Content>

        <ArticleCount>%s</ArticleCount><Articles>";

     $newTplItem="<item>

      <Title><![CDATA[%s]]></Title>

      <Description><![CDATA[%s]]></Description>

      <PicUrl><![CDATA[%s]]></PicUrl>

      <Url><![CDATA[%s]]></Url>

      </item>";

     $newTplFoot="</Articles>

      <FuncFlag>%s</FuncFlag>

      </xml>";

     $Content='';

     $itemsCount=count($newsData);

     $itemsCount=$itemsCount<10?$itemsCount:10;//微信公众平台图文回复的消息一次最多10条

     if($itemsCount){

      foreach($newsData as $key=>$item){

       if($key<=9){

      $Content.=sprintf($newTplItem,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);

    }

      }

  }

     $header=sprintf($newTplHeader,0,$itemsCount);

     $footer=sprintf($newTplFoot,$FuncFlag);

     echo $header.$Content.$footer;exit();

 }

 

 /*

  *音乐消息回复

  *@param array object

  *@param array musicContent 二维数组 包含[Title][Description][MusicUrl][HQMusicUrl]字段

  *@return string

  */

 public function resMusic($object,$musicContent=array()){

   $xmlMusic="<xml>

                    <ToUserName><![CDATA[%s]]></ToUserName>

                    <FromUserName><![CDATA[%s]]></FromUserName>

                    <CreateTime>%s</CreateTime>

                    <MsgType><![CDATA[music]]></MsgType>

                    <Music>

     <Title><![CDATA[%s]]></Title>

                    <Description><![CDATA[%s]]></Description>

                    <MusicUrl><![CDATA[%s]]></MusicUrl>

                    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>

                    </Music>

                    </xml>";

  if(empty($musicContent[0]['HQMusicUrl'])){

   $musicContent[0]['HQMusicUrl']=$musicContent[0]['MusicUrl'];

  }

  $resultStr=sprintf($xmlMusic,$object->FromUserName,$object->ToUserName,time(),$musicContent[0]['Title'],$musicContent[0]['Description'],$musicContent[0]['MusicUrl'],$musicContent[0]['HQMusicUrl']);

  echo $resultStr;exit();

 }

 /*

  *上传多媒体文件接口

  *@param 

  *@param array mediaArr filename、filelength、content-type

  *@return object

  */

 public function uploadMedia($accessToken,$type='image',$mediaArr){

  $url="http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token=".$accessToken."&type=".$type;

  $doPost=self::curlPost($mediaArr,$url);

  return $doPost;

 }

 /*

  *GPS,谷歌坐标转换成百度坐标

  *@param lnt

  *@param lat

  *@return array

  */

 public function mapApi($lng,$lat,$type){

  $map=array();

  if($type=='gps'){

   $url="http://map.yanue.net/gpsApi.php?lat=".$lat."&lng=".$lng;

   $res=json_decode(file_get_contents($url));

   $map['lng']=$res->baidu->lng;

   $map['lat']=$res->baidu->lat;

  }

  if($type=='google'){

   $url="http://api.map.baidu.com/ag/coord/convert?from=2&to=4&mode=1&x=".$lng."&y=".$lat;

   $res=json_decode(file_get_contents($url));

   $map['lng']=base64_decode($res[0]->x);

   $map['lat']=base64_decode($res[0]->y);

  }

  return $map;

 }

 

 /**************************************************************

  *

  *  使用特定function对数组中所有元素做处理

  *  @param  string  &$array     要处理的字符串

  *  @param  string  $function   要执行的函数

  *  @return boolean $apply_to_keys_also     是否也应用到key上

  *  @access public

  *

  *************************************************************/

 public function arrayRecursive(&$array, $function, $apply_to_keys_also = false)

 {

  static $recursive_counter = 0;

  if (++$recursive_counter > 1000) {

   die('possible deep recursion attack');

  }

  foreach ($array as $key => $value) {

   if (is_array($value)) {

    self::arrayRecursive($array[$key], $function, $apply_to_keys_also);

   } else {

    $array[$key] = $function($value);

   }

 

   if ($apply_to_keys_also && is_string($key)) {

    $new_key = $function($key);

    if ($new_key != $key) {

     $array[$new_key] = $array[$key];

     unset($array[$key]);

    }

   }

  }

  $recursive_counter--;

 }

 

 /**************************************************************

  *

  *  将数组转换为JSON字符串(兼容中文)

  *  @param  array   $array      要转换的数组

  *  @return string      转换得到的json字符串

  *  @access public

  *

  *************************************************************/

 public function JSON($array) {

  self::arrayRecursive($array, 'urlencode', true);

  $json = json_encode($array);

  return urldecode($json);

 }

 /*

  *创建菜单

  *

  */

 public function creatMenu($shop_id,$data){

  $jsonArray=self::JSON($data);

  $AccessToken=self::accessToken($weiXin[0]['key'],$weiXin[0]['secret']);

  $MENU_URL="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=".$AccessToken;

  return self::curlPost($jsonArray,$MENU_URL);

 }

 /*

  *客服消息回复

  *@param array jsonArray Array {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}

  *@return string

  */

 

  public function customService($jsonArray,$hash){

  if(empty($jsonArray)){

   return false; 

  }

  $db=M();

  $sql="select * from bbc_wechats where hash='".$hash."'";

  $weChast=$db->query($sql);

  $AccessToken=self::accessToken($weChast[0]['key'],$weChast[0]['secret']);

  $TokenUrl="https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=".$AccessToken;

     $CustomRes=self::curlPost($jsonArray,$TokenUrl);

  return $CustomRes;

  }

  /*

 

   *获取access_token

   *@return objectStr

   */

  public function accessToken($appid,$secret){ 

   $access_token=BBCcache::getCache('accesstoken'.$appid);

   if($access_token){

    $AccessTokenRet=$access_token;

   }else{

    $TookenUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$appid}&secret={$secret}";

    $AccessTokenRes=@file_get_contents($TookenUrl);

    $AccessToken=json_decode($AccessTokenRes);

    $AccessTokenRet=$AccessToken->access_token;

    BBCcache::setCache('accesstoken'.$appid,$AccessToken->access_token,3600);

   }

   return $AccessTokenRet;

  }

  /*

   *向远程接口POST数据

   *@data Array {"touser":"OPENID","msgtype":"text","text":{"content":"Hello World"}}

   *@return objectArray

   */

  public function curlPost($data,$url){

    $ch = curl_init();

 

   curl_setopt($ch, CURLOPT_URL, $url); 

   curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");

   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 

   curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');

   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

   curl_setopt($ch, CURLOPT_AUTOREFERER, 1); 

   curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 

 

   $info = curl_exec($ch);

 

   if (curl_errno($ch)) {

    echo 'Errno'.curl_error($ch);

   }

 

   curl_close($ch);

   return json_decode($info);

  }

 //根据经纬度计算距离和方向

 function getRadian($d){

  return $d * M_PI / 180;

 }

 

 function getDistance ($lat1, $lng1, $lat2, $lng2){

  $EARTH_RADIUS=6378.137;//地球半径

  $lat1 =getRadian($lat1);

  $lat2 = getRadian($lat2);

 

  $a = $lat1 - $lat2;

  $b = getRadian($lng1) - getRadian($lng2);

 

  $v = 2 * asin(sqrt(pow(sin($a/2),2) + cos($lat1) * cos($lat2) * pow(sin($b/2),2)));

 

  $v = round($EARTH_RADIUS * $v * 10000) / 10000;

 

  return $v;

 }

}

?>

希望本文所述对大家基于PHP的微信公众号开发有所帮助。

PHP 相关文章推荐
PHP学习之PHP表达式
Oct 09 PHP
一个SQL管理员的web接口
Oct 09 PHP
一步一步学习PHP(6) 面向对象
Feb 16 PHP
PHP统计目录下的文件总数及代码行数(去除注释及空行)
Jan 17 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
Yii使用技巧大汇总
Dec 29 PHP
php微信开发之上传临时素材
Jun 24 PHP
微信公众平台开发-微信服务器IP接口实例(含源码)
Mar 05 PHP
[原创]php正则删除img标签的方法示例
May 27 PHP
thinkphp5 加载静态资源路径与常量的方法
Dec 24 PHP
PHP+ajax实现获取新闻数据简单示例
May 08 PHP
PHP实现chrome表单请求数据转换为接口使用的json数据
Mar 04 PHP
微信公众号点击菜单即可打开并登录微站的实现方法
Nov 14 #PHP
php异步多线程swoole用法实例
Nov 14 #PHP
PHP判断数据库中的记录是否存在的方法
Nov 14 #PHP
PHP合并静态文件详解
Nov 14 #PHP
php判断类是否存在函数class_exists用法分析
Nov 14 #PHP
php中常量DIRECTORY_SEPARATOR用法深入分析
Nov 14 #PHP
php使用ob_start()实现图片存入变量的方法
Nov 14 #PHP
You might like
自己动手,丰衣足食 - 短波框形天线制作
2021/03/01 无线电
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
jQuery UI AutoComplete 使用说明
2011/06/20 Javascript
javascript检测浏览器flash版本的实现代码
2011/12/06 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
PhotoShop给图片自动添加边框及EXIF信息的JS脚本
2015/02/15 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
JQuery勾选指定name的复选框集合并显示的方法
2015/05/18 Javascript
jQuery EasyUI封装简化操作
2016/09/18 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
JS实现按钮颜色切换效果
2020/09/05 Javascript
微信小程序使用request网络请求操作实例
2017/12/15 Javascript
Bootstrap开发中Tab标签页切换图表显示问题的解决方法
2018/07/13 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
react使用antd表单赋值,用于修改弹框的操作
2020/10/29 Javascript
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
python实现从字典中删除元素的方法
2015/05/04 Python
Python 包含汉字的文件读写之每行末尾加上特定字符
2016/12/12 Python
PYQT5实现控制台显示功能的方法
2019/06/25 Python
Python字典对象实现原理详解
2019/07/01 Python
Python:type、object、class与内置类型实例
2019/12/25 Python
利用django model save方法对未更改的字段依然进行了保存
2020/03/28 Python
使用Python将语音转换为文本的方法
2020/08/10 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Python中免验证跳转到内容页的实例代码
2020/10/23 Python
python 指定源路径来解决import问题的操作
2021/03/04 Python
CSS3 text-shadow实现文字阴影效果
2016/02/24 HTML / CSS
2019年Java面试必问之经典试题
2012/09/12 面试题
高二历史教学反思
2014/01/25 职场文书
高中军训感言800字
2014/03/05 职场文书
房屋出售协议书
2014/04/10 职场文书
地理信息科学专业推荐信
2014/09/08 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
2015年科室工作总结
2015/04/10 职场文书
欢送领导祝酒词
2015/08/12 职场文书