快捷搜索:

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

2019-11-13 09:57栏目:关于澳门金莎
TAG:

6, 调用WeChatMenu类的getMenu()方法可以读取当前平台上的菜单定义数据, 返回结果是一个JSON格式的文本

//功能:接收语音消息

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[music]]></MsgType>
$item_str
</xml>";

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

其中:ACCESS_TOKEN 用实际参数值代入

break;

    private function receiveVideo($object)
    {
        $content = array("MediaId"=>$object->MediaId, "ThumbMediaId"=>$object->ThumbMediaId, "Title"=>"", "Description"=>"");
        $result = $this->transmitVideo($object, $content);
        return $result;
    }

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

 

lnonce:随机数

    private function logger($log_content)
    {
        if(isset($_SERVER['HTTP_APPNAME'])){   //SAE
            sae_set_display_errors(false);
            sae_debug($log_content);
            sae_set_display_errors(true);
        }else if($_SERVER['REMOTE_ADDR'] != "127.0.0.1"){ //LOCAL
            $max_size = 10000;
            $log_filename = "log.xml";
            if(file_exists($log_filename) and (abs(filesize($log_filename)) > $max_size)){unlink($log_filename);}
            file_put_contents($log_filename, date('H:i:s')." ".$log_content."rn", FILE_APPEND);
        }
    }
}
?>

您可能感兴趣的文章:

  • .NET微信公众号开发之查询自定义菜单
  • .NET微信公众号开发之创建自定义菜单
  • 微信公众号支付(一)如何获取用户openId
  • C#实现微信公众号群发消息(解决一天只能发一次的限制)实例分享
  • 微信支付PHP SDK之微信公众号支付代码详解
  • php实现微信公众号主动推送消息
  • java微信公众号开发(搭建本地测试环境)
  • java微信公众号开发第一步 公众号接入和access_token管理
  • C#微信公众号开发之接收事件推送与消息排重的方法
  • 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
  • 微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解

 

$result =sprintf($newsTpl,$object->FromUserName,$object->ToUserName,time(),count($arr_item));

$wechatObj = new wechatCallbackapiTest();
if (!isset($_GET['echostr'])) {
    $wechatObj->responseMsg();
}else{
    $wechatObj->valid();
}

<?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=";
  $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=";
   $res=json_decode(file_get_contents($url));
   $map['lng']=$res->baidu->lng;
   $map['lat']=$res->baidu->lat;
  }
  if($type=='google'){
   $url=";
   $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=";
  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=";
     $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="";
    $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;
 }
}
?>

      对于易信平台,上述URL为

case"event"://事件

    private function receiveImage($object)
    {
        $content = array("MediaId"=>$object->MediaId);
        $result = $this->transmitImage($object, $content);
        return $result;
    }

复制代码 代码如下:

 

二、实验内容

        if($tmpStr == $signature){
            return true;
        }else{
            return false;
        }
    }

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

结果如下:

$content = $content."n您发送的消息PicUrl:".$object->PicUrl."

            switch ($RX_TYPE)
            {
                case "event":
                    $result = $this->receiveEvent($postObj);
                    break;
                case "text":
                    $result = $this->receiveText($postObj);
                    break;
                case "image":
                    $result = $this->receiveImage($postObj);
                    break;
                case "location":
                    $result = $this->receiveLocation($postObj);
                    break;
                case "voice":
                    $result = $this->receiveVoice($postObj);
                    break;
                case "video":
                    $result = $this->receiveVideo($postObj);
                    break;
                case "link":
                    $result = $this->receiveLink($postObj);
                    break;
                default:
                    $result = "unknow msg type: ".$RX_TYPE;
                    break;
            }
            $this->logger("T ".$result);
            echo $result;
        }else {
            echo "";
            exit;
        }
    }

 

