1.登錄的html頁面代碼php
<a href="weixin.redirect_uri">微信登錄</a>
2.跳轉到的控制器方法代碼html
CJUL是常量,就是你在開放平臺上註冊的重定向網址sql
跳換到後重定向到的地址是微信的一個重定向地址數據庫
帶了你在開放平臺上註冊的網址redirect_uri和appid 而且scope爲snsapi_loginapi
參數 | 是否必須 | 說明 |
---|---|---|
appid | 是 | 應用惟一標識 |
redirect_uri | 是 | 重定向地址,須要進行UrlEncode |
response_type | 是 | 填code |
scope | 是 | 應用受權做用域,擁有多個做用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login便可 |
state | 否 | 用於保持請求和回調的狀態,受權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗 |
class PhoneController extends CommonController{ //加載首頁 public function Index(){ //經過受權跳轉網頁進入 if(isset($_GET['code'])){ $code = $_GET['code']; //經過code換取網頁受權access_token $access_token = $this->get_code_access_token($code); //檢驗受權憑證(access_token)是否有效 $data = $this->checkAvail($access_token['access_token'],$access_token['openid']); if($data['errcode'] != '0' || $data['error_msg'] != 'ok'){ //刷新access_token $access_token = $this->refresh_access_token($access_token['refresh_token']); } //獲得拉取用戶信息(需scope爲 snsapi_userinfo) $userinfo = $this->get_user_info($access_token['access_token'],$access_token['openid']); require 'view/index.html'; }elseif(isset($_GET['page'])){ //網頁端入口 require 'view/index.html'; }else{ echo "NO CODE"; } } //跳轉到微信的認證頁 public function redirect_uri(){ $url = $this->get_authorize_url(CJURL,'1'); header('location:'.$url); } }
3.調用的底層代碼數組
<?php class CommonController{ //http get public function httpRequest($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); if($output == false){ return 'curl error:'.curl_error($ch); } curl_close($ch); return $output; } //curl獲取參數 //https 中的 get 和 post public function https_request($url,$data=null){ $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,false); //不爲空,使用post傳參數,不然使用get if($data){ curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$data); } curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); $output = curl_exec($curl); curl_close($curl); return $output; } //獲取接口票據access_token public function get_token(){ $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET; $json = $this->https_request($url); $arr = json_decode($json,true); return $arr['access_token']; } /*獲取受權後重定向的回調連接地址,請使用urlencode對連接進行處理 * @param string $redirect_uri * @param string $state **/ public function get_authorize_url($redirect_uri = '', $state = ''){ $redirect_uri = urlencode($redirect_uri); return "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".APPID."&redirect_uri={$redirect_uri}&response_type=code&scope=snsapi_base&state={$state}#wechat_redirect"; } /** *加載網頁受權經過code獲取access_token * * @param string $code **/ public function get_code_access_token($code){ //第一步:用戶贊成受權,獲取code // 第二步:經過code換取網頁受權access_token,與接口票據不同 $access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".APPID."&secret=".APPSECRET."&code={$code}&grant_type=authorization_code"; $access_token = $this->https_request($access_token_url); $arr = json_decode($access_token,true); return $arr; } /** * 刷新access_token(若是須要) * **/ public function refresh_access_token($refresh_token){ //三步:刷新access_token(若是須要) $refresh_url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=".APPID."&grant_type=refresh_token&refresh_token={$refresh_token}"; $access_token = $this->https_request($refresh_url); return json_decode($access_token,true); } /** * 獲取受權後的微信用戶信息 * * @param string $access_token * @param string $open_id **/ public function get_user_info($access_token = '', $open_id = ''){ // 第四步:拉取用戶信息(需scope爲 snsapi_userinfo) if($access_token && $open_id){ $info_url = "https://api.weixin.qq.com/sns/userinfo?access_token={$access_token}&openid={$open_id}&lang=zh_CN"; $info_data = $this->https_request($info_url); return json_decode($info_data, TRUE); } return FALSE; } /** *檢驗受權憑證(access_token)是否有效 * @param string $access_token * @param string $open_id **/ public function checkAvail($access_token='',$openid=''){ if($access_token && $open_id){ $avail_url = "https://api.weixin.qq.com/sns/auth?access_token={$access_token}&openid={$openid}"; $avail_data = $this->https_request($avail_url); return json_decode($avail_data, TRUE); } return FALSE; } //獲取自定義菜單建立接口 public function setcustomMenu(){ $access_token = $this->get_token(); $menuurl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token={$access_token}"; $jsonmenu = '{ "button":[ { "type":"view", "name":"抽獎", "url":"http://akira.weixin-sandbox.ciicgat.com/index.php?c=Phone&a=Index&page=Page" }, { "type":"click", "name":"贊一下", "key":"點贊" }, { "name":"上網", "sub_button":[ { "type":"view", "name":"搜搜", "url":"http://www.soso.com/" }, { "type":"view", "name":"騰訊", "url":"http://v.qq.com/" }, { "type":"view", "name":"百度", "url":"http://www.baidu.com/" }] }] }'; //在直接訪問接口的時候已經改變了微站上面的信息 $result = $this->https_request($menuurl,$jsonmenu); var_dump($result); } /** *openid *用戶說的內容 *獲取和你聊天的用戶的基本信息造成列表 **/ public function getUserInfo($openid,$text){ $access_token = $this->get_token(); //http請求方式:GET $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token={$access_token}&openid={$openid}&lang=zh_CN"; //請求獲取用戶信息的接口,返回這個openid對應的用戶信息,json格式 $jsoninfo = $this->httpRequest($url); //將json轉爲php數組 $user = json_decode($jsoninfo,true); $this->insertuser($user); $this->insertmessage($openid,$text,0,'text'); } /* *將用戶的數據寫入數據庫 */ public function insertuser($arr){ $user = new Model('user'); $user->ctime = $arr['subscribe_time']; $user->add($arr); } /** *第一個參數: $openid 用戶的編號 *第二個參數: $text 用戶消息和公衆號數據標記 1 表示公衆號 0 表示用戶消息 **/ public function insertmessage($openid,$text,$who,$mtype="text"){ $message = new Model('message'); $message->openid = $openid; $message->mess = $text; $message->who = $who; $message->utime = time(); $message->mtype = $mtype; $message->add(); $sql = "upadte user set utime=".time()." where openid = '{$openid}'"; $user = new Model('user'); $user->query($sql); } //獲取帶參數的二維碼的過程包括兩步,首先建立二維碼ticket,而後憑藉ticket到指定URL換取二維碼 /** *微信獲取二維碼ticket *@param string $type *@param string $time **/ public function getTicket($type="temporary",$time="604800"){ /* http請求方式: POST URL: https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN POST數據格式:json 臨時二維碼請求說明 POST數據例子:{"expire_seconds": 604800, "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}} 永久二維碼請求說明 POST數據例子:{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}} 或者也可使用如下POST數據建立字符串形式的二維碼參數: {"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": "123"}}} */ if((int)($time) > 604800){ $time = 604800; } //獲取token $token = $this->get_token(); //臨時 $temporary_qrcode = '{"expire_seconds": '.$time.', "action_name": "QR_SCENE", "action_info": {"scene": {"scene_id": 123}}}'; //永久 $permanent_qrcode = '{"action_name": "QR_LIMIT_SCENE", "action_info": {"scene": {"scene_id": 123}}}'; //永久字符串 $permanent_str_qrcode = '{"action_name": "QR_LIMIT_STR_SCENE", "action_info": {"scene": {"scene_str": 123}}}'; //獲取類型斷定 $code = $type.'_qrcode'; $qrcode = $$code; //請求ticket $ticket_url = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={$token}"; $ticket = $this->https_request($ticket_url,$qrcode); return $ticket; } /** *憑藉ticket到指定URL換取二維碼 **/ public function getQrcode(){ //本接口無須登陸態便可調用 TICKET進行UrlEncode // HTTP GET請求(請使用https協議) // https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET $ticket = json_decode($this->getTicket(),true); $qrcode_url = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=".urlencode($ticket['ticket']); echo $qrcode_url; $qrcode = $this->https_request($qrcode_url); // header(""); } /* * 微信不接收\u***格式的json內容須要對json字符串處理 * 僅支持發送text消息,其餘類型消息本身添加代碼 * @param string msgtype * @param array * @return string */ function my_json_encode($type, $p){ if (PHP_VERSION >= '5.4'){ $str = json_encode($p, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE); } else{ switch ($type){ case 'text': isset($p['text']['content']) && ($p['text']['content'] = urlencode($p['text']['content'])); break; } $str = urldecode(json_encode($p)); } return $str; } //中文分詞函數,只要傳一句話,就能夠分詞出來 public function fci($text){ $text = iconv('UTF-8','GBK//IGNORE',$text); $text = urlencode($text); $result = file_get_contents("http://akira.weixin-sandbox.ciicgat.com/index.php?w=".$text); $result = iconv("GBK","UTF-8//IGNORE",$result); return explode(" ",$result); } } ?>