ÔÉú PHP ʵÏÖÖ§¸¶±¦ App µÚÈý·½µÇ¼ÁÔÈ¡»áÔ±ÐÅÏ¢
App ÏîÄ¿ÒªÇóʵÏÖµÚÈý·½ ΢ÐÅ ºÍ Ö§¸¶±¦ µÇ¼£¬Î¢ÐÅ¿ÉÒÔÖ±½ÓÔÚ App ¶ËÍê³ÉÈÏÖ¤Äõ½»áÔ±ÐÅÏ¢£¬Ö§¸¶±¦ÔòÐèÒªºó¶ËÁÔÈ¡¡£
Á÷³Ì
1¡¢Ð§ÀͶËÏÈÄõ½ App ¶Ë µ÷È¡ Ö§¸¶±¦ SDK ËùÐèÒªµÄ infoStr
2¡¢App ¶Ë ͨ¹ý infoStr »ñµÃ»áÔ± ÊÚȨ code
3¡¢Ð§ÀͶËͨ¹ý ÊÚȨ code Äõ½¿ÒÇó token
4¡¢Ð§ÀͶËͨ¹ý token »ñµÃ»áÔ±ÐÅÏ¢
´úÂë
ÔÚÕâ´ËÇ°£¬Ö§¸¶±¦½Ó¿Ú¶Ô½ÓÁ÷³ÌÄãÓ¦µ±ÓÐËùÀí½â¡£
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.´úÂëÓв»ºÏÀíµÄµØ·½»¹ÇëÌá³öÀ´£¬´ó¼Ò»¥Ïàѧϰ¡£
ÒÔÉϾÍÊÇÔÉú PHP ʵÏÖÖ§¸¶±¦ App µÚÈý·½µÇ¼ÁÔÈ¡»áÔ±ÐÅÏ¢µÄ¾ßÌåÄÚÈÝ£¬¸ü¶àÇë¹Ø×¢°Ù·Ö°ÙÔ´ÂëÍøÆäËüÏà¹ØÎÄÕ£¡
¸ÐлÄúµÄÖ§³Ö£¬ÎÒ»á¼ÌÐøŬÁ¦µÄ!
´ò¿ªÖ§¸¶±¦É¨Ò»É¨£¬¼´¿É½øÐÐɨÂë´òÉÍŶ
°Ù·Ö°ÙÔ´ÂëÍø ½¨Òé´òÉÍ1¡«10Ôª£¬ÍÁºÀËæÒ⣬¸ÐлÄúµÄÔĶÁ£¡