比较完整的微信开发php代码


Posted in PHP onAugust 02, 2016

本文实例为大家分享了微信开发php代码,供大家参考,具体内容如下

<?php
  //封装成一个微信接口类
 
  class WeixinApi
  {
    private $appid;
    private $appsecret; 
 
    //构造方法 初始化赋值
    public function __construct($appid="",$appsecret="")
    {
      $this->appid = $appid;
      $this->appsecret = $appsecret;
    }
 
    //验证服务器地址有效性
    public function valid()
    {
      if($this->checkSignature())
      {
        $echostr = $_GET['echostr'];//随机的字符串
        return $echostr;
      }
      else
      {
        return "Error";
      }
    }
 
    //检查签名
    private function checkSignature()
    {
      //一、接收微信服务器GET方式提交过来的4个参数数据
 
      $signature = $_GET['signature'];//微信加密签名
 
      $timestamp = $_GET['timestamp'];//时间戳
 
      $nonce = $_GET['nonce'];//随机数
 
      //二、加密/校验过程
      // 1. 将token、timestamp、nonce三个参数进行字典序排序;
      // bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] ) 对数组排序 
       
      $tmpArr = array(TOKEN,$timestamp,$nonce);//将上面三个参数放到一个数组里面
      sort($tmpArr,SORT_STRING);
 
      // 2. 将三个参数字符串拼接成一个字符串进行sha1加密;
      $tmpStr = implode($tmpArr); //将数组转化成字符串
 
      $signatureStr = sha1($tmpStr);
 
      // 3. 开发者获得加密后的字符串与signature对比。
      if($signatureStr == $signature)
      {
        return true;
      }
      else
      {
        return false;
      }
    }
 
    //响应消息
    public function responseMsg()
    {
      //接收微信服务器发送POST请求到开发者服务器,携带的XML数据包
      $postData = $GLOBALS['HTTP_RAW_POST_DATA'];
 
      //处理xml数据包
      $xmlObj = simplexml_load_string($postData,"SimpleXMLElement",LIBXML_NOCDATA);
 
      if(!$xmlObj)
      {
        echo "";
        exit;
      }
 
      //获取接收消息中的参数内容
      $toUserName = $xmlObj->ToUserName;//开发者微信号
      $fromUserName = $xmlObj->FromUserName;//发送方的微信号(openid)
      $msgType = $xmlObj->MsgType;//消息类型
      switch ($msgType) {
        //接收文本消息
        case 'text':
          //获取文本消息的关键字
          $keyword = $this->receiveText($xmlObj); 
          //进行关键字回复
          switch($keyword)
          {
            case "w001":
            case "W001":
              return $this->replyText($xmlObj,"Hi~你好");
              break;
            case "w002":
            case "W002":
              return $this->replyText($xmlObj,"Hi~尴尬了");
              break;
            case "笑话":
              $key = "dee9ebc68fd5a61f67286063932afe56";
              return $this->replyNews($xmlObj,$this->joke_text($key));
              break;
            default:
              $key = "dee9ebc68fd5a61f67286063932afe56";
              return $this->replyNews($xmlObj,$this->joke_text($key));
              break;
          }    
          break;
        //接收图片消息
        case 'image':
          return $this->receiveImage($xmlObj);
          break;
        //接收事件推送
        case 'event':
          return $this->receiveEvent($xmlObj);
          break;
      }      
    }
 
    //接收事件推送
    public function receiveEvent($obj)
    {
      //接收事件类型
      $event = $obj->Event;
      switch ($event)
      {
        //关注事件
        case 'subscribe':
          //下发欢迎消息
          $newsArr = array(
                  array(
                    "Title"=>"做有价值的头条资讯!",
                    "Description"=>"把握价值头条资讯,日常更加有谈资呢!",
                    "PicUrl"=>"http://jober.applinzi.com/news/img/news.png",
                    "Url"=>"http://jober.applinzi.com/news/index.php"
                  )                
                );
          //回复图文消息
          return $this->replyNews($obj,$newsArr); 
          break;
        //取消关注事件
        case 'unsubscribe':
          //账号的解绑操作等等
          break;
        //自定义菜单推送CLICK事件
        case 'CLICK':
          $eventKey = $obj->EventKey;//获取事件KEY值,与自定义菜单接口中KEY值对应
          switch ($eventKey) 
          {
            case 'old':
   
              $weixinArr = $this->history("da675ebc6a0d72920dca3f676122a693");
              $weixinArr = array_slice($weixinArr, 0,5);
              $newsArr = array();
 
              foreach ($weixinArr as $item) 
              {
                $newsArr = array(array(
                          "Title" => $item['Description'],
                          "Description" => $item['Title'],
                          "PicUrl" => "http://1.jober.applinzi.com/news/img/2.jpg",
                          "Url" => "http://www.todayonhistory.com/"                          
                        ));
              }
              return $this->replyNews($obj,$newsArr);
              break;
          }
        break;
      }
    }
 
    //接收文本消息
    public function receiveText($obj)
    {
      $content = trim($obj->Content);//文本消息的内容
      return $content;
    }
 
    //接收图片消息
    public function receiveImage($obj)
    {
      $picUrl = $obj->PicUrl;//图片的链接
      $mediaId = $obj->MediaId;//图片消息媒体id
      return $this->replyImage($obj,$mediaId);
    }
 
    //回复图片消息
    public function replyImage($obj,$mediaId)
    {
      $replyXml = "<xml>
              <ToUserName><![CDATA[%s]]></ToUserName>
              <FromUserName><![CDATA[%s]]></FromUserName>
              <CreateTime>%s</CreateTime>
              <MsgType><![CDATA[image]]></MsgType>
              <Image>
                <MediaId><![CDATA[%s]]></MediaId>
              </Image>
            </xml>";
      return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$mediaId);
           
    }
 
    //回复文本消息
    public function replyText($obj,$content)
    {
      $replyXml = "<xml>
              <ToUserName><![CDATA[%s]]></ToUserName>
              <FromUserName><![CDATA[%s]]></FromUserName>
              <CreateTime>%s</CreateTime>
              <MsgType><![CDATA[text]]></MsgType>
              <Content><![CDATA[%s]]></Content>
            </xml>";
      return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$content);
    }
     
    //回复图文消息
    public function replyNews($obj,$newsArr)
    {
      //判断是否为数组类型
      if(!is_array($newsArr))
      {
        return;
      }
      // 判断数组是否为空数组
      if(!$newsArr)
      {
        return;
      }
      $itemStr = "";
      //定义item模板
      $itemXml = "<item>
              <Title><![CDATA[%s]]></Title> 
              <Description><![CDATA[%s]]></Description>
              <PicUrl><![CDATA[%s]]></PicUrl>
              <Url><![CDATA[%s]]></Url>
            </item>";
      foreach($newsArr as $item)
      {
        $itemStr .= sprintf($itemXml,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
      }
      $replyXml = "<xml>
              <ToUserName><![CDATA[%s]]></ToUserName>
              <FromUserName><![CDATA[%s]]></FromUserName>
              <CreateTime>%s</CreateTime>
              <MsgType><![CDATA[news]]></MsgType>
              <ArticleCount>".count($newsArr)."</ArticleCount>
              <Articles>".$itemStr."</Articles>
            </xml>"; 
      return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time());     
    }
 
    //封装https请求(GET和POST)
   
    protected function https_request($url,$data=null)
    {
      //1、初始化curl
      $ch = curl_init();
 
      //2、设置传输选项
      curl_setopt($ch, CURLOPT_URL, $url);//请求的url地址
      curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//将请求的结果以文件流的形式返回
       
      if(!empty($data))
      {
        curl_setopt($ch,CURLOPT_POST,1);//请求POST方式
        curl_setopt($ch,CURLOPT_POSTFIELDS,$data);//POST提交的内容
      }
 
      //3、执行请求并处理结果
      $outopt = curl_exec($ch);
 
      //把json数据转化成数组
      $outoptArr = json_decode($outopt,TRUE);
 
      //4、关闭curl
      curl_close($ch);
 
      //如果返回的结果$outopt是json数据,则需要判断一下
      if(is_array($outoptArr))
      {  
        return $outoptArr;
      }
      else
      {
        return $outopt;
      }      
    }
 
    public function juhe_weixin($key,$type)
    {
      $url ="http://v.juhe.cn/toutiao/index?type={$type}&key={$key}";
      $result = $this->https_request($url);
      if($result['error_code'] == 0)
      {
        return $result['result']['data'];
      }
      else
      {
        return array();
      }
    }
 
    //聚合数据-获取最新趣图
    public function joke_text($key,$pagesize=10)
    {
      $url = "http://japi.juhe.cn/joke/img/text.from?key={$key}&pagesize={$pagesize}";
      $jokeArr = $this->https_request($url);
      $resultArr = $jokeArr['result']['data'];
      // $content = $resultArr[0]['content'];
      // return $this->replyText($xmlObj,$content);
       
      $newsArr = array();
      //判断笑话接口是否获取数据
      if($jokeArr['error_code'] == 0)
      {
        foreach($resultArr as $item)
        {
          $newsArr[] = array(
                "Title"=>$item['content'],
                "Description"=>$item['updatetime'],
                "PicUrl"=>$item['url'],
                "Url"=>$item['url']
              );
        }        
      }
      return $newsArr;
    }
 
 
    //聚合数据-获取历史上的今天
       
    public function history($key)
    {
      $m = idate('m');
      $d = idate('d');
      $day = "{$m}/{$d}";
     
      $url = "http://v.juhe.cn/todayOnhistory/queryEvent.php?key={$key}&date={$day}";
      $historyArr = $this->https_request($url);
      $resultArr = $historyArr['result'];
      // $content = $resultArr['title'];
      // return $this->replyText($xmlObj,$content);
       
      $newsArr = array();
      //判断接口是否获取数据
      if($jokeArr['error_code'] == 0)
      {
        foreach($resultArr as $item)
        {
          $newsArr[] = array(
                "Title"=>$item['title'],
                "Description"=>$item['date'],
                "PicUrl"=>"",
                "Url"=>""
              );
        }        
      }
      return $newsArr;
    }
 
    public function fund($key)
    {
 
      $url = "http://japi.juhe.cn/jingzhi/query.from?key={$key}";
      $fundArr = $this->https_request($url);
      $resultArr = $fundArr['result'];
      // $content = $resultArr['title'];
      // return $this->replyText($xmlObj,$content);
       
      $newsArr = array();
      //判断接口是否获取数据
      if($jokeArr['error_code'] == 0)
      {
        foreach($resultArr as $item)
        {
          $newsArr[] = array(
                "Title"=>$item['day'],
                "Description"=>$item['title'],
                "PicUrl"=>"",
                "Url"=>"http://www.baidu.com"
              );
        }        
      }
      return $newsArr;
    }
 
    /**
      *获取基础支持里面的接口调用凭证access_token并缓存access_token
      *@return access_token string 接口凭证
    **/
    public function getAccessToken()
    {
      //获取memcache缓存的access_token
      $access_token = $this->_memcache_get("access_token");
      //如果缓存的access_token失效
      if(!$access_token)
      {  
        //如果失效调用获取接口凭证来获取access_token
        $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={$this->appid}&secret={$this->appsecret}";
        $outoptArr = $this->https_request($url);
        if(!isset($outoptArr['errcode']))
        {
          //memcache缓存access_token
          $this->_memcache_set("access_token",$outoptArr['access_token'],7000);
          return $outoptArr['access_token'];
        }
      }  
      return $access_token;
    }
 
    //初始化memcache
    private function _memcache_init()
    {
      $mmc = new Memcache;
      $ret = $mmc -> connect();
      if ($ret == false) 
      {
        return;
      } 
      return $mmc;
    }
 
    //设置memcache
    private function _memcache_set($key,$value,$time=0)
    {
      $mmc = $this->_memcache_init();
      $mmc -> set($key,$value,0,$time);
    }
 
    //获取memcahce
    private function _memcache_get($key)
    {
      $mmc = $this->_memcache_init(); 
      return $mmc -> get($key);  
    }
 
    //自定义菜单创建
 
    public function menu_create($data)
    {
      $access_token = $this->getAccessToken();
      //自定义菜单创建接口地址
      $url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}";
      return $this->https_request($url,$data);
    }
 
    //自定义菜单删除
    public function menu_delete()
    {
      $access_token = $this->getAccessToken();
      $url = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={$access_token}";
      return $this->https_request($url);
    }
  }
?>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
实现分十页分向前十页向后十页的处理
Oct 09 PHP
php下实现一个阿拉伯数字转中文数字的函数
Jul 10 PHP
php操作excel文件 基于phpexcel
Jul 02 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
PHP字符串的编码问题的详细介绍
Apr 27 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
May 10 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
Dec 14 PHP
PHP打印输出函数汇总
Aug 28 PHP
PHP7多线程搭建教程
Apr 21 PHP
PHP中一个有趣的preg_replace函数详解
Aug 15 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 16 PHP
PHP Swoole异步Redis客户端实现方法示例
Oct 24 PHP
微信利用PHP创建自定义菜单的方法
Aug 01 #PHP
php微信浏览器分享设置以及回调详解
Aug 01 #PHP
PHP+Apache+Mysql环境搭建教程
Aug 01 #PHP
Thinkphp和Bootstrap结合打造个性的分页样式(推荐)
Aug 01 #PHP
PHP实现将MySQL重复ID二维数组重组为三维数组的方法
Aug 01 #PHP
利用PHP自动生成印有用户信息的名片
Aug 01 #PHP
php+ajax登录跳转登录实现思路
Jul 31 #PHP
You might like
一些星际专用术语解释
2020/03/04 星际争霸
php实现天干地支计算器示例
2014/03/14 PHP
ThinkPHP模板输出display用法分析
2014/11/26 PHP
php延迟静态绑定实例分析
2015/02/08 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
codeigniter中view通过循环显示数组数据的方法
2015/03/20 PHP
CSS3画一个阴阳八卦图
2021/03/09 HTML / CSS
JS网络游戏-(模拟城市webgame)提供的一些例子下载
2007/10/14 Javascript
基于jquery实现的定时显示与隐藏div广告的实现代码
2013/08/22 Javascript
nodejs实现的一个简单聊天室功能分享
2014/12/06 NodeJs
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
jQuery实现向下滑出的平滑下拉菜单效果
2015/08/21 Javascript
JS实现带有抽屉效果的产品类网站多级导航菜单代码
2015/09/15 Javascript
js实现仿qq消息的弹出窗效果
2016/01/06 Javascript
EasyUI在表单提交之前进行验证的实例代码
2016/06/24 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
Node.js简单入门前传
2017/08/21 Javascript
详解HTML5 使用video标签实现选择摄像头功能
2017/10/25 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python中基本的日期时间处理的学习教程
2015/10/16 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
一款利用css3的鼠标经过动画显示详情特效的实例教程
2014/12/29 HTML / CSS
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
线程同步的方法
2016/11/23 面试题
新员工培训个人的自我评价
2013/10/09 职场文书
销售高级职员求职信
2013/10/29 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
2014卖家双十一活动策划书
2014/09/29 职场文书
求职自我推荐信
2015/03/24 职场文书
会计稽核岗位职责
2015/04/13 职场文书
应收账款管理制度
2015/08/06 职场文书
股东协议书范本2016
2016/03/21 职场文书
Docker下安装Oracle19c
2022/04/13 Servers
选购到合适的激光打印机
2022/04/21 数码科技
vue使用watch监听属性变化
2022/04/30 Vue.js