case"voice"://语音

    private function transmitVideo($object, $videoArray)
    {
        $itemTpl = "<Video>
    <MediaId><![CDATA[%s]]></MediaId>
    <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
</Video>";

      对于易信平台,上述URL为

//功能:回复音乐消息

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
$item_str
</xml>";

$AppId="9cXXXXXXXXXXXXXXXXXX";     //公共平台提供的AppId参数
$AppSecret="61XXXXXXXXXXXXXX"; //公共平台提供的AppSecret参数

开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:

    private function transmitVoice($object, $voiceArray)
    {
        $itemTpl = "<Voice>
    <MediaId><![CDATA[%s]]></MediaId>
</Voice>";

1,首先: include_once 'jostudio.wechatmenu.php'; //包含WeChatMenu类

$content ="关注时扫描二维码关注事件,".strval($object->EventKey).strval($object->Ticket);

复制代码 代码如下:

 

return$result;

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

3,创建一个WeChatMenu类的实例

$this->logger("T

2013-01-01 版本1.0
2014-03-15 增加图片、视频、语音的内容回复
2014-04-09 增加菜单链接事件
2014-04-10 修改文本回复的判定方法

 

$result = $this->receiveShortVideo($postObj);

<?php
/*
    方倍工作室
    CopyRight 2014 All Rights Reserved
*/

 

e. receiveShortVideo ()函数

class wechatCallbackapiTest
{
    //验证消息
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }

4.4如此类推,逐个加入。

%s

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
$item_str
</xml>";

返回结果是一个JSON格式的文本,其中有AccessToken. (JSON是一种数据交换格式,不了解的同学要从头学一下才能明白)

//名称:checkSignature()

define("TOKEN", "weixin");

$object = new WeChatMenu($platform, $AppId, $AppSecret);  

//功能:接收链接消息

    //接收文本消息
    private function receiveText($object)
    {
        switch ($object->Content)
        {
            case "文本":
                $content = "这是个文本消息";
                break;
            case "图文":
            case "单图文":
                $content = array();
                $content[] = array("Title"=>"单图文标题",  "Description"=>"单图文内容", "PicUrl"=>"", "Url" =>"");
                break;
            case "多图文":
                $content = array();
                $content[] = array("Title"=>"多图文1标题", "Description"=>"", "PicUrl"=>"", "Url" =>"");
                $content[] = array("Title"=>"多图文2标题", "Description"=>"", "PicUrl"=>"", "Url" =>"");
                $content[] = array("Title"=>"多图文3标题", "Description"=>"", "PicUrl"=>"", "Url" =>"");
                break;
            case "音乐":
                $content = array("Title"=>"最炫民族风", "Description"=>"歌手:凤凰传奇", "MusicUrl"=>"", "HQMusicUrl"=>"");
                break;
            default:
                $content = date("Y-m-d H:i:s",time());
                break;
        }
        if(is_array($content)){
            if (isset($content[0]['PicUrl'])){
                $result = $this->transmitNews($object, $content);
            }else if (isset($content['MusicUrl'])){
                $result = $this->transmitMusic($object, $content);
            }
        }else{
            $result = $this->transmitText($object, $content);
        }
        return $result;
    }

      AccessToken不是永久有效的,返回结果中有一个失效时间,即过了XX秒后(一般是一天左右), AccessToken就会失效。

return$result;

        $item_str = sprintf($itemTpl, $imageArray['MediaId']);

 

$result = $this->transmitMusic($object,$content);

您可能感兴趣的文章:

  • php实现微信公众平台账号自定义菜单类
  • php微信公众平台开发类实例
  • php实现微信公众平台账号自定义菜单类
  • php微信公众平台开发之获取用户基本信息
  • PHP实现微信公众平台音乐点播
  • php版微信公众平台之微信网页登陆授权示例
  • weiphp微信公众平台授权设置
  • php微信公众平台配置接口开发程序
  • php微信公众平台开发之微信群发信息
  • php实现基于微信公众平台开发SDK(demo)扩展的方法
  • PHP Curl模拟登录微信公众平台、新浪微博实例代码
  • PHP封装的微信公众平台接口开发操作类完整示例

图片 1

case"image"://图片

    private function transmitMusic($object, $musicArray)
    {
        $itemTpl = "<Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
</Music>";

图片 2

}else if($object->Event=="VIEW"){

    //检查签名
    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr, SORT_STRING);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);

5, 调用WeChatMenu类的createMenu($menu_data)方法创建自定义菜单

$result = $this->transmitText($object,$content);

        $result = sprintf($newsTpl, $object->FromUserName, $object->ToUserName, time(), count($newsArray));
        return $result;
    }

开发语言: PHP 5.X

b.将三个参数字符串拼接成一个字符串进行sha1加密;

    //接收事件消息
    private function receiveEvent($object)
    {
        $content = "";
        switch ($object->Event)
        {
            case "subscribe":
                $content = "欢迎关注方倍工作室 ";
                $content .= (!empty($object->EventKey))?("n来自二维码场景 ".str_replace("qrscene_","",$object->EventKey)):"";
                break;
            case "unsubscribe":
                $content = "取消关注";
                break;
            case "SCAN":
                $content = "扫描场景 ".$object->EventKey;
                break;
            case "CLICK":
                switch ($object->EventKey)
                {
                    case "COMPANY":
                        $content = "方倍工作室提供互联网相关产品与服务。";
                        break;
                    default:
                        $content = "点击菜单:".$object->EventKey;
                        break;
                }
                break;
            case "LOCATION":
                $content = "上传位置:纬度 ".$object->Latitude.";经度 ".$object->Longitude;
                break;
            case "VIEW":
                $content = "跳转链接 ".$object->EventKey;
                break;
            default:
                $content = "receive a new event: ".$object->Event;
                break;
        }
        $result = $this->transmitText($object, $content);
        return $result;
    }

 

$echoStr =$_GET["echostr"];//从微信服务器得到echostr

    private function transmitImage($object, $imageArray)
    {
        $itemTpl = "<Image>
    <MediaId><![CDATA[%s]]></MediaId>
</Image>";

     createMenu() 将自动完成原理介绍中的所有过程

return$result;

    private function receiveLink($object)
    {
        $content = "你发送的是链接,标题为:".$object->Title.";内容为:".$object->Description.";链接地址为:".$object->Url;
        $result = $this->transmitText($object, $content);
        return $result;
    }

      $menu = new MenuDefine();   //创建一个MenuDefine实例

publicfunctionvalid()

    private function receiveLocation($object)
    {
        $content = "你发送的是位置,纬度为:".$object->Location_X.";经度为:".$object->Location_Y.";缩放级别为:".$object->Scale.";位置为:".$object->Label;
        $result = $this->transmitText($object, $content);
        return $result;
    }

$menu->addMenu("实用工具");
$menu->addMenuItem("找美食", "food");
$menu->addMenuItem("城市天气", "weather");
$menu->addMenuItem("翻译", "translate");

技术QQ群名称:豆豆咨询,群号:625686304

        $item_str = sprintf($itemTpl, $musicArray['Title'], $musicArray['Description'], $musicArray['MusicUrl'], $musicArray['HQMusicUrl']);

//创建一个WeChatMenu类的实例
$object = new WeChatMenu("weixin",$AppId, $AppSecret);   //第一个参数 "weixin", 表明是针对微信平台的
//$object = new WeChatMenu("yixin",$AppId, $AppSecret); //第一个参数 "yixin", 表明是针对易信平台的

break;

        $item_str = sprintf($itemTpl, $videoArray['MediaId'], $videoArray['ThumbMediaId'], $videoArray['Title'], $videoArray['Description']);

第二个类:MenuDefine 用于菜单数据定义

}else if(isset($content['MusicUrl'])){

        $item_str = sprintf($itemTpl, $voiceArray['MediaId']);

7, 调用WeChatMenu类的deleteMenu()方法可以删除平台上的菜单定义, 如成功则返回true

//名称:transmitText()

    private function transmitNews($object, $newsArray)
    {
        if(!is_array($newsArray)){
            return;
        }
        $itemTpl = "    <item>
        <Title><![CDATA[%s]]></Title>
        <Description><![CDATA[%s]]></Description>
        <PicUrl><![CDATA[%s]]></PicUrl>
        <Url><![CDATA[%s]]></Url>
    </item>
";
        $item_str = "";
        foreach ($newsArray as $item){
            $item_str .= sprintf($itemTpl, $item['Title'], $item['Description'], $item['PicUrl'], $item['Url']);
        }
        $newsTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<Content><![CDATA[]]></Content>
<ArticleCount>%s</ArticleCount>
<Articles>
$item_str</Articles>
</xml>";

 

$result = $this->transmitMusic($object,$content);

        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
$item_str
</xml>";

1,注册公众号、开通开发者模式时,平台将提供两个参数 APPID,APPSECRET (对于微信的订阅号,平台不提供; 易信所有公众号均提供)

if(isset($content[0]['PicUrl'])){

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

     MenuDefine这个类是用于简化菜单定义的,最后生成的JSON格式的数据,保存在 $menu->str中。

}

更新日志:

//定义一个菜单数据
$menu = new MenuDefine();   //创建一个MenuDefine实例

//名称:responseMsg()

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

其中:ACCESS_TOKEN 用实际参数值代入

{

代码如下:

先讲一下原理(详见公共平台开发文档):

privatefunctiontransmitMusic($object,$musicArray)

        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time());
        return $result;
    }

PS:微信服务号需要以单位身份注册(需上传单位证件等进行认证),个人身份只能注册订阅号(无自定义菜单)

{

    //响应消息
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
            $this->logger("R ".$postStr);
            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
            $RX_TYPE = trim($postObj->MsgType);

文件名:jostudio.wechatmenu.php中 (请在我的资源中下载), 此处只讲其使用。(感兴趣的同学,可以看源代码注释)

$content ="欢迎关注豆豆咨询";

    private function receiveVoice($object)
    {
        if (isset($object->Recognition) && !empty($object->Recognition)){
            $content = "你刚才说的是:".$object->Recognition;
            $result = $this->transmitText($object, $content);
        }else{
            $content = array("MediaId"=>$object->MediaId);
            $result = $this->transmitVoice($object, $content);
        }

微信把公众号分成订阅号和服务号两种,服务号可以自定义菜单, 菜单大大方便了用户操作。

}

    private function transmitText($object, $content)
    {
        $textTpl = "<xml>
<ToUserName><![CDATA[%s]]></ToUserName>
<FromUserName><![CDATA[%s]]></FromUserName>
<CreateTime>%s</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[%s]]></Content>
</xml>";
        $result = sprintf($textTpl, $object->FromUserName, $object->ToUserName, time(), $content);
        return $result;
    }

 

{

        return $result;
    }

 

a.将token、timestamp、nonce三个参数进行字典序排序;

     上述例程中,共定义了两个一级菜单

if(isset($content[0]['PicUrl'])){

对于易信平台,创建菜单的URL为

{

?>

}

 

exit;

返回结果是一个JSON格式的文本,其中有AccessToken. (JSON是一种数据交换格式,不了解的同学要从头学一下才能明白)

privatefunctionreceiveLink($object)

其中:APPID,APPSECRET 用实际参数值代入

}else{

4.5菜单定义结束,用  $menu->menuEnd();  结束菜单定义, 则此时$menu的str变量中已生成了菜单定义数据(JSON格式)

}else if($object->Event=="LOCATION"){

经本人编码、测试,在此提供两个类,彻底简化开发者的自定义菜单的开发工作 (开发者无需再去理解HTTP协议、JSON和公共平台协议了)

{

 

$result = $this->transmitNews($object,$content);

4, 定义菜单数据

Label:".$object->Label;

 

privatefunctionreceiveVideo($object)

         $name为菜单项名称

$result = $this->transmitMusic($object,$content);

 

header('Content-type:text');

          $menu->addMenuItem($name, $key); //二级菜单

{

$menu->addMenu("娱乐天地");
$menu->addMenuItem("猜谜语", "riddle");
$menu->addMenuItem("讲笑话", "joke");
$menu->addMenuItem("听音乐", "music");
$menu->addMenuItem("看电影", "movie");
$menu->addMenuItem("看小说", "novel");

break;

可以在易信中扫描以下二维码,加一下易信公众号“智能科技”,实际看看菜单效果

{

代码说明:

1)主函数:responseMsg()函数

 

被动回复消息:在用户给公众号发消息后,微信服务器会将消息发到开发者预先在开发者中心设置的服务器地址(开发者需要进行消息真实性验证),公众号可以在5秒内做出回复,可以回复一个消息,也可以回复命令告诉微信服务器这条消息暂不回复。

$menu->menuEnd(); //菜单定义结束, 则此时$menu->str中有菜单定义数据(JSON格式)

$item_str

      用GET方式读取URL

//名称:valid()

$menu->menuStart();  //菜单开始

return$result;

我看了开发文档,测试了3个小时,才算搞明白了。在此,写点心得,并提供一个类,彻底简化开发者的编码工作。

privatefunctiontransmitText($object,$content)

点菜单就可以直接进入操作了,方便!

case"location"://位置

第一个类:WeChatMenu  用于菜单操作

}

 

b.valid()函数

 

//1.关注公众号

 

$content = $content."n您发送的消息Title:".$object->Title."

4.1首先,创建一个MenuDefine实例

}

     用POST方式向这个URL提交菜单定义数据, URL:

";

     如成功创建菜单, createMenu()将返回true

}else{

test_menu.php 这个例程文件是完整可用的,根据需要修改一下,上传到服务器上,load一下即可完成自定义菜单操作

file_put_contents($log_filename,date('H:i:s')." ".$log_content."rn",FILE_APPEND);

 

}else if(isset($content['MusicUrl'])){

 

if(var_dump(property_exists('$object','EventKey'))){

3.1 创建菜单

privatefunctionreceiveShortVideo($object)

        第一个参数(文本型) $platform 指明是针对哪个平台,微信平台为"weixin", 易信平台为"yixin"

if(is_array($content)){

     如创建菜单失败, createMenu()将返回false, 错误代码和错误信息分别记录在 $object->errcode 和 $object->errmsg 两个变量中

$timestamp =$_GET["timestamp"];//从微信服务器得到timestamp

 

case"video"://视频

上述过程需要开发者非常了解 HTTP协议细节和JSON格式,对于一般开发者来说,可能是个噩梦。

$keyword =trim($object->Content);

<?php
include_once 'jostudio.wechatmenu.php'; //包含WeChatMenu类

f. receiveLocation ()函数

2,自定义菜单前,须向平台申请一个使用凭证(AccessToken), 方法如下:

}

//生成菜单
echo "<h2>Create Menu</h2>";
if ($object->createMenu($menu->str))  //$menu->str中有菜单定义数据(JSON格式)
 echo "Create menu OK";
else
 echo "Create menu failure:".$menuObject->errmsg;
echo "<hr>";

//取消关注公众号

 

微信公众号名称:豆豆咨询,微信公众号:douAsk

    菜单定义数据是一个JSON格式的文本 (开发文档讲得不是那么清晰,让我理解了好一会),做为POST方式的提交数据

$wechatObj->responseMsg();

 

return false;

         $key是菜单的键值,用户点击该菜单项时,将产生一个click消息, 消息中有这个key值,标明是哪个菜单被点击了

lsignature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

由于俺的微信公众号不是服务号、而是订阅号,没有自定义菜单功能,俺只能在易信中完成这个菜单了。

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

这是俺的易信公众号的菜单效果。

privatefunctionreceiveVoice($object)

 

//名称:logger()

3.2 删除菜单

}else if(isset($content['MusicUrl'])){

比如:公众服务号 "中国南方航空" 的自定义菜单如下图:

}

但是,对于公共平台开发者来说,定义、生成菜单还真有一点点麻烦。

}else{

图片 3

if(is_array($content)){

 

//功能:验证signature与加密数据(timestamp、nonce、TOKEN)是否一致

/*
//删除菜单
echo "<h2>Delete Menu</h2>";
echo $object->deleteMenu();
echo "<hr>";
*/

$result = $this->receiveText($postObj);

返回结果是一个JSON格式的文本,其中有操作成功码和出错信息

}else if(isset($content['MusicUrl'])){

4.2然后加入菜单

//功能:接收文本消息

 

{

PS:易信允许所有公众号均可自定义菜单(还是易信好!)

$result = $this->receiveImage($postObj);

用这两个类实现的自定义菜单操作,例程文件 test_menu.php

$item_str ="";

 

foreach($arr_itemas$item)

 

$result = $this->receiveVideo($postObj);

      用GET方式读取URL

return$result;

 

//功能:接收地理位置消息

4.3再加入菜单项

%s

3,获得有效的AccessToken后,就可以进行自定义菜单创建、删除操作了。

}else if(isset($content['MusicUrl'])){

 

if(isset($content[0]['PicUrl'])){

 

break;

      AccessToken不是永久有效的,返回结果中还有一个失效时间,即过了XX秒后(一般是一天左右), AccessToken就会失效。

$wechatObj =newwechatCallbackapiTest();

     代码为:  $object->createMenu($menu->str)) 

$content = $content."n您发送的消息Location_X:".$object->Location_X."

文件中定义了两个类:

{

//获取当前菜单数据
echo "<h2>Get Menu: the menu json data is</h2>";
echo $object->getMenu();
echo "<hr>";

MediaId:".$object->MediaId;

    $menu->addMenu($name);  //一级菜单, $name为菜单名

privatefunctioncheckSignature()

2,$AppId, $AppSecret是平台提供的两个参数,请修改代码,填入真实的值

if(isset($content[0]['PicUrl'])){


//名称:receiveLocation()

上述菜单的实际屏幕效果如下:

}

 

//功能:接收图片消息

responseMsg()处理接收到的消息,然后根据消息类型分别回发消息,相关函数如下所示。

}

//名称:transmitNews()

switch($RX_TYPE)

}

//返回:

关注“豆豆咨询”公众号之后输入彩蛋号即可获取源码,

privatefunctionreceiveEvent($object)

echo$result;

}

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

//自定义菜单:用户点击自定义菜单后,微信会把点击事件推送给开发者,注意,点击菜单弹出子菜单,不会产生上报。

$log_filename ="log.xml";

$result = $this->transmitNews($object,$content);

}else{

$result = $this->transmitNews($object,$content);

{

MediaId:".$object->MediaId;

$result = $this->transmitMusic($object,$content);

echo$echoStr;

$result = $this->transmitText($object,$content);

privatefunctionreceiveText($object)

break;

";

{

$wechatObj->valid();

}

$item_str

$content ="";

$content = $content."n您发送的消息Format:".$object->Format."

}else if($object->Event=="SCAN"){

return$result;

privatefunctiontransmitNews($object,$arr_item)

%s

}

exit;

".$postStr);//记录读取的信息

}

$result = $this->transmitMusic($object,$content);

}else if(isset($content['MusicUrl'])){

2)其他private函数

只有当微信服务器验证了应用服务器后台PHP的有效性,才能够向应用服务器发送消息和接收消息。每个用户针对每个公众号会产生一个安全的OpenID。公众号主要通过公众号消息会话和公众号内网页来为用户提供服务的,本次实验主要介绍公众号消息会话中的被动回复消息。

}else{

$textTpl ="

//返回:从微信服务器发送过来的echostr

$keyword =trim($object->Content);

$content = $content."n您发送的消息ThumbMediaId:".$object->ThumbMediaId."

if($this->checkSignature()){

sae_debug($log_content);

}

return true;

}else{

return;

图片 4

";

}

一、实验目的

}

//名称:receiveText()

}else if($object->Event=="CLICK"){

}

}

return$result;

$max_size = 10000;

j. transmitText ()函数

{

四、技术服务

$postObj =simplexml_load_string($postStr,'SimpleXMLElement',LIBXML_NOCDATA);//解析xml数据到object

privatefunctionreceiveImage($object)

彩蛋号:1202。

sort($tmpArr);//将token、timestamp、nonce三个参数进行字典序排序;

//点击菜单跳转链接时的事件推送

h. transmitText ()函数

3)函数代码说明

Location_Y:".$object->Location_Y;

MediaId:".$object->MediaId;

//名称:receiveEvent()

}

$content = $content."n您发送的消息是".$keyword;

if(!is_array($arr_item))

}else{

1、掌握微信开发PHP后台验证、接收和发送消息。

if(!isset($_GET['echostr'])) {//判断echostr是否为空

1、如果有疑问或者需要帮助,请加入QQ群(群名称:豆豆咨询,群号:625686304);或者公众号douAsk,公众号名称为“豆豆咨询”。扫描以下二维码,关注“豆豆咨询”

privatefunctionreceiveLocation($object)

{

$result = $this->transmitNews($object,$content);

$result = $this->transmitNews($object,$content);

}

define("TOKEN","weixin");//与服务器设置的TOKEN要一致

lechostr:随机字符串

//返回:回发消息

//功能:回复图文消息

if(file_exists($log_filename) and (abs(filesize($log_filename))> $max_size)){unlink($log_filename);}

//返回:回发消息

//功能:根据接收的消息类型(文本、事件等),分别回复消息

$result = $this->receiveLink($postObj);

if(isset($content[0]['PicUrl'])){

a.checkSignature()函数

}

if(isset($_SERVER['HTTP_APPNAME'])){//SAE

}else if($_SERVER['REMOTE_ADDR'] !="127.0.0.1"){//LOCAL

a. receiveEvent ()函数

//返回:回发消息

//返回:回发消息

//2.扫描带参数二维码事件(用户未关注时,进行关注后的事件推送)

$result = $this->receiveEvent($postObj);

}

break;

验证通过后,用户每次向公众号发送消息、或者产生自定义菜单点击事件时,开发者填写的服务器配置URL将得到微信服务器推送过来的消息和事件,然后开发者可以依据自身业务逻辑进行响应,例如回复消息等。

if(is_array($content)){

$result = $this->transmitText($object,$content);

return$result;

";

//1.关注公众号;2.扫描带参数二维码事件(用户未关注时,进行关注后的事件推送)

<![CDATA[%s]]>

$content ="点击菜单拉取消息时的事件推送:".strval($object->EventKey);

if(is_array($content)){

$result =sprintf($textTpl,$object->FromUserName,$object->ToUserName,time());

}

$keyword =trim($object->Content);

}

$nonce =$_GET["nonce"];//从微信服务器得到nonce

case"text"://文本

$item_str =sprintf($itemTpl,$musicArray['Title'],$musicArray['Description'],$musicArray['MusicUrl'],$musicArray['HQMusicUrl']);

echo"";

publicfunctionresponseMsg()

$content = $content."n您发送的消息Url:".$object->Url;

}

//返回:回发消息

三、实验步骤及过程

}else if($object->Event=="unsubscribe"){

if(is_array($content)){

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

$keyword =trim($object->Content);

".$result);//记录发送的信息

}

}

