Welcome

首页 / 网页编程 / PHP / 比较完整的微信开发php代码

本文实例为大家分享了微信开发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;//图片消息媒体idreturn $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、关闭curlcurl_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;} //初始化memcacheprivate function _memcache_init(){$mmc = new Memcache;$ret = $mmc -> connect();if ($ret == false) {return;} return $mmc;} //设置memcacheprivate function _memcache_set($key,$value,$time=0){$mmc = $this->_memcache_init();$mmc -> set($key,$value,0,$time);} //获取memcahceprivate 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);}}?>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。