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来自动调用不同服务器上的flash
Oct 09 PHP
phpMyAdmin下载、安装和使用入门教程
May 31 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
解析如何在PHP下载文件名中解决乱码的问题
Jun 20 PHP
php中的curl_multi系列函数使用例子
Jul 29 PHP
php去掉文件前几行的方法
Jul 29 PHP
PHP文件缓存类实现代码
Oct 26 PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 PHP
浅谈php和js中json的编码和解码
Oct 24 PHP
PHP面向对象程序设计之命名空间与自动加载类详解
Dec 02 PHP
2017年最新PHP经典面试题目汇总(上篇)
Mar 17 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 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生成唯一的促销/优惠/折扣码(附源码)
2012/12/28 PHP
深入PHP magic quotes的详解
2013/06/17 PHP
PHP SPL标准库之SplFixedArray使用实例
2015/05/12 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
jQuery 使用手册(四)
2009/09/23 Javascript
javascript 命名规则 变量命名规则
2010/02/25 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
ANGULARJS中使用JQUERY分页控件
2015/09/16 Javascript
jQuery插件zTree实现单独选中根节点中第一个节点示例
2017/03/08 Javascript
搭建一个Koa后端项目脚手架的方法步骤
2019/05/30 Javascript
js生成1到100的随机数最简单的实现方法
2020/02/07 Javascript
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
js 将多个对象合并成一个对象 assign方法的实现
2020/09/24 Javascript
[01:49]一目了然!DOTA2DotA快捷操作对比第二弹
2014/05/16 DOTA
[01:02:04]EG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python实现的生成随机迷宫算法核心代码分享(含游戏完整代码)
2014/07/11 Python
Python创建模块及模块导入的方法
2015/05/27 Python
详解Python的Django框架中manage命令的使用与扩展
2016/04/11 Python
Python手机号码归属地查询代码
2016/05/04 Python
Collatz 序列、逗号代码、字符图网格实例
2017/06/22 Python
Python对多属性的重复数据去重实例
2018/04/18 Python
Python设计模式之建造者模式实例详解
2019/01/17 Python
python如何把字符串类型list转换成list
2020/02/18 Python
Python中logging日志库实例详解
2020/02/19 Python
Keras load_model 导入错误的解决方式
2020/06/09 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
美国首屈一指的高品质珠宝设计师和零售商:Allurez
2018/01/23 全球购物
int *p=NULL和*p= NULL有什么区别
2014/10/23 面试题
国贸专业大学生职业生涯规划范文
2014/01/10 职场文书
会计专业自我评价
2014/02/12 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
孝女彩金观后感
2015/06/10 职场文书
《作风建设永远在路上》心得体会
2016/01/21 职场文书
Python实现归一化算法详情
2022/03/18 Python