原生 PHP 完成支付宝 亚博App 第三方登录猎取用户信息

怎么设置notepad++为默认打开

找一个文本文档,右击【打开方式】-【选择默认程序】,选择notepad++,勾选【始终使用选择的程序打开这种文件】;如果【选择默认程序】中没有notepad++,点击【浏览】找到notepad++安装的文件夹添加notepad++.exe。

背景

App 项目要求完成第三方 微信 和 支付宝 登录,微信能够直接在 App 端完成认证拿到用户信息,支付宝则须要后端猎取。

流程

1、服务端先拿到 App 端 挪用 支付宝 SDK 所须要的 infoStr

2、App 端 经由过程 infoStr 取得用户 受权 code

3、服务端经由过程 受权 code 拿到要求 token

4、服务端经由过程 token 取得用户信息

代码

在这之前,支付宝接口对接流程你应当有所相识。

ThinkPHP验证码老是出错怎么办

找到服务器php配置文件php.ini,在网站根目录下建一个info.php文件。||用txt打开php.ini文件,查找:session.save_path,设置正确目录,再保存。||配置所有用户,修改和读写权限,然后重启IIS即可。

1、建立 RSA2 要领:取得 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";
    // $key = file_get_contents(storage_path('rsa_private_key.pem')); 为文件时如许引入
    $signature = '';
    $signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256)?base64_encode($signature):NULL;
    return $signature;
}

2、建立一个 Get 参数拼接要领,保证相符支付宝加签字符串要求:

/**
 * myHttpBuildQuery
 * 之所以不必 自带函数 `http_build_query` 
 * 是因为格式化的时候带有  ‘:’  会被转换成十六进制 utf-8 码
 * 
 * @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;  
}

3、给到 APP 端须要的 infoStr:

/**
 * 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' => mt_rand(999, 99999), //商户标识该次用户受权要求的ID,该值在商户端应坚持唯一
        'auth_type' => 'AUTHACCOUNT', // AUTHACCOUNT代表受权;LOGIN代表登录
        'sign_type' => 'RSA2',
    ]);
    $infoStr .= '&sign='.$this->enRSA2($infoStr);
    return $infoStr;
}

4、拿到用户信息:

 /**
     * AlipayToken 取得用户 要求token, 经由过程它取得 用户信息
     * 
     * 须要依据支付宝加签流程来。
     */
    public function userInfo($app_auth_token)
    {
        $infoArr = [
            'method' => 'alipay.system.oauth.token',
            'app_id' => $this->app_id,
            'charset' => 'utf-8',
            'sign_type' => 'RSA2',
            'timestamp' => date('Y-m-d H:i:s'),
            'version' => '1.0',
            'code' => $app_auth_token,
            'grant_type' => 'authorization_code',
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.'&sign='.$sign;
        $res = new Client();
        $body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_system_oauth_token_response->access_token)) {
            return '接口非常';
        } else {
            $autho_token = $body->alipay_system_oauth_token_response->access_token;
            $userinfo = $this->aliPayUserInfo($autho_token);
            return $userinfo; // 或则 返回 json_encode($userinfo) 依据现实需求来 
        }
    }
    /**
     * AliPayUserInfo 经由过程 token 猎取用户信息
     */
    private function aliPayUserInfo($autho_token)
    {
        $infoArr = [
            'method' => 'alipay.user.info.share',
            'app_id' => $this->app_id,
            'charset' => 'utf-8',
            'sign_type' => 'RSA2',
            'timestamp' => date('Y-m-d H:i:s'),
            'version' => '1.0',
            'auth_token' => $autho_token,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.'&sign='.$sign;
        $res = new Client();
        $body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_user_info_share_response)) {
            return '接口非常';
        }
        $body = $body->alipay_user_info_share_response;
        return $body;
    }

代码总览

<?php 
// 运用 Guzzle 做要求操纵
use GuzzleHttp\Client;
// 支付宝APP 第三方登录
// 特性:比拟微信,支付宝一切敏感信息都在服务端完成, 保证了平安
//
// 流程:
// 1.服务端到APP infoStr 
// 2.APP端 经由过程infoStr 取得 auth_code 
// 3.服务端经由过程 auth_code 拿到要求 token
// 4.服务端经由过程 token 取得用户信息
class AliPayUser{
    protected $app_id = '支付宝app_id';
    protected $pid = '支付宝pid';
    protected $private_key = '你的私钥';
    /**
     * 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' => mt_rand(999, 99999), //商户标识该次用户受权要求的ID,该值在商户端应坚持唯一
            'auth_type' => 'AUTHACCOUNT', // AUTHACCOUNT代表受权;LOGIN代表登录
            'sign_type' => 'RSA2',
        ]);
        $infoStr .= '&sign='.$this->enRSA2($infoStr);
        return $infoStr;
    }
     /**
     * AlipayToken 取得用户 要求token, 经由过程它取得 用户信息
     * 
     * 须要依据支付宝加签流程来。
     */
    public function userInfo($app_auth_token)
    {
        $infoArr = [
            'method' => 'alipay.system.oauth.token',
            'app_id' => $this->app_id,
            'charset' => 'utf-8',
            'sign_type' => 'RSA2',
            'timestamp' => date('Y-m-d H:i:s'),
            'version' => '1.0',
            'code' => $app_auth_token,
            'grant_type' => 'authorization_code',
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.'&sign='.$sign;
        $res = new Client();
        $body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_system_oauth_token_response->access_token)) {
            return '接口非常';
        } else {
            $autho_token = $body->alipay_system_oauth_token_response->access_token;
            $userinfo = $this->aliPayUserInfo($autho_token);
            return $userinfo; // 或则 返回 json_encode($userinfo) 依据现实需求来 
        }
    }
    /**
     * AliPayUserInfo 经由过程 token 猎取用户信息
     */
    private function aliPayUserInfo($autho_token)
    {
        $infoArr = [
            'method' => 'alipay.user.info.share',
            'app_id' => $this->app_id,
            'charset' => 'utf-8',
            'sign_type' => 'RSA2',
            'timestamp' => date('Y-m-d H:i:s'),
            'version' => '1.0',
            'auth_token' => $autho_token,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.'&sign='.$sign;
        $res = new Client();
        $body = $res->get('https://openapi.alipay.com/gateway.do?'.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_user_info_share_response)) {
            return '接口非常';
        }
        $body = $body->alipay_user_info_share_response;
        return $body;
    }
    /**
     * 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";
        // $key = file_get_contents(storage_path('rsa_private_key.pem')); 为文件时如许引入
        $signature = '';
        $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;  
    }
}

别的

1.注重:这份代码是从原有项目扒出来,主如果为有此需求的开发人员供应参考,并未测试是否能直接运用,请自行测试。

2.之所以不必支付宝 php_SDK,是因为需求有限:只猎取用户的信息,没必要。

3.代码有不合理的处所还请提出来,人人互相学习。

notepad怎么给字体加颜色

点击notepad++菜单栏中的【设置】-【语言格式设置】,进入语言格式设置界面,在【色彩样式】中设置【前景色】为想为字体加的颜色,勾选【使用全局前景色】,点击【保存并关闭】按钮,设置完毕。

Up Next:

notepad空格怎样删除

notepad空格怎样删除