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相关资料
Oct 09 PHP
php生成缩略图的类代码
Oct 02 PHP
Php获取金书网的书名的实现代码
Jun 11 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
Sep 15 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
Feb 06 PHP
非常好用的Zend Framework分页类
Jun 25 PHP
PHP获取远程图片并保存到本地的方法
May 12 PHP
PHP实现双链表删除与插入节点的方法示例
Nov 11 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
Yii2.0框架模型添加/修改/删除数据操作示例
Jul 18 PHP
PHP 对象继承原理与简单用法示例
Apr 21 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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
用javascript实现给出的盒子的序列是否可连为一矩型
2007/08/30 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
HTML中的setCapture和releaseCapture使用介绍
2012/03/21 Javascript
优化Jquery,提升网页加载速度
2013/11/14 Javascript
JavaScript作用域链示例分享
2014/05/27 Javascript
为什么JS中eval处理JSON数据要加括号
2015/04/13 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
2016/03/10 Javascript
springMVC结合AjaxForm上传文件
2016/07/12 Javascript
JS+DIV实现的卷帘效果示例
2017/03/22 Javascript
PHPStorm中如何对nodejs项目进行单元测试详解
2019/02/28 NodeJs
Angular封装搜索框组件操作示例
2019/04/25 Javascript
Layui多选只有最后一个值的解决方法
2019/09/02 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
Python安装使用命令行交互模块pexpect的基础教程
2016/05/12 Python
python中函数默认值使用注意点详解
2016/06/01 Python
Python验证文件是否可读写代码分享
2017/12/11 Python
python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
2018/10/17 Python
python 多个参数不为空校验方法
2019/02/14 Python
django 多对多表的创建和插入代码实现
2019/09/09 Python
Python Django2.0集成Celery4.1教程
2019/11/19 Python
Scrapy 配置动态代理IP的实现
2020/09/28 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
贝嫂喜欢的婴儿品牌,个性化的婴儿礼物:My 1st Years
2017/11/19 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
结婚邀请函范文
2014/01/14 职场文书
公司活动邀请函
2014/01/24 职场文书
校长先进事迹材料
2014/02/01 职场文书
《我的信念》教学反思
2014/02/15 职场文书
春节请假条
2014/04/11 职场文书
管理提升方案
2014/06/04 职场文书
公务员政审材料范文
2014/12/23 职场文书
物业前台接待岗位职责
2015/04/03 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
导游词之太湖
2019/10/08 职场文书
SQL Server携程核心系统无感迁移到MySQL实战
2022/06/01 SQL Server