1. 程式人生 > >yershop商城系統Thinkphp開發(四)——微信篇1:微信公眾號靜默授權註冊及獲取使用者資訊

yershop商城系統Thinkphp開發(四)——微信篇1:微信公眾號靜默授權註冊及獲取使用者資訊

微信登陸包括兩部分:1.常用的靜默授權;2.獲取使用者身份資訊
開發環境:
Thinkphp3.2.3beta+onethink、yershop
新浪SAE伺服器,點此註冊
認證微信服務號

靜默授權

基礎配置

1.認證微信服務號
2.介面許可權:網頁賬號,填寫自己要使用的域名(www.abc.com這樣的)
這裡寫圖片描述
這裡寫圖片描述
3.伺服器後臺新增配置欄位:C(‘DOMAIN’) C(‘APPID’) C(‘AppSecret’),在程式碼中呼叫
C(‘DOMAIN’),在yershop後臺中為自動獲取的域名地址
C(‘APPID’),公眾平臺應用ID
C(‘AppSecret’),公眾平臺金鑰

獲取code核心程式碼

//獲取code程式碼
function createOauthUrlForCode($redirectUrl)
    {
        //lifan 
        $param ['appid'] =C('APPID');
        $param ['redirect_uri'] = $redirectUrl. '&getOpenId=1';
        $param ['response_type'] = 'code';
        $param ['scope'] = 'snsapi_base';
        $param ['state'
] = 123; $url = 'https://open.weixin.qq.com/connect/oauth2/authorize?' . http_build_query ( $param ) . '#wechat_redirect'; return $url; }

獲取openid核心程式碼

