admin/app/frontend/modules/member/services/MemberAlipayService.php

219 lines
6.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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();
}
}