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错误和异长常处理总结
Mar 06 PHP
php采用curl模仿登录人人网发布动态的方法
Nov 07 PHP
php抽象类使用要点与注意事项分析
Feb 09 PHP
PHP生成指定随机字符串的简单实现方法
Apr 01 PHP
PHP获取当前日期和时间及格式化方法参数
May 11 PHP
优化WordPress中文章与评论的时间显示
Jan 12 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
Apr 04 PHP
PHP redis实现超迷你全文检索
Mar 04 PHP
php数据序列化测试实例详解
Aug 12 PHP
php读取本地json文件的实例
Mar 07 PHP
PHP+Ajax实现的博客文章添加类别功能示例
Mar 29 PHP
PHP array_shift()用法实例分析
Jan 07 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
thinkphp中html:list标签传递多个参数实例
2014/10/30 PHP
PHP中的命名空间相关概念浅析
2015/01/22 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
通过jQuery打造支持汉字,拼音,英文快速定位查询的超级select插件
2010/06/18 Javascript
ExtJS下书写动态生成的xml(兼容火狐)
2013/04/02 Javascript
js与jQuery实现checkbox复选框全选/全不选的方法
2016/01/05 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
React中ES5与ES6写法的区别总结
2017/04/21 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
解决ionic和angular上拉加载的问题
2017/08/03 Javascript
JavaScript定义函数的三种实现方法
2017/09/23 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
详解50行代码,Node爬虫练手项目
2019/04/22 Javascript
[59:07]海涛为你详解DOTA2新版本“贤哲秘契”
2014/11/22 DOTA
python 爬取微信文章
2016/01/30 Python
详解Python中类的定义与使用
2017/04/11 Python
pip matplotlib报错equired packages can not be built解决
2018/01/06 Python
详解python的argpare和click模块小结
2019/03/31 Python
PyCharm2018 安装及破解方法实现步骤
2019/09/09 Python
python等待10秒执行下一命令的方法
2020/07/19 Python
五个2015 年最佳HTML5 框架
2015/11/11 HTML / CSS
EJB面试题
2015/07/28 面试题
理工学院学生自我鉴定
2014/02/23 职场文书
党员弘扬焦裕禄精神思想汇报
2014/09/10 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
党的群众路线教育实践活动党员个人整改措施
2014/10/27 职场文书
2015年见习期工作总结
2014/12/12 职场文书
2015年基层党建工作汇报材料
2015/06/25 职场文书
2019年思想汇报
2019/06/20 职场文书
python字符串常规操作大全
2021/05/02 Python
2021年最新用于图像处理的Python库总结
2021/06/15 Python