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


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截取中文字符串的问题
Jul 12 PHP
利用PHP实现与ASP Banner组件相似的类
Oct 09 PHP
php中在PDO中使用事务(Transaction)
May 14 PHP
php预定义变量使用帮助(带实例)
Oct 30 PHP
php跨域cookie共享使用方法
Feb 20 PHP
Symfony页面的基本创建实例详解
Jan 26 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
如何把php5.3版本升级到php5.4或者php5.5
Jul 31 PHP
php while循环控制的简单实例
May 30 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
YII框架关联查询操作示例
Apr 29 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
php使用sql数据库 获取字段问题介绍
2013/08/12 PHP
Apache启动报错No space left on device: AH00023该怎么解决
2015/10/16 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
JavaScript基本编码模式小结
2012/05/23 Javascript
说说JSON和JSONP 也许你会豁然开朗
2012/09/02 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
jQuery.extend()、jQuery.fn.extend()扩展方法示例详解
2014/05/08 Javascript
js自动生成的元素与页面原有元素发生堆叠的解决方法
2014/09/04 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
Nodejs 复制文件/文件夹的方法
2017/08/24 NodeJs
vue购物车插件编写代码
2017/11/27 Javascript
JavaScript实现的反序列化json字符串操作示例
2018/07/18 Javascript
vue中的inject学习教程
2019/04/24 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
2019/06/05 Javascript
解决layui富文本编辑器图片上传无法回显的问题
2019/09/18 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
JS中箭头函数与this的写法和理解
2021/01/14 Javascript
python自带的http模块详解
2016/11/06 Python
python实现音乐下载器
2018/04/15 Python
python程序变成软件的实操方法
2019/06/24 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
使用Python串口实时显示数据并绘图的例子
2019/12/26 Python
python中有函数重载吗
2020/05/28 Python
python和go语言的区别是什么
2020/07/20 Python
python利用线程实现多任务
2020/09/18 Python
Too Faced官网:美国知名彩妆品牌
2017/03/07 全球购物
台湾母婴用品购物网站:Infant婴之房
2018/06/15 全球购物
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
Sql面试题
2013/03/20 面试题
数据员岗位职责
2013/11/19 职场文书
小学毕业感言500字
2014/02/28 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
山楂树之恋观后感
2015/06/11 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
JAVA API 实用类 String详解
2021/10/05 Java/Android
Mysql 如何合理地统计一个数据库里的所有表的数据量
2022/04/18 MySQL