PC网站支付宝扫码登录

1.电脑网站支付宝登录,拼接授权链接,在浏览器上访问授权链接即可
登录 - 支付宝欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。icon-default.png?t=N7T8https://openauth.alipay.com/oauth2/publicAppAuthorize.htm?app_id=商户的APPID&scope=auth_user&redirect_uri=ENCODED_URL&state=init

2.使用 auth_code 换取 access_token 及用户 userId

composer安装 alipaysdk/easysdk依赖包

error(__('User center already closed'));
        }
        $this->app_id = '20***************08';
        $this->private_key = '你的私钥';
        $this->ali_public_key = '你的公钥';

    }
    /**
     * auth_token获取用户信息
     * @return array
     * @throws \Exception
     */
    public function getUserInfo()
    {
        $auth_token = $this->request->post('auth_token');
        Factory::setOptions($this->getOptions());
        //设置系统参数(OpenAPI中非biz_content里的参数)
        $textParams = array(
            "code" => "{$auth_token}",
            "grant_type" => "authorization_code"
        );
        //设置业务参数(OpenAPI中biz_content里的参数)
        $bizParams = array();
        $resJson = Factory::util()->generic()->execute("alipay.system.oauth.token", $textParams, $bizParams)->httpBody;
        $resJsonToArray = json_decode($resJson, true);

        if (isset($resJsonToArray['alipay_system_oauth_token_response'])) {
            $this->success('授权成功',$resJsonToArray['alipay_system_oauth_token_response']);
        } else {
            $this->error('授权失败',$resJsonToArray);
        }
    }


    /**
     * 【新版】配置
     * @return Config
     */
    private function getOptions()
    {
        $options = new Config();
        $options->protocol = 'https';
        $options->gatewayHost = 'openapi.alipay.com';
        $options->signType = 'RSA2';
        $options->appId = $this->app_id;

        // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中
        $options->merchantPrivateKey = $this->private_key;
        //$options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->';
        //$options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt" -->';
        //$options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->';
        //注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可
        // $options->alipayPublicKey = '<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->';
        $options->alipayPublicKey = $this->ali_public_key;

        //可设置异步通知接收服务地址(可选)
        // $options->notifyUrl = "";
        //可设置AES密钥,调用AES加解密相关接口时需要(可选)
        // $options->encryptKey = "";

        return $options;
    }

    /**
     * 返回给前端获取code
     * 【新旧都可用】
     * InfoStr APP登录需要的的infostr
     * @return String
     */
    public function infoStr()
    {
        $infoStr = http_build_query([
            'apiname' => 'com.alipay.account.auth',
            'method' => 'alipay.open.auth.sdk.code.get',
            'app_id' => $this->app_id,
            'app_name' => 'mc',
            'biz_type' => 'openservice',
            'pid' => $this->pid,
            'product_id' => 'APP_FAST_LOGIN',
            'scope' => 'kuaijie',
            'target_id' => time(), //商户标识该次用户授权请求的ID,该值在商户端应保持唯一
            'auth_type' => 'AUTHACCOUNT', // AUTHACCOUNT代表授权;LOGIN代表登录
            'sign_type' => 'RSA2',
        ]);
        $infoStr .= '&sign=' . $this->enRSA2($infoStr);
        return $infoStr;
    }

    /**
     * 【生成签名sign】
     * enRSA2 RSA加密
     * @param String $data
     * @return String
     */
    private function enRSA2($data)
    {
        $str = chunk_split(trim($this->private_key), 64, "\n");
        $key = "-----BEGIN RSA PRIVATE KEY-----\n$str-----END RSA PRIVATE KEY-----\n";
        // print_r($key);die;
        // $key = file_get_contents(storage_path('rsa_private_key.pem')); 为文件时这样引入
        $signature = '';
        //$signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256)?base64_encode($signature):NULL;
        $signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256) ? base64_encode($signature) : NULL;
        return $signature;
    }

     /**
     * myHttpBuildQuery 返回一个 http Get 传参数组
     * 之所以不用 自带函数 http_build_query 时间带 ‘:’ 会被转换
     *
     * @param Array
     * @return String
     */
    private function myHttpBuildQuery($dataArr)
    {
        ksort($dataArr);
        $signStr = '';
        foreach ($dataArr as $key => $val) {
            if (empty($signStr)) {
                $signStr = $key . '=' . $val;
            } else {
                $signStr .= '&' . $key . '=' . $val;
            }
        }
        return $signStr;
    }
}

前端将auth_code 提交到getUserInfo方法获取唯一表示userid

你可能感兴趣的:(php,服务器)