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


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 相关文章推荐
eWebEditor v3.8 商业完整版 (PHP)
Dec 06 PHP
PHP读MYSQL中文乱码的解决方法
Dec 17 PHP
防止MySQL注入或HTML表单滥用的PHP程序
Jan 21 PHP
PHP缓存技术的使用说明
Aug 06 PHP
PHPExcel读取Excel文件的实现代码
Dec 06 PHP
深入php define()函数以及defined()函数的用法详解
Jun 05 PHP
php中出现空白页的原因及解决方法汇总
Jul 08 PHP
php遍历CSV类实例
Apr 14 PHP
php安装ssh2扩展的方法【Linux平台】
Jul 20 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP使用星号替代用户名手机和邮箱的实现代码
Feb 07 PHP
基于ThinkPHP5框架使用QueryList爬取并存入mysql数据库操作示例
May 25 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
输出控制类
2006/10/09 PHP
一个简单php扩展介绍与开发教程
2010/08/19 PHP
PHP基于MySQL数据库实现对象持久层的方法
2015/06/17 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
php+js实现裁剪任意形状图片
2018/10/31 PHP
php的命名空间与自动加载实现方法
2019/08/25 PHP
input 高级限制级用法
2009/03/26 Javascript
jQuery中closest和parents的区别分析
2015/05/07 Javascript
jquery实现简单实用的弹出层效果代码
2015/10/15 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
jQuery插件echarts实现的多折线图效果示例【附demo源码下载】
2017/03/04 Javascript
NodeJS、NPM安装配置步骤(windows版本) 以及环境变量详解
2017/05/13 NodeJs
你点的 ES6一些小技巧,请查收
2018/04/25 Javascript
微信小程序实现简单跑马灯效果
2020/05/26 Javascript
JavaScript页面倒计时功能完整示例
2019/05/15 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
[04:44]显微镜下的DOTA2第二期——你所没有注意到的细节
2014/06/20 DOTA
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
几个提升Python运行效率的方法之间的对比
2015/04/03 Python
Python CSV模块使用实例
2015/04/09 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
利用matplotlib+numpy绘制多种绘图的方法实例
2017/05/03 Python
Python使用pyh生成HTML文档的方法示例
2018/03/10 Python
django fernet fields字段加密实践详解
2019/08/12 Python
详解PyTorch中Tensor的高阶操作
2019/08/18 Python
python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】
2019/10/24 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
canvas三角函数模拟水波效果的示例代码
2018/07/03 HTML / CSS
基于HTML5+CSS3实现简单的时钟效果
2017/09/11 HTML / CSS
英国高档时尚男装购物网站:MR PORTER
2016/08/09 全球购物
全球最大的跑步用品商店:Road Runner Sports
2016/09/11 全球购物
美国餐厅用品和厨房设备批发网站:KaTom Restaurant Supply
2018/01/27 全球购物
烟台的海导游词
2015/02/02 职场文书
python的netCDF4批量处理NC格式文件的操作方法
2022/03/21 Python