布景
App 名目要求完成第三方 微信 以及 领取宝 登录,微信能够间接正在 App 端实现认证拿到用户信息,领取宝则需求后端猎取。
流程
一、效劳端先拿到 App 端 挪用 领取宝 SDK 所需求的 infoStr
二、App 端 经过 infoStr 取得用户 受权 code
三、效劳端经过 受权 code 拿到申请 token
四、效劳端经过 token 取得用户信息
代码
正在这以前,领取宝接口对接流程你应该有所理解。
一、创立 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; }
二、创立一个 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; }
三、给到 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; }
四、拿到用户信息:
/** * 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 第三方登录猎取用户信息的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!