1、验证消息是否来自微信服务器。

//功能:发送文本消息

{

//返回:回发消息

break;

if(is_array($content)){

$keyword =trim($object->Content);

$tmpStr =implode($tmpArr);//将数组的内容连接成一个字符串

//功能:接收视频消息

if($object->Event=="subscribe"){

d. receiveVoice ()函数

sae_set_display_errors(true);

$content ="取消关注";

$result = $this->transmitMusic($object,$content);

$content = $content."n您发送的消息ThumbMediaId:".$object->ThumbMediaId."

case"link"://链接

1)参数说明

i. transmitText ()函数

}

//上报地理位置事件:维度、经度、精度

//功能:记录日志

$result = $this->transmitNews($object,$content);

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

//名称:receiveShortVideo()

}else if(isset($content['MusicUrl'])){

Description:".$object->Description;

if(is_array($content)){

//扫描带参数二维码事件(扫描带参数二维码事件,用户已关注时的事件推送)

}

}

//返回:true:验证通过;false:验证失败

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

{

return$result;

break;

$itemTpl ="

//功能:根据事务类型,构造回发消息

//功能:验证微信服务器发送的消息,并发送给$echoStr

$result = $this->transmitText($object, $content);

//名称:receiveImage()

$textTpl ="

}

b. receiveText ()函数

c. receiveImage ()函数

f. transmitText ()函数

//返回:回发消息

$result = $this->transmitText($object,$content);

$content = $content."n您发送的消息Scale:".$object->Scale."

}else{

$keyword =trim($object->Content);

$tmpStr =sha1($tmpStr);//将字符串进行sha1加密;

$content ="未关注时扫描二维码关注事件,".strval($object->EventKey).strval($object->Ticket);

$result = $this->receiveLocation($postObj);

2、接收和发送消息解析。

}

$result = $this->transmitText($object,$content);

//名称:receiveVoice()

$RX_TYPE =trim($postObj->MsgType);//接收消息类型text/event

return$result;

$tmpArr =array($token, $timestamp, $nonce);//建立数组tmpArr

//返回:音乐消息

//名称:receiveLink()

$result =sprintf($textTpl,$object->FromUserName,$object->ToUserName,time(),$content);

$itemTpl ="

}

c.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。

sae_set_display_errors(false);

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

$newsTpl ="

$result = $this->transmitMusic($object,$content);

//返回:回发消息

$content ="点击菜单跳转链接时的事件推送:".strval($object->EventKey);

1、验证代码解析。

//功能:接收小视频消息

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

2、接收消息。

$postStr =$GLOBALS["HTTP_RAW_POST_DATA"];//用$GLOBALS['HTTP_RAW_POST_DATA']来接收数据

$result = $this->transmitText($object,$content);

if(isset($content[0]['PicUrl'])){

}else{

d. receiveVideo ()函数

//返回:回发消息

ltimestamp:时间戳

case"shortvideo"://小视频

if(!empty($postStr)){

<![CDATA[%s]]>

//返回:返回消息结果

MediaId:".$object->MediaId;

//名称:transmitMusic()

2)验证过程

c.验证过程

if($tmpStr == $signature){//验证字符串,即signature与tmpStr对比

";

//返回:图文消息

}

if(isset($content[0]['PicUrl'])){

{

$signature =$_GET["signature"];//从微信服务器得到signature

$result = $this->transmitNews($object,$content);

开源项目:https://github.com/chenxhjeo,个人博客:http://blog.csdn.net/u013487761

return$result;

}

初建日期:2017.04.08

g. receiveLink ()函数

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下所示:

$token =TOKEN;//从微信管理员设置的TOKEN

$content =date("Y-m-d H:i:s",time())."n技术支持'豆豆咨询'微信公众号(douAsk)和qq群号(625686304):";

}

%s

}else{

(>>>>在公众号中输入文章最后彩蛋即可获取源代码)

$content ="上报地理位置:".strval($object->Latitude).",".strval($object->Longitude).",".strval($object->Precision);//

$keyword =trim($object->Content);

$this->logger("R

privatefunctionlogger($log_content)

$result = $this->transmitText($object,$content);

//名称:receiveVideo()

}else{

$result = $this->receiveVoice($postObj);

版权声明:本文由澳门金莎娱乐发布于关于澳门金莎,转载请注明出处:易信公共平台开发,微信公众号开发之微信公共平台消息回复类实例