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


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数组的概述及分类与声明代码演示
Feb 26 PHP
深入php多态的实现详解
Jun 09 PHP
PHP 输出URL的快捷方式示例代码
Sep 22 PHP
PHP改进计算字符串相似度的函数similar_text()、levenshtein()
Oct 27 PHP
9条PHP编程小知识及易犯的小错误
Jan 22 PHP
php数组使用规则分析
Feb 27 PHP
php实现json编码的方法
Jul 30 PHP
Laravel5.1自定义500错误页面示例
Oct 09 PHP
php删除数组指定元素实现代码
May 03 PHP
PHP设计模式之注册树模式分析
Jan 26 PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 PHP
PHP实现批量修改文件名的方法示例
Sep 18 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 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
PHP strtok()函数的优点分析
2010/03/02 PHP
php 伪造ip以及url来路信息方法汇总
2014/11/25 PHP
19个Android常用工具类汇总
2014/12/30 PHP
php使用number_format函数截取小数的方法分析
2016/05/27 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
JS控制表格隔行变色
2006/06/26 Javascript
获取Javscript执行函数名称的方法
2006/12/22 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
浅谈js数据类型判断与数组判断
2016/08/29 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
Nodejs下DNS缓存问题浅析
2016/11/16 NodeJs
Jquery 整理元素选取、常用方法一览表
2016/11/26 Javascript
nodejs的压缩文件模块archiver用法示例
2017/01/18 NodeJs
React 组件间的通信示例
2018/06/14 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
vue实现评价星星功能
2020/06/30 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
[01:33]一分钟玩转DOTA2第三弹:DOTA2&DotA快捷操作大对比
2014/06/04 DOTA
python实现机器人行走效果
2018/01/29 Python
详解python中的装饰器
2018/07/10 Python
Python搭建代理IP池实现检测IP的方法
2019/10/27 Python
基于zepto的插件之移动端无缝向上滚动并上下触摸滑动实例代码
2016/12/20 HTML / CSS
运动会800米加油稿
2014/02/22 职场文书
元宵节主持词
2014/03/25 职场文书
个人担保书范文
2014/05/20 职场文书
水利局群众路线专题民主生活会发言材料
2014/09/21 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
学习与创新自我评价
2015/03/09 职场文书
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
python中Matplotlib绘制直线的实例代码
2021/07/04 Python