dd

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

jerry thinkphp 2015年11月18日 收藏
增加ThinkSDK的支付宝第三方登录
1、配置文件增加相应参数
//支付宝登录
    'THINK_SDK_ALIPAY' => array(
        'APP_KEY'    => '', //应用注册成功后分配的 APP ID
        'APP_SECRET' => '', //应用注册成功后分配的KEY
        'CALLBACK'   => URL_CALLBACK . 'alipay',
    ),
2、相关SDK代码,因为我们公司用的zend framework,我将thinkSDK移植进来肯定做了修改,所以仅供参考。支付宝登录与其他的不同,登录时有sign验证,而且只用请求一次,所以重载了thinkouath的部分类。
<?php
/**
 * @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;
    }
dd