首頁  >  文章  >  後端開發  >  PHP實現微信網頁登陸授權開發

PHP實現微信網頁登陸授權開發

不言
不言原創
2018-04-19 15:26:4714668瀏覽

這篇文章主要介紹了關於PHP實現微信網頁登陸授權開發,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

微信開放平台和公眾平台的區別

1.公眾平檯面向的時普通的用戶,比如自媒體和媒體,企業官方微信公眾帳號運營人員使用,當然你所在的團隊或者公司有實力去開發一些內容,也可以呼叫公眾平台裡面的接口,例如自訂選單,自動回复,查詢功能。目前大多數微信通過認證之後,都在做這個事情。

mp.weixin.qq.com


2.開放平檯面向的開發者和第三方獨立軟體開發人員。我覺得開發平台最大的開放就是微信登入。當年騰訊沒有花大力氣去做統一登入這個事情,導致目前各個網站都要弄一套登入機制。還好他們現在認清了局勢。開發者或軟體開發商,透過微信開放提供的平台和接口,可以開發適合企業的電子商務網站,掃描二維碼進去一個遊戲介面,然後去購買商品等。當然後續開放平台要開放支付接口,那麼類似口袋通這種軟體開發廠商,就可以為大型,中小企業提供微信小店這種服務和軟體了。

open.weixin.qq.com

 

「大眾平台就是服務號碼訂閱號碼的管理開發後台。

開發平台說得通俗一點就是實現手機裡邊安裝軟體的內容一鍵分享朋友圈;

下面的第三方登陸就是依託於開放平台(open.weixin.qq.com )的功能

 

準備工作

網站應用微信登入是基於OAuth2.0協定標準建構的微信OAuth2.0授權登入系統。

在進行微信OAuth2.在進行微信OAuth2.0授權登入存取之前,在微信開放平台註冊開發者帳號,並擁有一個已審核通過的網站應用,並獲得相應的AppID和AppSecret,申請微信登入且通過審核後,可開始接取流程。

授權流程說明

微信OAuth2.0授權登入讓微信使用者使用微信身分安全登入第三方應用程式或網站,在微信使用者授權登入已接取微信OAuth2.0的第三方應用後,第三方可以獲取到用戶的介面調用憑證(access_token),透過access_token可以進行微信開放平台授權關係介面調用,從而實現獲取微信用戶基本開放資訊和幫助用戶實現基礎開放功能等。

微信OAuth2.0授權登入目前支援authorization_code模式,適用於擁有server端的應用程式授權。此模式整體流程為:

  1. 第三方發起微信授權登入要求,微信使用者允許授權第三方應用程式後,微信會拉起應用程式或重定向到第三方網站,並且帶上授權臨時票據code參數;

  2. 透過code參數加上AppID和AppSecret等,透過API換取access_token;

  3. 透過access_token進行介面調用,取得使用者基本資料資源或協助使用者實現基本操作。

取得access_token時序圖:


#第一步:請求CODE
##第三方使用網站應用程式授權登入前請注意已取得對應網頁授權作用域(scope=snsapi_login),則可以透過在PC端開啟以下連結:

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri= REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

若提示“該連結無法存取”,請檢查參數是否已填寫錯誤,如redirect_uri的網域與審核時填入的授權網域不一致或scope不為snsapi_login。

#appid是應用唯一識別redirect_uri#重定向位址,需要進行UrlEncode#response_type是

參數

說明

############################################################## ######填入code##################scope############是########## ##應用授權作用域,擁有多個作用域以逗號(,)分隔,網頁應用程式目前只填寫snsapi_login即可#################state#### #########否###

用於保持請求和回呼的狀態,授權請求後原樣帶回給第三方。此參數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上此參數,可設定為簡單的隨機數加session進行校驗

參數說明
回傳說明

使用者允許授權後,將會重新導向到redirect_uri的網址上,並且帶上code和state參數

redirect_uri?code=CODE&state=STATE

若使用者禁止授權,則重定向後不會帶上code參數,只會帶上state參數

redirect_uri?state =STATE

請求範例

登入一號店網站應用程式

https://passport.yhd.com/wechat/login.do

打開後,一號店會產生state參數,跳到
https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https://passport.yhd.com/wechat /callback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wconnidq,cq. _uri=https://passport .yhd.com/wechat/callback.do&response_type=code&scope=snsapi_login&state=eb407f95fbc413185209fd85931761c2#wechat_redirect

微信用戶使用微信掃描後碼表鍵登錄機碼且會登入編號://passport.yhd.com/wechat/callback.do?code=CODE&state=3d6be0a4035d839573b04816624a415e

 

