php實(shí)現(xiàn)paypal 授權(quán)登錄
php實(shí)現(xiàn)paypal 授權(quán)登錄
<?php
/**
* @project paypal login
* @author jiangjianhe
* @date 2015-04-03
*/
class paypallogin
{
//沙箱token鏈接
private $_sanbox_oauth2_auth_uri = 'https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize';
private $_live_oauth2_auth_uri = 'https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/authorize';
private $_acquire_user_profile_sandbox_url = 'https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/userinfo?schema=openid&access_token=';
private $_acquire_user_profile_live_url = 'https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/userinfo?schema=openid&access_token=';
//沙箱token鏈接
private $_token_service_sandbox_url = 'https://www.sandbox.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice';
private $_token_service_live_url = 'https://www.paypal.com/webapps/auth/protocol/openidconnect/v1/tokenservice';
private $_sanbox_flag = true;
private $_client_id = null;
private $_client_secret = null;
private $_redirect_uri = null;
private $_state = '';
private $_scope = 'openid email phone profile address https://uri.paypal.com/services/paypalattributes'; //scope 參數(shù)決定訪問(wèn)令牌的訪問(wèn)權(quán)限 各個(gè)參數(shù)詳解url;:https://www.paypal-biz.com/product/login-with-paypal/index.html#configureButton
public $token = null;
public $protocol = "http";
/**
* @name 構(gòu)造函數(shù)
* @param $flag 是否沙箱環(huán)境
*/
public function __construct($redirect_uri, $client_id,$client_secret,$scope,$state,$flag = true)
{
$this->_sanbox_flag = $flag;
$this->_redirect_uri = $redirect_uri;
$this->_client_id = $client_id;
$this->_client_secret = $client_secret;
$this->_scope = $scope;
$this->_state = $state;
}
/**
* 創(chuàng)建paypal request url
* @return string
*/
public function create_request_url()
{
$oauth2_auth_uri = $this->_sanbox_flag ? $this->_sanbox_oauth2_auth_uri :$this->_live_oauth2_auth_uri;
$url = $oauth2_auth_uri.'?'.
http_build_query(
array(
'client_id' => $this->_client_id, //通過(guò)應(yīng)用程序注冊(cè)流程獲得的唯一客戶端標(biāo)識(shí)符。必需。
'response_type' =>'code', //表明授權(quán)代碼被發(fā)送回應(yīng)用程序返回URL。為了使訪問(wèn)令牌在用戶代理中不可見(jiàn), 建議使用<code>code</code>一值。如果您希望在響應(yīng)中同時(shí)收到授權(quán)代碼和 id_token ,請(qǐng)傳遞 code+id_token。另一個(gè)可能的 response_type 值是 token ——大部分由javascript和移動(dòng)客戶端等公共客戶端使用。
'scope' => $this->_scope,//;implode(',', $this->scope),
'redirect_uri' => urlencode($this->_redirect_uri), //應(yīng)用程序的返回URL。結(jié)構(gòu)、主機(jī)名和端口必須與您在注冊(cè)應(yīng)用程序時(shí)設(shè)置的返回URL相符。
'nonce' => time().rand(), //不透明的隨機(jī)標(biāo)識(shí)符,可減少重放攻擊風(fēng)險(xiǎn)。簡(jiǎn)單的函數(shù)是:(timestamp + Base64 encoding (random\[16\]))。
'state' => $this->_state, // CSRF驗(yàn)證碼
)
);
return $url;
}
/**
* get PayPal access token
* @param string $code ?
* @return string access token
*/
public function acquire_access_token($code ) {
$accessToken = null;
try {
$postvals = sprintf("client_id=%s&client_secret=%s&grant_type=authorization_code&code=%s",$this->_client_id,$this->_client_secret,$code);
if($this->_sanbox_flag)
$ch = curl_init($this->_token_service_sandbox_url);
else
$ch = curl_init($this->_token_service_live_url);
$options = array(
CURLOPT_POST => 1,
CURLOPT_VERBOSE => 1,
CURLOPT_POSTFIELDS => $postvals,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => FALSE,
//CURLOPT_SSLVERSION => 2
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_close( $ch );
if (!$response ) {
throw new Exception( "Error retrieving access token: " . curl_error($ch));
}
$jsonResponse = json_decode($response );
if ( isset( $jsonResponse->access_token) ) {
$accessToken = $jsonResponse->access_token;
}
} catch( Exception $e) {
throw new Exception($e->getMessage(), 1);
}
return $accessToken;
}
/**
* get the PayPal user profile, decoded
* @param string $accessToken
* @return object
*/
public function acquire_paypal_user_profile($accessToken ) {
try {
if($this->_sanbox_flag)
$url = $this->_acquire_user_profile_sandbox_url . $accessToken;
else
$url = $this->_acquire_user_profile_live_url . $accessToken;
$ch = curl_init( $url );
$options = array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_SSL_VERIFYPEER => FALSE,
//CURLOPT_SSLVERSION => 2
);
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$error = curl_error( $ch);
curl_close( $ch );
if (!$response )
{
return false;
}
return json_decode($response);
} catch( Exception $e ) {
return false;
}
}
}
?>
以上所述就是本文的全部?jī)?nèi)容了,希望大家能夠喜歡。
相關(guān)文章
php 無(wú)限級(jí)數(shù)據(jù)JSON格式及JS解析
公司要做個(gè)Flash效果的頁(yè)面,需要個(gè)無(wú)限級(jí)樹(shù),顯示用戶邀請(qǐng)的好友及其下線,由此就構(gòu)成了無(wú)限級(jí)的關(guān)系,可能下線有無(wú)限多。2010-07-07
通過(guò)5個(gè)php實(shí)例細(xì)致說(shuō)明傳值與傳引用的區(qū)別
今天有個(gè)同事問(wèn)我傳值和傳引用有什么不同,這讓我想起了,剛學(xué)php的時(shí)候,那個(gè)時(shí)候做過(guò)很多項(xiàng)目,做東西多,就以為自己php掌握的差不多了,隨著時(shí)間的推移,越深入的學(xué)習(xí),越覺(jué)得自己知道的真的很少,很少2012-08-08
Laravel中的where高級(jí)使用方法實(shí)例講解
這篇文章主要介紹了Laravel中的where高級(jí)使用方法實(shí)例講解,有對(duì)于laravel中的sql中高級(jí)用法感興趣的同學(xué)可以看看文中的實(shí)例學(xué)習(xí)下2021-03-03
Laravel5.1 框架模型創(chuàng)建與使用方法實(shí)例分析
這篇文章主要介紹了Laravel5.1 框架模型創(chuàng)建與使用方法,結(jié)合實(shí)例形式分析了laravel5.1框架模型的原理、創(chuàng)建、更新、獲取等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
ThinkPHP結(jié)合AjaxFileUploader實(shí)現(xiàn)無(wú)刷新文件上傳的方法
這篇文章主要介紹了ThinkPHP結(jié)合AjaxFileUploader實(shí)現(xiàn)無(wú)刷新文件上傳的方法,是ThinkPHP文件上傳中一個(gè)比較典型的應(yīng)用技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10
php實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)備份類(lèi)
備份程序一共只有兩個(gè)類(lèi):數(shù)據(jù)庫(kù)備份器(DbBak)和表備份器(TableBak): 這個(gè)程序僅僅備份和恢復(fù)數(shù)據(jù),使用方法很簡(jiǎn)單,實(shí)例化DbBak,然后調(diào)用bakupDb和restoreDb方法:2008-03-03
Laravel框架驗(yàn)證碼類(lèi)用法實(shí)例分析
這篇文章主要介紹了Laravel框架驗(yàn)證碼類(lèi)用法,結(jié)合實(shí)例形式分析了Laravel框架驗(yàn)證碼類(lèi)的使用操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-09-09

