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 相关文章推荐
多文件上载系统完整版
Oct 09 PHP
十天学会php之第二天
Oct 09 PHP
用文本文件制作留言板提示(上)
Oct 09 PHP
mysql5写入和读出乱码解决
Nov 25 PHP
关于php fread()使用技巧
Jan 22 PHP
关于PHP自动判断字符集并转码的详解
Jun 26 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
php header功能的使用
Oct 28 PHP
ThinkPHP内置jsonRPC的缺陷分析
Dec 18 PHP
php简单创建zip压缩文件的方法
Apr 30 PHP
php编译安装php-amq扩展简明教程
Jun 25 PHP
PHP实现的注册,登录及查询用户资料功能API接口示例
Jun 06 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许愿墙模块功能分析
2013/06/25 PHP
PHP编程中的常见漏洞和代码实例
2014/08/06 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
jquery+thinkphp实现跨域抓取数据的方法
2016/10/15 PHP
PHP接口并发测试的方法(推荐)
2016/12/15 PHP
laravel 使用auth编写登录的方法
2019/09/30 PHP
解决laravel上传图片之后,目录有图片,但是访问不到(404)的问题
2019/10/14 PHP
提高网站信任度的技巧
2008/10/17 Javascript
JS仿flash上传头像效果实现代码
2011/07/18 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
2013/11/04 Javascript
jquery和javascript中如何将一元素的内容赋给另一元素
2014/01/09 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
JavaScript利用闭包实现模块化
2017/01/13 Javascript
ES6学习教程之块级作用域详解
2017/10/09 Javascript
vue elementUI tree树形控件获取父节点ID的实例
2018/09/12 Javascript
使用 vue 实例更好的监听事件及vue实例的方法
2019/04/22 Javascript
用js简单提供增删改查接口
2019/05/12 Javascript
详解webpack引用jquery(第三方模块)的三种办法
2019/08/21 jQuery
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python打包可执行文件的方法详解
2016/09/19 Python
python+flask实现API的方法
2018/11/21 Python
python字符串Intern机制详解
2019/07/01 Python
python读写配置文件操作示例
2019/07/03 Python
详解HTML5.2版本带来的修改
2020/05/06 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
电大学习个人自我评价范文
2013/10/04 职场文书
小学生环保标语
2014/06/13 职场文书
2014年综治维稳工作总结
2014/11/17 职场文书
2015年高校就业工作总结
2015/05/04 职场文书
活动经费申请报告
2015/05/15 职场文书
python模板入门教程之flask Jinja
2022/04/11 Python
windows server 2016 域环境搭建的方法步骤(图文)
2022/06/25 Servers