比较完整的微信开发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 相关文章推荐
php 从数据库提取二进制图片的处理代码
Sep 09 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
Aug 08 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
Jul 08 PHP
php检查是否是ajax请求的方法
Apr 16 PHP
php判断访问IP的方法
Jun 19 PHP
Zend Framework框架实现类似Google搜索分页效果
Nov 25 PHP
详解PHP安装mysql.so扩展的方法
Dec 31 PHP
php base64 编码与解码实例代码
Mar 21 PHP
PHP实现阿里大鱼短信验证的实例代码
Jul 10 PHP
PHP封装的非对称加密RSA算法示例
May 28 PHP
PHP时间函数使用详解
Mar 21 PHP
php双向队列实例讲解
Nov 17 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
简单的过滤字符串中的HTML标记
2006/12/25 PHP
php中批量删除Mysql中相同前缀的数据表的代码
2011/07/01 PHP
PHP中$_SERVER的详细参数与说明介绍
2013/10/26 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
javascript 计算两个整数的百分比值
2009/12/26 Javascript
JavaScript Distilled 基础知识与函数
2010/04/07 Javascript
javascript 循环读取JSON数据的代码
2010/07/17 Javascript
编写可维护面向对象的JavaScript代码[翻译]
2011/02/12 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
JavaScript 事件对象介绍
2015/04/13 Javascript
jfinal与bootstrap的登录跳转实战演习
2015/09/22 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
Javascript实现倒计时时差效果
2017/05/18 Javascript
JS实现的杨辉三角【帕斯卡三角形】算法示例
2019/02/26 Javascript
JQuery发送ajax请求时中文乱码问题解决
2019/11/14 jQuery
prettier自动格式化去换行的实现代码
2020/08/25 Javascript
详解微信小程序动画Animation执行过程
2020/09/23 Javascript
jdk1.8+vue elementui实现多级菜单功能
2020/09/24 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python实现一个Git日志统计分析的小工具
2017/12/14 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
2018/04/28 Python
python判断列表的连续数字范围并分块的方法
2018/11/16 Python
解决TensorFlow GPU版出现OOM错误的问题
2020/02/03 Python
Python-opencv实现红绿两色识别操作
2020/06/04 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
《油菜花开了》教学反思
2014/02/22 职场文书
聚美优品励志广告词
2014/03/14 职场文书
迎新生欢迎词
2015/01/23 职场文书
同学聚会感言一句话
2015/07/30 职场文书
教务处干事工作总结
2015/08/14 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
Win10此设备不支持接收Miracast无法投影的解决方法
2022/07/07 数码科技