热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信开发代码-PHP源码

微信开发代码
php代码

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 = "
                            
                            
                            %s
                            
                            
                                
                            
                        ";
            return sprintf($replyXml,$obj->FromUserName,$obj->ToUserName,time(),$mediaId);
                     
        }
 
        //回复文本消息
        public function replyText($obj,$content)
        {
            $replyXml = "
                            
                            
                            %s
                            
                            
                        ";
            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 = "
                             
                            
                            
                            
                        ";
            foreach($newsArr as $item)
            {
                $itemStr .= sprintf($itemXml,$item['Title'],$item['Description'],$item['PicUrl'],$item['Url']);
            }
            $replyXml = "
                            
                            
                            %s
                            
                            ".count($newsArr)."
                            ".$itemStr."
                        ";  
            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);
        }
    }
?>

推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 使用nodejs爬取b站番剧数据,计算最佳追番推荐
    本文介绍了如何使用nodejs爬取b站番剧数据,并通过计算得出最佳追番推荐。通过调用相关接口获取番剧数据和评分数据,以及使用相应的算法进行计算。该方法可以帮助用户找到适合自己的番剧进行观看。 ... [详细]
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 企业数据应用挑战及元数据管理的重要性
    本文主要介绍了企业在日常经营管理过程中面临的数据应用挑战,包括数据找不到、数据读不懂、数据不可信等问题。针对这些挑战,通过元数据管理可以实现数据的可见、可懂、可用,帮助业务快速获取所需数据。文章提出了“灵魂”三问——元数据是什么、有什么用、又该怎么管,强调了元数据管理在企业数据治理中的基础和前提作用。 ... [详细]
author-avatar
dibaoejx
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有