欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

第三方登录之支付宝登录,基于ThinkSDK

程序员文章站 2024-01-15 09:37:28
...
增加ThinkSDK的支付宝第三方登录
1、配置文件增加相应参数//支付宝登录
'THINK_SDK_ALIPAY' => array(
'APP_KEY' => '', //应用注册成功后分配的 APP ID
'APP_SECRET' => '', //应用注册成功后分配的KEY
'CALLBACK' => URL_CALLBACK . 'alipay',
),
2、相关SDK代码,因为我们公司用的zend framework,我将thinkSDK移植进来肯定做了修改,所以仅供参考。支付宝登录与其他的不同,登录时有sign验证,而且只用请求一次,所以重载了thinkouath的部分类。 /**
* @Author: 杰少pakey
* @Email : admin@ptcms.com
* @File : AlipaySDK.php
*/

class AlipaySDK extends ThinkOauth{
/**
* 获取requestCode的api接口
* @var string
*/
protected $GetRequestCodeURL = 'https://mapi.alipay.com/gateway.do';

/**
* API根路径
* @var string
*/
protected $ApiBase = 'https://mapi.alipay.com/gateway.do';

public function getRequestCodeURL(){
$this->config();
$params = array(
'input_charset' => 'utf-8',
'login_service' => 'user_auth',
'partner' => $this->AppKey,
'request_id'=>date('YmdHis').rand(1000,9999),
'return_url'=>$this->Callback,
'return_url_failed'=>$this->Callback,
'service'=>'wap.user.common.login',
);
$params['sign']=$this->createSign($params);
$params['sign_type']='MD5';
return $this->GetRequestCodeURL . '?' . http_build_query($params);
}

public function getAccessToken($code='',$extend=''){
$sign=$_GET['sign'];
unset($_GET['a'],$_GET['type'],$_GET['sign']);
if ($sign===$this->createSign($_GET)){
$this->Token=array(
'access_token'=>$_GET['login_token'],
'openid'=>$_GET['user_id'],
);
return $this->Token;
}else{
exit('签名验证失败');
}
}

protected function createSign($params)
{
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
unset ($k, $v);
return md5($stringToBeSigned.$this->AppSecret);
}

/**
* 组装接口调用参数 并调用接口
*/
public function call($api, $param = array(), $method = 'GET', $multi = false){
$param['partner']=$this->AppKey;
$param['sign']=$this->createSign($param);
$param['sign_type']='MD5';
$data = $this->http($this->url($api), $param, $method);
return ($data);
}

/**
* 解析access_token方法请求后的返回值
*/
protected function parseToken($result, $extend){

}

/**
* 获取当前授权应用的openid
*/
public function openid(){
$data = $this->Token;
if(!empty($data['openid']))
return $data['openid'];
else
exit('没有获取到支付宝用户ID!');
}

}
3、获取信息的接口,支付宝默认仅提供userid和usertype,更多需要去申请。另外返回是xml,需要解析,这里就简单做下示例。public static function alipay($token){
$alipay=DKOauth::getInstance('alipay', $token);
$param=array(
'_input_charset'=>'utf-8',
'input_charset'=>'utf-8',
'service'=>'mobile.common.login.userInfo.query',
'token'=>$token['access_token'],
'format'=>'json',
);
$data=$alipay->call('',$param);
return $data;
}
首发:http://pakey.net/blog/557.html,有问题请到这里留言

AD:真正免费,域名+虚机+企业邮箱=0元