Native PHP implémente une connexion tierce dans l'application Alipay pour obtenir des informations sur l'utilisateur

藏色散人
Libérer: 2023-04-07 08:58:01
avant
4257 Les gens l'ont consulté

Contexte

Le projet d'application nécessite une connexion tierce à WeChat et Alipay. WeChat peut effectuer une authentification directement du côté de l'application pour obtenir des informations sur l'utilisateur, tandis qu'Alipay nécessite une acquisition back-end.

Processus

1. Le serveur obtient d'abord l'infoStr requis par l'application pour appeler Alipay SDK

2 L'application obtient l'autorisation de l'utilisateur via infoStr. code

3. Le serveur obtient le jeton de demande via le code d'autorisation

4 Le serveur obtient les informations utilisateur via le jeton

code<.>

Avant cela, vous devez avoir une certaine compréhension du processus d'accueil de l'interface Alipay.

1. Créez la méthode RSA2 : get 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(&#39;rsa_private_key.pem&#39;)); 为文件时这样引入
    $signature = &#39;&#39;;
    $signature = openssl_sign($data, $signature, $key, OPENSSL_ALGO_SHA256)?base64_encode($signature):NULL;
    return $signature;
}
Copier après la connexion

2. Créez une méthode d'épissage des paramètres Get pour vous assurer qu'elle répond aux exigences de la chaîne de signature Alipay :

/**
 * myHttpBuildQuery
 * 之所以不用 自带函数 `http_build_query` 
 * 是因为格式化的时间带有  ‘:’  会被转换成十六进制 utf-8 码
 * 
 * @param Array
 * @return String
 */
private function myHttpBuildQuery($dataArr)
{
    ksort($dataArr);
    $signStr = &#39;&#39;;
    foreach ($dataArr as $key => $val) {
        if (empty($signStr)) {
            $signStr = $key.&#39;=&#39;.$val;
        } else {
            $signStr .= &#39;&&#39;.$key.&#39;=&#39;.$val;
        }
    }
    return $signStr;  
}
Copier après la connexion

3. Accédez à l'infoStr requise sur l'application :


/**
 * InfoStr APP登录需要的的infostr
 * 
 * @return String
 */
public function infoStr()
{
    $infoStr = http_build_query([
        &#39;apiname&#39; => &#39;com.alipay.account.auth&#39;,
        &#39;method&#39; => &#39;alipay.open.auth.sdk.code.get&#39;,
        &#39;app_id&#39; => $this->app_id,
        &#39;app_name&#39; => &#39;mc&#39;,
        &#39;biz_type&#39; => &#39;openservice&#39;,
        &#39;pid&#39; => $this->pid,
        &#39;product_id&#39; => &#39;APP_FAST_LOGIN&#39;,
        &#39;scope&#39; => &#39;kuaijie&#39;,
        &#39;target_id&#39; => mt_rand(999, 99999), //商户标识该次用户授权请求的ID,该值在商户端应保持唯一
        &#39;auth_type&#39; => &#39;AUTHACCOUNT&#39;, // AUTHACCOUNT代表授权;LOGIN代表登录
        &#39;sign_type&#39; => &#39;RSA2&#39;,
    ]);
    $infoStr .= &#39;&sign=&#39;.$this->enRSA2($infoStr);
    return $infoStr;
}
Copier après la connexion

4. Obtenez des informations sur l'utilisateur :

 /**
     * AlipayToken 获得用户 请求token, 通过它获得 用户信息
     * 
     * 需要按照支付宝加签流程来。
     */
    public function userInfo($app_auth_token)
    {
        $infoArr = [
            &#39;method&#39; => &#39;alipay.system.oauth.token&#39;,
            &#39;app_id&#39; => $this->app_id,
            &#39;charset&#39; => &#39;utf-8&#39;,
            &#39;sign_type&#39; => &#39;RSA2&#39;,
            &#39;timestamp&#39; => date(&#39;Y-m-d H:i:s&#39;),
            &#39;version&#39; => &#39;1.0&#39;,
            &#39;code&#39; => $app_auth_token,
            &#39;grant_type&#39; => &#39;authorization_code&#39;,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.&#39;&sign=&#39;.$sign;
        $res = new Client();
        $body = $res->get(&#39;https://openapi.alipay.com/gateway.do?&#39;.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_system_oauth_token_response->access_token)) {
            return &#39;接口异常&#39;;
        } 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 = [
            &#39;method&#39; => &#39;alipay.user.info.share&#39;,
            &#39;app_id&#39; => $this->app_id,
            &#39;charset&#39; => &#39;utf-8&#39;,
            &#39;sign_type&#39; => &#39;RSA2&#39;,
            &#39;timestamp&#39; => date(&#39;Y-m-d H:i:s&#39;),
            &#39;version&#39; => &#39;1.0&#39;,
            &#39;auth_token&#39; => $autho_token,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.&#39;&sign=&#39;.$sign;
        $res = new Client();
        $body = $res->get(&#39;https://openapi.alipay.com/gateway.do?&#39;.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_user_info_share_response)) {
            return &#39;接口异常&#39;;
        }
        $body = $body->alipay_user_info_share_response;
        return $body;
    }
Copier après la connexion

Aperçu du code

 '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 = [
            &#39;method&#39; => &#39;alipay.system.oauth.token&#39;,
            &#39;app_id&#39; => $this->app_id,
            &#39;charset&#39; => &#39;utf-8&#39;,
            &#39;sign_type&#39; => &#39;RSA2&#39;,
            &#39;timestamp&#39; => date(&#39;Y-m-d H:i:s&#39;),
            &#39;version&#39; => &#39;1.0&#39;,
            &#39;code&#39; => $app_auth_token,
            &#39;grant_type&#39; => &#39;authorization_code&#39;,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.&#39;&sign=&#39;.$sign;
        $res = new Client();
        $body = $res->get(&#39;https://openapi.alipay.com/gateway.do?&#39;.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_system_oauth_token_response->access_token)) {
            return &#39;接口异常&#39;;
        } 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 = [
            &#39;method&#39; => &#39;alipay.user.info.share&#39;,
            &#39;app_id&#39; => $this->app_id,
            &#39;charset&#39; => &#39;utf-8&#39;,
            &#39;sign_type&#39; => &#39;RSA2&#39;,
            &#39;timestamp&#39; => date(&#39;Y-m-d H:i:s&#39;),
            &#39;version&#39; => &#39;1.0&#39;,
            &#39;auth_token&#39; => $autho_token,
        ];
        $signStr = $this->myHttpBuildQuery($infoArr);
        $sign = urlencode($this->enRSA2($signStr));
        $qureStr = $signStr.&#39;&sign=&#39;.$sign;
        $res = new Client();
        $body = $res->get(&#39;https://openapi.alipay.com/gateway.do?&#39;.$qureStr)->getBody()->getContents();
        $body = json_decode($body);
        if (!isset($body->alipay_user_info_share_response)) {
            return &#39;接口异常&#39;;
        }
        $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;  
    }
}
Copier après la connexion

Autres

1. Remarque : ce code est extrait du projet original Il s'agit principalement de fournir une référence aux développeurs qui ont ce besoin. Il n'a pas été testé s'il peut l'être. Utilisé directement. Veuillez le tester vous-même.

2. La raison pour laquelle Alipay php_SDK n'est pas utilisé est que la demande est limitée : il obtient uniquement des informations sur l'utilisateur, ce qui n'est pas nécessaire.

3. Veuillez signaler toute partie déraisonnable du code afin que tout le monde puisse apprendre les uns des autres.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal