比较完整的微信开发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 相关文章推荐
附件名前加网站名
Mar 23 PHP
PHP 模拟$_PUT实现代码
Mar 15 PHP
一个简单php扩展介绍与开发教程
Aug 19 PHP
php+js实现图片的上传、裁剪、预览、提交示例
Aug 27 PHP
PHP移动文件指针ftell()、fseek()、rewind()函数总结
Nov 18 PHP
PHP模板引擎smarty详细介绍
May 26 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
Jun 23 PHP
php多线程实现方法及用法实例详解
Oct 26 PHP
php添加数据到xml文件的简单例子
Sep 08 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
Apr 23 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
PHP中for循环语句的几种变型
2006/11/26 PHP
php面向对象全攻略 (一) 面向对象基础知识
2009/09/30 PHP
mac下安装nginx和php
2013/11/04 PHP
php实现高效获取图片尺寸的方法
2014/12/12 PHP
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
关于hashchangebroker和statehashable的补充文档
2011/08/08 Javascript
jQuery使用数组编写图片无缝向左滚动
2012/12/11 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
解读JavaScript中 For, While与递归的用法
2013/05/07 Javascript
教你如何使用PHP输出中文JSON字符串
2014/05/22 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
使用jQuery调用XML实现无刷新即时聊天
2016/08/07 Javascript
BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
2016/12/01 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
ie下js不执行的几种可能
2017/02/28 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
JS仿淘宝搜索框用户输入事件的实现
2017/06/19 Javascript
vue 请求后台数据的实例代码
2017/06/22 Javascript
JavaScript读写二进制数据的方法详解
2018/09/09 Javascript
微信小程序wx:for循环的实例详解
2018/10/07 Javascript
JavaScript实现像雪花一样的Hexaflake分形
2020/07/07 Javascript
[09:13]2014DOTA2国际邀请赛 中国区预选赛coser表演
2014/05/23 DOTA
python封装对象实现时间效果
2020/04/23 Python
python使用mailbox打印电子邮件的方法
2015/04/30 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
HTML5中图片之间的缝隙完美解决方法
2017/07/07 HTML / CSS
英国最大的LED专业零售商:Led Hut
2018/03/16 全球购物
英国办公家具网站:Furniture At Work
2019/10/07 全球购物
一些关于MySql加速和优化的面试题
2014/01/30 面试题
学校实习推荐信
2015/03/27 职场文书
地心历险记观后感
2015/06/15 职场文书
Html5调用企业微信的实现
2021/04/16 HTML / CSS
python b站视频下载的五种版本
2021/05/27 Python
SpringBoot快速入门详解
2021/07/21 Java/Android