function getOpenid()
    {
        $urlObj["appid"] = C('APPID');
        $urlObj["secret"] = C('AppSecret');
        $urlObj["code"
] = I ( 'code' ); $urlObj["grant_type"] = "authorization_code"; $url = 'https://api.weixin.qq.com/sns/oauth2/access_token?' . http_build_query ( $urlObj ); //初始化curl $ch = curl_init(); //設定超時 curl_setopt($ch, CURLOP_TIMEOUT, 60); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); //執行curl,結果以jason形式返回 $res = curl_exec($ch); curl_close($ch); //取出openid $data = json_decode($res,true); return $data['openid']; }

獲取使用者資訊

獲取並儲存基礎access_token

/**
 * 獲取基礎 accesstoken
 * 7200秒過時
 * sae不可寫,保存於資料庫中
 * at表字段:id,accesstoken,lasttime
 */
function getAccesstoken(){
    $param['grant_type'] = 'client_credential';
    $param['appid'] = C("APPID");
    $param['secret'] = C("SECRET");
    $lastAT = M('at')->find(1);
    $accesstoken = $lastAT['accesstoken'];
    if(!$lastAT){
        M('at') -> add(array('id'=>1,'accesstoken'=>'null','lasttime'=>0));
        $lastAT['lasttime'] = 0;
    }
    $now = NOW_TIME;
    $timecha = $now - $lastAT['lasttime'];
    if($timecha > 7200){
        $url = 'https://api.weixin.qq.com/cgi-bin/token?' . http_build_query ( $param );
        $content = file_get_contents ( $url );
        $content = json_decode ( $content, true );
        $data['accesstoken'] = $content['access_token'];
        $data['lasttime'] = NOW_TIME;
        M('at')->where(array('id'=>1))->save($data);
        $accesstoken = $content['access_token'];
    }
    return $accesstoken;
}

獲取使用者資訊

/**
 * 獲取使用者基本資訊
 * openid:使用者的openid。使用者與公眾號唯一身份標識
 * 若使用者未關注公眾號,無法獲取詳細資訊
 */
function getWeixinInfo($openid) {
    $isWeixinBrowser = isWeixinBrowser ();
    if(!$isWeixinBrowser){
        return;
    }
    $param['access_token'] = getAccesstoken();
    $param['openid'] = $openid;
    $param['lang'] = 'zh_CN';
    $url = 'https://api.weixin.qq.com/cgi-bin/user/info?' . http_build_query ( $param );
    $content = file_get_contents ( $url );
    $content = json_decode ( $content, true );
    return $content;
}

其它函式

// 判斷是否是在微信瀏覽器裡
function isWeixinBrowser() {
    $agent = $_SERVER ['HTTP_USER_AGENT'];
    if (! strpos ( $agent, "icroMessenger" )) {
        return false;
    }
    return true;
}
/**
 * ? or &
 * @param 原始地址 $urls
 * @param 新增引數 $parm
 * @param 引數值 $value
 * @return 帶? 或 & 的引數
 */
function addurl($urls,$parm,$value=""){
    if(!strstr($urls, '?')){
        $adds = "?".$parm."=".$value;
    }else{
        $adds = "&".$parm."=".$value;
    }
    return $adds;
}

完整的微信登陸註冊流程實現

功能均實現在一個方法裡,請仔細按照序號檢視流程

public function weilogin($url = '') {
/*(1)非微信瀏覽器,退回到普通登陸頁*/
        if(!isWeixinBrowser()){
            redirect ( U ( '/wap/user/login' ) );
        }
        $openid = I('get.openid');
        $Member = D ( "Member" );
/*(2)判斷是否已經獲取到了openid,否第(3)步*/
        if ($openid) {
/*(6)獲取到了openid,判斷member表是否存入使用者的openid。存:非第一次註冊登陸;沒存:第一次註冊登陸*/
            $weiuserinfo = M('member')->where (array('openid' => $openid))->find ();
/*(7)有使用者資訊:非第一次註冊登陸*/
            if ($weiuserinfo) {
                if ($Member->login ( $weiuserinfo ['uid'] )) { // 登入使用者
                  //在登陸前的頁面,設定cookie('api_redirect',U('Index.index'))資訊
                  $urls = cookie ( 'api_redirect' );
                  //登入成功,跳轉返回
                  redirect($urls);
                }else {
                    //登入異常,回到普通登陸頁面
                    $this->error ( '登入超時!', U ( "/wap/user/login" ) );
                }
            } else {
/*(8)沒有存入使用者openid:第一次註冊登陸*/
                /*根據openid獲取微信使用者資訊*/
                $weiData = getWeixinInfo($openid);
                if (!empty($weiData['nickname'])){
                    //設定使用者名稱為使用者微信暱稱
                    $username=$weiData['nickname'];
                }else{
                    /*當用戶未關注無法拉取使用者資訊時,為使用者起名為當前時間戳。也可以提示使用者關注公眾號,否則就普通登陸*/
                    $username=NOW_TIME;
                }
                //進行重名檢測,使用者暱稱若重名,之後資料表也無法新增使用者資訊
                $ischong = M('ucenter_member')->where(array('username'=>$username))->find();
                if($ischong>0){
                    //發現有重複使用者名稱,命名為暱稱+時間戳,避免重名
                    $username = $username.NOW_TIME;
                }
                /* 呼叫註冊介面註冊使用者 */
                $User = new UserApi ();
                // 返回ucentermember資料表使用者主鍵id;設定預設密碼:123456
                $uid = $User->register ( $username, '123456' );
                if (0 < $uid) { // UC登入成功
                    /* 登入使用者;D('Member')->login此操作實現向member表新增記錄*/
                    if ($Member->login ( $uid, $_GET ['openid'] )) {
/*(9)登陸成功,回到設定的頁面*/
                        redirect(cookie ( 'api_redirect' ));
                    }
                } else {
                    //ucenter_member表註冊失敗,跳轉到普通登陸頁
                    $this->error ( '登入超時!', U ( "/wap/user/login" ) );
                }
            }
        } else {
/*(3)實現微信登陸獲取openid*/
            if (! is_login ()) {
            $getopenId = I('get.getOpenId');
            $state = I('get.state');
            //此處組連結一定要細心,否則報redirect_uri錯誤資訊。不要用手寫的url
            $urls = C ( 'DOMAIN' ) . U ( "/Wap/User/weilogin" );
/*(4)實現微信登陸第一步獲取code,返回的連結引數含有$getopenId、$state資訊*/
            if (!$getopenId){
                $url = substr ( $urls, 0, - 5 );//該操作將去掉.html
                // var_dump($url); //必要時檢驗
                $urlforcode = createOauthUrlForCode($url);
                redirect($urlforcode);
                }elseif($state){
/*(5)實現微信登陸第二步獲取openid,返回openid;重新訪問本函式,帶上openid*/
                 $openid = getOpenId();    
                 redirect ( $urls . addurl($callback, "openid",$openid));        
                }
            }
        }
    }

至此,微信登陸篇完成。
出處:blog.csdn.net/afanxingzhou
Q724122005
專案示例:www.kateqi.cn
承接中小型專案開發

相關推薦

yershop商城系統Thinkphp開發——1公眾靜默授權註冊獲取使用者資訊

微信登陸包括兩部分:1.常用的靜默授權;2.獲取使用者身份資訊 開發環境: Thinkphp3.2.3beta+onethink、yershop 新浪SAE伺服器,點此註冊 認證微信服務號 靜默授權 基礎配置 1.認證微信服務號 2.介面許可

Android系統應用開發系統語言以及新增字型庫

1.如何向android的setting語言列表中新增一門語言 第一種:修改配置檔案 位置:build/target/product/languages_full.mk| languages_small.mk,這兩個檔案裡頭,有PRODUCT_LOCALES := en_U

Qt移動應用開發應用粒子特效

ons -i 遊戲 direct mit class png pop 狀態 Qt移動應用開發(四):應用粒子特效 上一篇文章介紹了Qt Quick是如何對幀動畫進行支持的。幀動畫的實現離不開狀態機、而狀態機、動畫和狀態切換(transition

Unity3D之Mecanim動畫系統學習筆記Animation State

大致 面板 輸入 jpg any 動畫播放 速度 nsf 顯示 動畫的設置 我們先看看Animation Clip的一些設置: Loop time:動畫是否循環播放。 下面出現了3個大致一樣的選項: Root Transform Rotation:表示為播放動畫

corethink功能模塊探索開發讓這個模塊跑起來

src 後臺菜單 evel pst 新建 mod depend htm news 讓這個模塊跑起來,太費勁了,多半原因是自己太粗心,opencmf.php中“uid”寫成了“pid”,de了好幾天的bug也沒有搞出來,又加上最近發生了些事(brokenhearted)。。。

Linux系統管理初步Linux系統的防火墻-netfilter 編輯中

security 計數器 save ade 接收 emctl fec 運維 需要 一、Linux的防火墻 防火墻是日常應用中一個重要的維護內容,從防火墻開始我們才真正接觸生產環境,網絡安全越來越受重視,學好這部分內容是學好運維的重要一步。 一般情況下,桌面級環境中很少有人關

星雲鏈智能合約開發在星雲鏈上發送交易

星雲鏈智能合約開發 在星雲鏈上發送交易 準備賬戶 在星雲鏈上,每個地址表示一個唯一的賬戶,一一對應。 在發送交易前,我們需要準備兩個賬戶:一個賬戶用來發送代幣 (稱為"from") 和另一個賬戶來接受代幣 (稱為"to"). 發送者賬戶 在這裏,我們將會使用配置

Go語言開發、Go語言面向對象

name value code 對象 struct int() 初始 每一個 method Go語言開發(四)、Go語言面向對象 一、結構體和方法 1、結構體的定義 在結構體中可以為不同項定義不同的數據類型。結構體是由一系列具有相同類型或不同類型的數據構成的數據集合。結構體

PHP全棧開發: HTML 學習2. div 布局

樣式 nbsp oat clas 控制 color 兩個 如果 排列 無序列表,有序列表,自定義列表 無序列表是ul表示,每個元素用li表示 有序列表是ol表示,每個元素用li表示 <ul> <li>首頁</li>&

商城項目開發

郵件 搭建 激活 一個 let 工具 技術 二次 環境 一、功能的演示   1.用戶模塊     用戶註冊功能     發送郵件     激活用戶     表單的校驗     用戶的登錄功能     自動登錄     用戶的註銷功能   2.商品模塊

從零開始學習比特幣開發--網路初始化,載入區塊鏈和錢包,匯入區塊啟動節點

寫在前面: 本篇文章接續 從零開始學習區塊鏈技術(三)-接入比特幣網路的關鍵步驟解析、建立比特幣錢包,以及重要rpc指令 從零開始學習區塊鏈技術(二)–如何接入比特幣網路以及其原理分析 以及從零開始學習區塊鏈技術(一)–從原始碼編譯比特幣 如果這篇文章看不明白,請務必先閱讀之前的文章

瀏覽器外掛之ActiveX開發----web頁面呼叫ActiveX

轉自:http://www.cnblogs.com/qguohog/archive/2013/01/25/2876828.html https://blog.csdn.net/zengraoli/article/details/12078757?utm_source=blogxgwz3 &n

Dojo開發

Dojo中的事件 使用dojo.connect函式,可以繫結相應事件到DOM元素上。 如下示例:給一個div元素新增點選事件,當點選的時候彈出文字內容。 <body> <div id="message">點選事件的繫結</div> <

ZigBee協議棧開發

1、要對ZigBee無線區域網有清晰的認識,明白ZigBee網路的組建過程中,網路工作時ZigBee無線模組在空氣中資料交換過程中進行了什麼工作。 2、ZigBee無線區域網中,節點按照在網路裡的功能劃分為協調器,路由器,終端。他們的硬體可以完全一樣,之所以在網路中表現不同的功能,是因為下載了不同

C#公眾開發 -- 獲取API呼叫所需的全域性唯一票據access_token

access_token是公眾號的全域性唯一票據,公眾號呼叫各介面時都需使用access_token。開發者需要進行妥善儲存。access_token的儲存至少要保留512個字元空間。access_token的有效期目前為2個小時,需定時重新整理,重複獲取將導致上次獲取的access_token失效。 獲取

充值系列——充值系統安全問題

這是充值系列的最後一篇,將討論充值安全的問題。正如這個系列的其他文章提到的,充值系統的流程如下: 注意: 4,5執行順序不確定,步驟4是支付平臺自動向伺服器請求,步驟5是玩家點選“返回商家網站”時支付平臺請求伺服器,如果玩家不點選,這可能不會觸發,所以這是一個不可靠的請求。 支付的

系統學習NLP--資料平滑

轉子:https://blog.csdn.net/fuermolei/article/details/81353746 在自然語言處理中,經常要計算單詞序列(句子)出現的概率估計。但是,演算法訓練的時候,預料庫中不可能包含所有可能出現的序列,因此為了防止對訓練樣本中為出現的新序列概率估計值為零,

HyperLeger Fabric開發——HyperLeger Fabric共識機制

HyperLeger Fabric開發(四)——HyperLeger Fabric共識機制 一、Fabric共識過程 1、Fabric共識過程 Fabric區塊鏈的網路節點本質上是互相複製的狀態機,節點之間需要保持相同的賬本狀態。為了實現分散式節點的一致性,各個節點需要通過共識過程,對賬本狀態的變化達成

即時通訊音視訊開發視訊編解碼之預測技術介紹

前言 即時通訊應用中的實時音視訊技術,幾乎是IM開發中的最後一道高牆。原因在於:實時音視訊技術 = 音視訊處理技術 + 網路傳輸技術 的橫向技術應用集合體,而公共網際網路不是為了實時通訊設計的。 系列文章 《即時通訊音視訊開發(二):視訊編解碼之數字視訊介紹》 《即時通訊音

Cocos Creator 系統學習筆記--座標系統

座標系統: cc.Class({ extends: cc.Component, properties: { }, //座標系統 //cc.Vec2是一個建構函式,可以使用new來建立 /* * 1: cc.Vec2