| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- <?php
- namespace app\frontend\modules\member\services;
- use app\common\services\Session;
- use app\frontend\modules\member\services\MemberService;
- use app\common\services\alipay\request\AlipaySystemOauthTokenRequest;
- use app\common\services\alipay\request\AlipayUserInfoShareRequest;
- use app\common\services\alipay\AopClient;
- use app\common\helpers\Url;
- use app\frontend\modules\member\models\MemberModel;
- use Yunshop\AlipayOnekeyLogin\models\MemberAlipay;
- class MemberAlipayService extends MemberService
- {
- const LOGIN_TYPE = 8;
-
- private $url = "https://openauth.alipay.com/oauth2/publicAppAuthorize.htm";
- //支付宝网关
- private $alipay_api = "https://openapi.alipay.com/gateway.do";
- private $aop;
- public function __construct()
- {
- // parent::__construct();
- $this->aop = $this->aopClient();
- }
- public function login()
- {
- //商城默认头像
- $member_avatar = \Setting::get('shop.member')['headimg'];
- $uniacid = \YunShop::app()->uniacid;
- // $appId = \YunShop::app()->app_id;
- $code = \YunShop::request()->auth_code;
- //回调域名
- $host = ($_SERVER['REQUEST_SCHEME'] ? $_SERVER['REQUEST_SCHEME'] : 'http') . '://' . $_SERVER['HTTP_HOST'];
- $callback = urlencode($host.$_SERVER['PHP_SELF']);
- //回调地址
- if($_SERVER['QUERY_STRING']) $callback = $callback.'?'.$_SERVER['QUERY_STRING'];
- if (empty($code)) {
- $this->_setClientRequestUrl();
- $alipay_redirect = $this->__CreateOauthUrlForCode($this->aop->appId, $callback);
- redirect($alipay_redirect)->send();
- exit();
- }
- $request = new AlipaySystemOauthTokenRequest();
- $request->setGrantType("authorization_code");
- $request->setCode($code);//这里传入 code
- $result = $this->aop->execute($request);
- $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
- $result = json_decode($result, true);
- $user = $result[$responseNode];
- if ($user = $result[$responseNode]) {
- //第一步获取到支付宝用户user_id,判断商城是否已存在这个用户
- //第二步用户已存在则直接登录,不存在则 通过 access_token 获取用户信息添加到支付宝用户表
- $userInfo = $this->getUserInfo($user['access_token']);
- $alipay_user['openid'] = $userInfo['user_id'];
- $alipay_user['nickname'] = $userInfo['nick_name'];
- $alipay_user['headimgurl'] = !empty($userInfo['avatar'])?$userInfo['avatar']:$member_avatar;
- $alipay_user['sex'] = $userInfo['gender'] == 'F' ? 0 : 1;
- $alipay_user['province'] = $userInfo['province'];
- $alipay_user['city'] = $userInfo['city'];
- $alipay_user['country'] = '';
- $member_id = $this->memberLogin($alipay_user);
- Session::set('member_id', $member_id);
- //添加 yz_member_alipay 表
- $bool = MemberAlipay::insertData($userInfo, ['member_id' =>$member_id, 'uniacid' => $uniacid]);
- if (!$bool) {
- \Log::debug('支付宝用户信息保存失败 user_id:'.$userInfo['user_id'].'会员uid:'.$member_id);
- }
- /*alipay_system_oauth_token_response" => array:6 [
- "access_token" => "authusrB6e094cbc0cd54ed18e69b35e2000aX41"
- "alipay_user_id" => "20880051464321899646564260914141"
- "expires_in" => 1296000
- "re_expires_in" => 2592000
- "refresh_token" => "authusrB070ef1be4ccb4c98abd97ca781faaX41"
- "user_id" => "2088212325598416
- ]*/
- } else {
- /*error_response" => array:4 [
- "code" => "40002"
- "msg" => "Invalid Arguments"
- "sub_code" => "isv.code-invalid"
- "sub_msg" => "授权码code无效"
- ]*/
- \Log::debug('支付宝授权失败code:'.$result['error_response']['code']);
- return show_json(-3, '支付宝授权失败');
- }
- $redirect_url = $this->_getClientRequestUrl();
- redirect($redirect_url)->send();
- exit;
- //return show_json(1, Session::get('member_id'));
- }
- private function aopClient()
- {
- $alipay_set = \Setting::get('plugin.alipay_onekey_login');
- $aop = new AopClient;
- $aop->gatewayUrl = $this->alipay_api;
- $aop->appId = $alipay_set['app']['alipay_appid'];
- $aop->rsaPrivateKey = base64_decode($alipay_set['app']['private_key']);
- $aop->alipayrsaPublicKey = base64_decode($alipay_set['app']['alipay_public_key']);
- $aop->signType= $alipay_set['rsa'] == 1 ? 'RSA' : 'RSA2';
- $aop->apiVersion = '1.0';
- $aop->format = "json";
- $aop->postCharset = "UTF-8";
- return $aop;
- }
- /**
- * 根据access_token 获取用户信息
- * @param ))
- * @return 返回用户信息
- */
- protected function getUserInfo($access_token)
- {
- $request = new AlipayUserInfoShareRequest();
- $info = $this->aop->execute ($request,$access_token); //这里传入获取的access_token
- $responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
- $json_info = json_decode($info, true);
- if (!empty($json_info['error_response'])) {
- \Log::debug('支付宝获取用户信息失败code:'.$json_info['error_response']['code']);
- return show_json(-3, '支付宝授权失败');
- }
- return $json_info[$responseNode];
- }
- public function getFansModel($user_id)
- {
- $model = MemberAlipay::getUid($user_id);
- if (!is_null($model)) {
- $model->uid = $model->member_id;
- }
- return $model;
- }
- /**
- * 设置客户端请求地址
- *
- * @return string
- */
- private function _setClientRequestUrl()
- {
- if (\YunShop::request()->yz_redirect) {
- $yz_redirect = base64_decode(\YunShop::request()->yz_redirect);
- $redirect_url = $yz_redirect . '&t=' . time();
- /* if (preg_match('menu', $yz_redirect)) {
- $redirect_url = preg_replace('/menu/', 'redir_menu', $yz_redirect);
- } else {
- $redirect_url = preg_replace('/from=singlemessage/', 'redir_menu', $yz_redirect);
- }
- */
- Session::set('client_url', $redirect_url);
- } else {
- Session::set('client_url', '');
- }
- }
- /**
- * 获取客户端地址
- *
- * @return mixed
- */
- private function _getClientRequestUrl()
- {
- return Session::get('client_url');
- }
- /**
- * 构造获取token的url连接
- * @param string $callback 支付宝服务器回跳的url,需要url编码
- * @return 返回构造好的url
- */
- private function __CreateOauthUrlForCode($appId, $callback, $state = 'info')
- {
- //return $this->url."?app_id=".$appId."&scope=auth_userinfo&redirect_uri=".$callback."&state=".$state;
- return $this->url."?app_id=".$appId."&scope=auth_user&redirect_uri=".$callback."&state=".$state;
- }
- /**
- * 验证登录状态
- *
- * @return bool
- */
- public function checkLogged($login = null)
- {
- return MemberService::isLogged();
- }
- }
|