php实现paypal 授权登录


Posted in PHP onMay 28, 2015

php实现paypal 授权登录

<?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 参数决定访问令牌的访问权限 各个参数详解url;:https://www.paypal-biz.com/product/login-with-paypal/index.html#configureButton
 
  public $token = null;
  public $protocol = "http";
 
 
  /**
  * @name 构造函数
  * @param $flag 是否沙箱环境
  */
  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;
  }
 
  /**
   * 创建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, //通过应用程序注册流程获得的唯一客户端标识符。必需。
        'response_type' =>'code', //表明授权代码被发送回应用程序返回URL。为了使访问令牌在用户代理中不可见, 建议使用<code>code</code>一值。如果您希望在响应中同时收到授权代码和 id_token ,请传递 code+id_token。另一个可能的 response_type 值是 token ——大部分由javascript和移动客户端等公共客户端使用。
        'scope' => $this->_scope,//;implode(',', $this->scope),
        'redirect_uri' => urlencode($this->_redirect_uri), //应用程序的返回URL。结构、主机名和端口必须与您在注册应用程序时设置的返回URL相符。
        'nonce' => time().rand(), //不透明的随机标识符,可减少重放攻击风险。简单的函数是:(timestamp + Base64 encoding (random\[16\]))。
        'state' => $this->_state, // CSRF验证码
      )
    );
    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;
    }
  }
}
?>

以上所述就是本文的全部内容了,希望大家能够喜欢。

PHP 相关文章推荐
php中函数的形参与实参的问题说明
Sep 01 PHP
php tp验证表单与自动填充函数代码
Feb 22 PHP
自己在做项目过程中学到的PHP知识收集
Aug 20 PHP
微博短链接算法php版本实现代码
Sep 15 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
Jun 20 PHP
yii框架通过控制台命令创建定时任务示例
Apr 30 PHP
9段PHP实用功能的代码推荐
Oct 14 PHP
PHP文件读写操作相关函数总结
Nov 18 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
PHP简单获取随机数的常用方法小结
Jun 07 PHP
thinkphp 抓取网站的内容并且保存到本地的实例详解
Aug 25 PHP
PHP使用Redis长连接的方法详解
Feb 12 PHP
typecho插件编写教程(四):插件挂载
May 28 #PHP
PHP Opcache安装和配置方法介绍
May 28 #PHP
typecho插件编写教程(三):保存配置
May 28 #PHP
PHP通过API获取手机号码归属地
May 28 #PHP
typecho插件编写教程(二):写一个新插件
May 28 #PHP
typecho插件编写教程(一):Hello World
May 28 #PHP
php实现的mongodb操作类
May 28 #PHP
You might like
一个严格的PHP Session会话超时时间设置方法
2014/06/10 PHP
php数组排序usort、uksort与sort函数用法
2014/11/17 PHP
smarty内置函数foreach用法实例
2015/01/22 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
PHP实现支持CURL字符串证书传输的方法
2019/03/23 PHP
php版本CKEditor 4和CKFinder安装及配置方法图文教程
2019/06/05 PHP
JS函数验证总结(方便js客户端输入验证)
2010/10/29 Javascript
jquery插件实现鼠标经过图片右侧显示大图的效果(类似淘宝)
2013/02/04 Javascript
Javascript:为input设置readOnly属性(示例讲解)
2013/12/25 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
javascript格式化日期时间方法汇总
2015/06/19 Javascript
jQuery实现仿美橙互联两级导航菜单效果完整实例
2015/09/17 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
JavaScript实现的多种鼠标拖放效果
2015/11/03 Javascript
基于jQuery实现以手风琴方式展开和折叠导航菜单
2016/01/28 Javascript
javascript事件委托的用法及其好处简析
2016/04/04 Javascript
Javascript中return的使用与闭包详解
2017/01/11 Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
2017/10/27 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
Python selenium 父子、兄弟、相邻节点定位方式详解
2016/09/15 Python
python pandas库的安装和创建
2019/01/10 Python
Django框架验证码用法实例分析
2019/05/10 Python
基于Pycharm加载多个项目过程图解
2020/01/19 Python
Python实现在Windows平台修改文件属性
2020/03/05 Python
全网首秀之Pycharm十大实用技巧(推荐)
2020/04/27 Python
Python离线安装各种库及pip的方法
2020/11/28 Python
10张动图学会python循环与递归问题
2021/02/06 Python
高中军训感言800字
2014/03/05 职场文书
艾滋病宣传标语
2014/06/25 职场文书
班级团队活动方案
2014/08/14 职场文书
小学生我的梦想演讲稿
2014/08/21 职场文书
幼儿学前班评语
2014/12/29 职场文书
研究生简历自我评
2015/03/11 职场文书
自书遗嘱范文
2015/08/07 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
windows系统搭建WEB服务器详细教程
2022/08/05 Servers