。碼內嵌到自己頁面中,使用者使用微信掃碼授權後透過JS將code回傳給網站。

JS微信登入主要用途:網站希望使用者在網站內就能完成登錄,無需跳到微信網域下登入後再返回,提升微信登入的流暢度與成功率。網站內嵌二維碼微信登入JS實作方法:步驟1:在頁面中先介紹如下JS檔(支援https):

a41e9aa0571885bb940b7003c4385c9f2cacc6d41bbb37262a98f745aa00fbf0

步驟2:在需要使用微信登入的地方實例以下JS物件:
   varobj = new WxLogin({
                            id:"login_container", 
                            appid: "", 
                            scope: "", 
                            redirect_uri: "",
                            state: "",
                            style: "",
                            href: ""
                          });

參數是#第三方頁面顯示二維碼的容器id是應用唯一標識,在微信開放平台提交應用審核通過後獲得是應用授權作用域,擁有多個作用域以逗號(,)分隔,網頁應用程式目前只填入snsapi_login可是#重定向位址,需要進行UrlEncode##用於保持請求和回呼的狀態,授權請求後原樣帶回給第三方。此參數可用於防止csrf攻擊(跨站請求偽造攻擊),建議第三方帶上此參數,可設定為簡單的隨機數加session進行校驗否提供"black"、"white"可選,預設為黑色文字描述。詳見文件底部FAQ#否

說明

id

#appid

scope

redirect_uri

#state

style

href

########自定義樣式鏈接,第三方可根據實際需求覆蓋預設樣式。詳見文件底部FAQ################
參數說明
 
第二步:透過code取得access_token

透過code取得access_token

#https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

參數說明

##參數

是否必須

##說明

appid

#是

應用唯一標識,在微信開放平台提交應用審核通過後獲得

secret

##應用程式金鑰AppSecret,在微信開放平台提交應用程式審核通過後獲得

code

<br><br><br><br>##code<br>

##是 正確的回傳:"expires_in":7200, 
填入第一步所取得的code參數

#grant_type

填authorization_code

回傳說明

"access_token":"ACCESS_TOKEN", 
"refresh_token":"REFRESH_TOKEN",

"openid":"OPENID", 

"scope":"SCOPE","unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"}

#參數

##參數

參數

參數

#說明

#access_token

介面呼叫憑證

expires_in

#access_token介面呼叫憑證逾時時間,單位(秒)
用戶刷新access_tokenopenidscope使用者授權的作用域,使用逗號( ,)分隔 unionid#只有在使用者將公眾號綁定到微信開放平台帳號後,才會出現該欄位。 錯誤回傳範例:

#refresh_token

#授權使用者唯一標識

#######{"errcode":40029,"errmsg":"invalidcode"}### ######刷新access_token有效期######access_token是呼叫授權關係介面的呼叫憑證,由於access_token有效期(目前為2小時)較短,當access_token逾時後,可以使用refresh_token刷新,access_token刷新結果有兩種:######1. 若access_token已逾時,那麼進行refresh_token會取得一個新的access_token,新的超時時間;######2. 若access_token未逾時,那麼進行refresh_token不會改變access_token,但超時時間會刷新,相當於續期access_token。 ######refresh_token擁有較長的有效期限(30天),當refresh_token失效的後,需要使用者重新授權。 ######請求方法######取得第一步的code後,請求以下連結進行refresh_token:######https://api.weixin.qq.com/sns/oauth2/ refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN######參數說明#####################參數########### #######是否必須##################說明#####################appid ############是############應用唯一標識##################grant_type### #########是############填refresh_token##################refresh_token######## #####是############填入透過access_token取得到的refresh_token參數################
回傳說明

正確的回傳:

{ &lt;br&gt;"access_token":"ACCESS_TOKEN", &lt;br&gt;"expires_in":7200, &lt;br&gt;"refresh_token ":"REFRESH_TOKEN", &lt;br&gt;"openid":"OPENID", &lt;br&gt;"scope":"SCOPE" &lt;br&gt;}

#openid授權使用者唯一識別#scope

#參數

說明

access_token

介面呼叫憑證

#expires_in

access_token介面呼叫憑證逾時時間,單位(秒)

refresh_token

使用者刷新access_token

使用者授權的作用域,使用逗號(,)分隔
#錯誤傳回範例:

{" errcode":40030,"errmsg":"invalidrefresh_token"}

注意:

1、Appsecret是應用程式介面使用金鑰,洩漏後將可能導致應用程式資料外洩、應用的使用者資料外洩等高風險後果;儲存在客戶端,極有可能被惡意竊取(如反編譯取得Appsecret);2、access_token為使用者授權第三方應用程式發起介面呼叫的憑證(相當於使用者登入態),儲存在客戶端,可能出現惡意取得access_token 後導致的使用者資料外洩、使用者微信相關介面功能被惡意發起等行為;授權作用域(scope)snsapi_base#/sns/auth
3、refresh_token為使用者授權第三方應用的長效憑證,僅用於刷新access_token,但洩漏後相當於access_token 洩漏,風險同上。 

建議將secret、用戶資料(如access_token)放在App雲端伺服器,由雲端中轉介面呼叫請求。

 

第三個步驟:透過access_token呼叫介面

取得access_token後,進行介面調用,有以下前提:
# 1. access_token有效且未逾時;

2. 微信使用者已授權給第三方應用帳號對應介面作用域(scope)。

對於介面作用域(scope),能呼叫的介面有以下:

介面

#介面說明

/sns/oauth2/access_token

透過code換取access_token、refresh_token和授權scope

/sns/oauth2/refresh_token

刷新或續期access_token使用

######檢查access_token效度#################snsapi_userinfo## ##########/sns/userinfo############取得使用者個人資訊##############

其中snsapi_base屬於基礎接口,若應用程式已擁有其它scope權限,則預設擁有snsapi_base的權限。使用snsapi_base可以讓行動網頁授權繞過跳轉授權登入頁面請求使用者授權的動作,直接跳轉第三方網頁帶上授權臨時票據(code),但會讓使用者已授權作用域(scope)僅為snsapi_base ,從而導致無法取得到需要使用者授權才允許取得的資料和基礎功能。

F.A.Q
1.什麼是授權臨時票據(code)?

答:第三方透過code取得access_token的時候需要用到,code的逾時時間為10分鐘,一個code只能成功換取一次access_token即失效。 code的臨時性與一次保障了微信授權登入的安全性。第三方可透過使用https和state參數,進一步加強自身授權登入的安全性。

 2.什麼是授權作用域(scope)?

答:授權作用域(scope)代表使用者授權給第三方的介面權限,第三方應用程式需要向微信開放平台申請使用對應scope的權限後,使用文件所述方式讓使用者進行授權,經過使用者授權,取得到對應access_token後方可對介面進行呼叫。

3.網站內嵌二維碼微信登入JS程式碼中style欄位作用?

答案:第三方頁面顏色風格可能為淺色調或深色調,若第三方頁面為淺色背景,style欄位應提供"black"值(或不提供,black為預設值),則對應的微信登入文字樣式為黑色。相關效果如下: 

若提供"white"值,則對應的文字描述將顯示為白色,適合深色背景。相關效果如下:

 

4.網站內嵌二維碼微信登入JS程式碼中href欄位作用?

答案:如果第三方覺得微信團隊提供的預設樣式與自己的頁面樣式不匹配,可以自己提供樣式檔案來覆寫預設樣式。舉個例子,如第三方覺得預設二維碼過大,可以提供相關css樣式文件,並把連結位址填入href欄位

.impowerBox .qrcode {width:200px;}<br>.impowerBox .title {display: none;}<br>.impowerBox .info {width: 200px;}<br>.status_icon {display#:none}<br> .impowerBox .status {text-align: center;} 

相關效果如下:

 

取得使用者個人資訊(UnionID機制)
介面說明

此介面用於取得使用者個人資訊。開發者可透過OpenID來取得使用者基本資訊。特別要注意的是,如果開發者擁有多個行動應用程式、網站應用程式和公眾帳號,可透過取得使用者基本資訊中的unionid來區分使用者的唯一性,因為只要是同一個微信開放平台帳號下的行動應用、網站應用程式和公眾帳號,使用者的unionid是唯一的。換句話說,同一用戶,對同一個微信開放平台下的不同應用,unionid是相同的。

請求說明

http要求方式: GET

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

#參數說明

參數

是否必須

說明

#access_token

##是

呼叫憑證

#openid

###普通使用者的標識,對目前開發者帳號唯一###############
回傳說明

正確的Json回傳結果:

{ &lt;br&gt;"openid":"OPENID",<br>"nickname":"NICKNAME",<br>"sex":1,<br>"province":"PROVINCE",<br>"city":"CITY",<br>"country":"COUNTRY",<br>"headimgurl":"http ://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1 dZuTOgvLLrhJbERQQQ4eMsv84eavHAmv84emTOgv #"PRIVILEGE2"<br>],<br>"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"<br><br>}<br><br><br>

參數說明openidnickname sexprovince一般使用者個人資料填寫的省份city一般使用者個人資料填入的城市country國家,如中國為CNheadimgurl使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項目為空#privilege

#普通使用者的標識,對目前開發者帳號唯一

一般使用者暱稱

一般使用者性別,1為男性,2為女性

用戶特權訊息,json數組,如微信沃卡用戶為(chinaunicom)<br><br>

unionid
用戶統一識別。針對一個微信開放平台帳號下的應用,同一用戶的unionid是唯一的。 錯誤的Json回傳範例:呼叫頻率限制

#{ "errcode":40003,"errmsg":"invalid openid "

}

介面名稱

頻率限制

#透過code換取access_token

##1萬/分鐘

###刷新access_token#############5萬/分鐘############ #####取得使用者基本資訊############5萬/分鐘###############

代码示例:

第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

通过code参数加上AppID和AppSecret等,通过API换取access_token;

通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

Login.php如下:

/*
返回  code state*/
$appid = 'wxea1xxxxxxxx20cb62';
$url = "https://open.weixin.qq.com/connect/qrconnect?appid=$appid&redirect_uri=http://zhiliaoke.com.cn/weixin.php&response_type=code&scope=snsapi_login&state=1&connect_redirect=1#wechat_redirect";

header('location:'.$url);

验证处理如下:

<?php
$code = $_GET['code'];
$state = $_GET['state'];//换成自己的接口信息
$appid = 'XXXXX';
$appsecret = 'XXXXX';
if (empty($code)) $this->error('授权失败');
 <br>
$token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid='.$appid.'&secret='.$appsecret.'&code='.$code.'&grant_type=authorization_code';
$token = json_decode(file_get_contents($token_url));
if (isset($token->errcode)) {
    echo '4a249f0d628e2318394fd9b75b4636b1错误:473f0a7621bec819994bb5020d29372a'.$token->errcode;
    echo '076402276aae5dbec7f672f8f4e5cc81c1a436a314ed609750bd7c7d319db4da错误信息:2e9b454fa8428549ca2e64dfac4625cd'.$token->errmsg;
    exit;
}
 <br>
$access_token_url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid='.$appid.'&grant_type=refresh_token&refresh_token='.$token->refresh_token;//转成对象
$access_token = json_decode(file_get_contents($access_token_url));
if (isset($access_token->errcode)) {
    echo '4a249f0d628e2318394fd9b75b4636b1错误:473f0a7621bec819994bb5020d29372a'.$access_token->errcode;
    echo '076402276aae5dbec7f672f8f4e5cc81c1a436a314ed609750bd7c7d319db4da错误信息:2e9b454fa8428549ca2e64dfac4625cd'.$access_token->errmsg;
    exit;
}
 <br>
 <br>
$user_info_url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$access_token->access_token.'&openid='.$access_token->openid.'&lang=zh_CN';//转成对象
$user_info = json_decode(file_get_contents($user_info_url));
if (isset($user_info->errcode)) {
    echo '4a249f0d628e2318394fd9b75b4636b1错误:473f0a7621bec819994bb5020d29372a'.$user_info->errcode;
    echo '076402276aae5dbec7f672f8f4e5cc81c1a436a314ed609750bd7c7d319db4da错误信息:2e9b454fa8428549ca2e64dfac4625cd'.$user_info->errmsg;
    exit;
}
$rs =  json_decode(json_encode($user_info),true);//返回的json数组转换成array数组
//打印用户信息echo 'e03b848252eb9375d56be284e690e873';
 <br>
print_r($rs);echo 'bc5574f69a0cba105bc93bd3dc13c4ec';
 <br>
?>

 

微信第三方登录(静默授权和非静默授权)

用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

微信的授权登录在日常应用中应用的非常广泛,越来越多的平台支持用户使用微信进行授权第三方登录

 使用微信授权登录有哪些优势/好处;

 1、用户量足够大,基本所有用户都会有微信,登录起来比较方便快捷;

 2、微信作为一个开放平台,为众多公众号/服务开放了许多服务接口,让公众号能够为自己的用户提供更加个性、更加优质的产品服务;

open id 和 union id ,这两个id有什么区别;

1、openid:在关注者与公众号产生消息交互后,公众号可获得关注者的openid,同一个用户,在不同公众号或移动应用下对应有不同open id标识;

2、union id:同一个用户,在不同公众号或移动应用下unionID相同;前提是,如若需要做多个公众号以及移动应用账户互通,得到唯一身份标识union id,则需要将多个公众号或移动应用在微信开放平台进行绑定,然后我们才能给拿到unionid;

所以,如果某个应用或者服务,有联合登录甚至多个公众应用多账户互通,可以采用union id来进行账户体系的用户识别与合并;即微信平台可以通过union id 来进行基于多个公众号之间的账户体系互通与识别合并;

 微信联合登录是怎么登录的,有几种登录方式;微信联合登录和微信授权登录【授权登录(非静默授权)与静默授权】

微信联合登录;也就是我们常用的微信移动端/PC端之间的扫码登录,PC端用微信扫码登录,微信移动端确认授权登录后,应用可以从微信拿到用户的open id或union id,将微信获取的用户信息与自己账户体系中的用户身份进行关联;

授权登录:需要用户确认登录,这样可以通过用户的个人确认,获取用户全面的信息,无论是否关注相关微信公众号等都可以获取。

静默授权不需要用户确认,只需要用户访问某个网页,属于嵌套在普通网页里的授权形式,但是只能获取到用户的唯一标示openid和union id,无法拿到用户的微信头像、微信名称等个人信息,对于用户的简单认证还是很有用的。

如何通过微信账户体系来做多应用、多平台之间的账户互通体系;如果某个服务同时分布在多个公众号中,账户体系如何建立;如何做到用户身份唯一识别;

1)、同一用户不同公众号/应用下open id不同,同一用户不同公众号/应用下unionid相同;

2)、建立应用账户体系时,通过union来进行多应用/平台之间的用户账户体系识别与合并;

3)、多应用/平台建立账户体系时,需要做到唯一user id对应唯一union id;

某個服務,包括行動app端、PC網頁端、公用號碼端服務,那麼使用者使用微信授權登入的資料流轉流程是怎麼樣的;

1、用戶透過微信授權行動app服務;該應用服務即可透過介面取得使用者的union id,這個時候,如果在資料庫中沒有查到該id,則辨識為新用戶,直接建立一個user id,該唯一user id與union id 對應;

2、用戶透過微信掃碼PC端授權聯合登陸獲取PC端服務;該應用服務即可透過介面取得使用者的union id,這時候,在資料庫中查到有這個id,就會把pc登入這個帳號合併到之前建立的唯一user id帳號下;

3、使用者透過追蹤該服務公眾號,用微信授權登入公眾號服務;該應用程式服即可透過介面取得使用者的union id,這個時候,在資料庫中查到有這個id,就會把公眾號碼中登入的這個帳號合併到先前建立的唯一user id帳號下;

網頁授權的兩種scope的區別說明:

#1、授權登入以snsapi_base為scope發起的網頁授權,是用來取得進入頁面的用戶的openid的,並且是靜默授權並自動跳到回調頁的。使用者感知的就是直接進入了回呼頁(往往是商業頁面)特徵:使用者無感知;

2、靜默授權以snsapi_userinfo為scope發起的網頁授權,是用來獲取使用者的基本資訊的。但這種授權需要使用者手動同意,而且由於使用者同意過,所以無須關注,就可在授權後取得該使用者的基本資訊。

特殊場景下靜默授權:

#對於已關注公眾號的用戶,如果用戶從公眾號的會話或自訂選單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,使用者無感知。

網頁授權流程:

#1、引導使用者進入授權頁面同意授權,取得code 

確保微信公眾帳號擁有授權作用域(scope參數)的權限的前提下引導使用者去授權頁面

參考鏈接:

scope為snsapi_base

注意:appid,redirect_uri,state這些要和後台協商好

https://open.weixin.qq.com/connect/oauth2 /authorize?appid=" wx_appid "&redirect_uri=" api.wx_reg "&response_type=code&scope=snsapi_login,snsapi_userinfo&state=1,0#wechat_redirect

##scope為sns#_info https://open.weixin.qq.com/connect/oauth2/authorize?appid=" wx_appid "&redirect_uri=" api.wx_reg "&response_type=code&scope=snsapi_base,snsapi_userinfo&state=1,0#wechat_redpe=snsapi_base,snsapi_userinfo&state=1,0#wechat_redirect

chat_redirect


#使用者同意授權後


如果使用者同意授權,頁面將會跳到redirect_uri/?code=CODE&state=STATE。

2

、透過code換取網頁授權access_token(後台操作) 頁面跳回跳的url上redirect_uri /?code=CODE&state=STATE。 code透過code換取的是網頁授權access_token,如果網頁授權的作用域為snsapi_base,則本步驟中取得到網頁授權access_token的同時,也取得到了openid,snsapi_base式的網頁授權流程即到此為止。

3:需要個人資訊。後台透過code得到值之後回傳到前端去操作

相關推薦:

#php實作微信模板訊息推送

## 

以上是PHP實現微信網頁登陸授權開發的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn