PC网站支付宝扫码登录

1.电脑网站支付宝登录,拼接授权链接,在浏览器上访问授权链接即可
登录 - 支付宝欢迎登录支付宝,支付宝-全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验以及转账收款/水电煤缴费/信用卡还款等生活服务应用;为广大为从事电子商务的网站提供支付产品/支付服务的在线订购和技术支持等服务,帮助商家快速接入支付工具,高效、安全、快捷地开展电子商务。https://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依赖包

php 复制代码
<?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2020/8/4
 * Time: 16:47
 */

namespace app\api\controller;

use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Config;
use app\common\controller\Api;

class Alipay  extends Api
{
    protected $noNeedLogin = '*';
    protected $noNeedRight = '*';
    protected $app_id;
    protected $private_key;
    protected $ali_public_key; //

    public function _initialize()
    {
        parent::_initialize();

        if (!\think\Config::get('fastadmin.usercenter')) {
            $this->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

相关推荐
BingoGo9 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack9 小时前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack1 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
Sinclair2 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
JaguarJack2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo2 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
Rockbean3 天前
用40行代码搭建自己的无服务器OCR
服务器·python·deepseek
茶杯梦轩3 天前
CompletableFuture 在 项目实战 中 创建异步任务 的核心优势及使用场景
服务器·后端·面试
JaguarJack3 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel