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


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 相关文章推荐
PHP4实际应用经验篇(5)
Oct 09 PHP
php一个找二层目录的小东东
Aug 02 PHP
PHP flock 文件锁详细介绍
Dec 29 PHP
PHP 验证码不显示只有一个小红叉的解决方法
Sep 30 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
PHP添加图片水印、压缩、剪切的封装类
Aug 17 PHP
php构造函数与析构函数
Apr 23 PHP
php 一维数组的循环遍历实现代码
Apr 10 PHP
PHP中关键字interface和implements详解
Jun 14 PHP
Mac下快速搭建PHP开发环境步骤详解
May 05 PHP
PHP Trait代码复用类与多继承实现方法详解
Jun 17 PHP
laravel框架语言包拓展实现方法分析
Nov 22 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
PHP生成唯一ID之SnowFlake算法
2016/12/17 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
由JavaScript中call()方法引发的对面向对象继承机制call的思考
2011/09/12 Javascript
关于jQuery的inArray 方法介绍
2011/10/08 Javascript
Js 冒泡事件阻止实现代码
2013/01/27 Javascript
nodejs实现黑名单中间件设计
2014/06/17 NodeJs
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
jQuery验证插件 Validate详解
2014/11/20 Javascript
Jquery ui datepicker设置日期范围,如只能隔3天【实现代码】
2016/05/04 Javascript
jQuery实现表格文本框淡入更改值后淡出效果
2016/09/27 Javascript
Vue.js绑定HTML class数组语法错误的原因分析
2016/10/19 Javascript
JavaScript实现的浏览器下载文件的方法
2017/08/09 Javascript
weui框架实现上传、预览和删除图片功能代码
2017/08/24 Javascript
简单实现vue验证码60秒倒计时功能
2017/10/11 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
深入理解vue中的slot与slot-scope
2019/04/22 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
vue axios请求成功却进入catch的原因分析
2020/09/08 Javascript
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
对tensorflow 的模型保存和调用实例讲解
2018/07/28 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
Python matplotlib修改默认字体的操作
2020/03/05 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
HTML5在a标签内放置块级元素示例代码
2013/08/23 HTML / CSS
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
Zadig&Voltaire官网:法国时装品牌
2018/01/05 全球购物
机关党总支领导班子整改方案
2014/09/20 职场文书
员工家属慰问信
2015/03/24 职场文书
同事打架检讨书
2015/05/06 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
销区经理年终述职报告模板
2019/11/28 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis