basePath . "/utils/Alipay/alipaySdk/aop/AopClient.php";; class AuthForm extends \app\modules\client\models\ApiModel { public $store_id; public $authCode; public $isv_appid; public $response; public $mini_id; public $user_id; public $app_user_code; public $share_user_id; /** * @var SocialiteManager $socialite */ public $socialite; public function rules() { return [ [['store_id', 'share_user_id','mini_id', 'user_id'], 'integer'], [['authCode'], 'required'], [['authCode', 'response'], 'trim'], [['authCode', 'response','isv_appid'], 'string'], [['app_user_code'], 'safe'], ]; } /** * */ public function codeAnalysis() { if(is_isv()){ [$token, $aop, $auth_token] = $this->getToken($this->authCode); }else{ $token = $this->socialite->create('alipay')->tokenFromCode($this->authCode); } \Yii::warning($token); if (empty($token['user_id'])) { return [ 'code' => 1, 'msg' => '获取支付宝user_id失败' ]; } $data = []; $data['openid'] = $token['user_id']; if($this->app_user_code){ $user_id = cache()->get($this->app_user_code); cache()->delete($this->app_user_code); if(empty($user_id)){ return [ 'code' => 0, 'msg' => '获取app user_id失败', 'data' => $data, ]; } $user = User::findOne($user_id); $user->alipay_open_id = $data['openid']; $user->save(); $saas_user = SaasUser::findOne(['mobile' => $user->binding]); $saas_user->ali_user_id = $data['openid']; $saas_user->save(); $data['access_token'] = $saas_user['access_token']; } return [ 'code' => 0, 'data' => $data, 'msg' => 'ok' ]; } public function login() { if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0] ]; } $self_mini = Option::get('self_mini', $this->store_id, 'store', 0)['value']; if (\Yii::$app->prod_is_dandianpu() && !intval($self_mini)) { $token = $this->socialite->create('alipay')->userFromCode($this->authCode); $token = [ 'nick_name' => $token->getNickname(), 'user_id' => $token->getId(), 'avatar' => $token->getAvatar() ]; } else { [$token, $aop, $auth_token] = $this->getToken($this->authCode); $auth_time = (strtotime($token['auth_start']) + $token['expires_in']); if ($auth_time < time()) { [$token, $aop, $auth_token] = $this->getToken($this->authCode, 1, $token['refresh_token']); } $request = new AlipayUserInfoShareRequest(); $result = $aop->execute($request, $token['access_token'], $auth_token); $result = json_encode($result); $result = json_decode($result,true); \Yii::error($result); $token = $result['alipay_user_info_share_response']; if ((int)$token['code'] !== 10000) { return [ 'code' => 1, 'msg' => $token['msg'] ]; } } if ($this->user_id) { $user = User::findOne($this->user_id); if ($user) { if (isset($token['avatar'])) { $user->avatar_url = $token['avatar']; } if (isset($token['nick_name'])) { $user->nickname = $token['nick_name']; } if (isset($token['user_id'])) { $user->alipay_open_id = $token['user_id']; } $user->save(); $saasUser = SaasUser::findOne(['mobile' => $user->binding]); if ($saasUser) { if (isset($token['nick_name'])) { $saasUser->name = $token['nick_name']; } if (isset($token['avatar'])) { $saasUser->avatar = $token['avatar']; } if (isset($token['user_id'])) { $saasUser->ali_user_id = $token['user_id']; } $saasUser->save(); } } } return [ 'code' => 0, 'msg' => 'success', ]; } /** * 用户登录注册 * @return array|mixed|null */ public function analysisPhone() { \Yii::getLogger()->log("支付宝配置",Logger::LEVEL_ERROR); if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0] ]; } if(is_isv()){ [$token, $aop, $auth_token] = $this->getToken($this->authCode); $auth_time = (strtotime($token['auth_start']) + $token['expires_in']); if ($auth_time < time()) { [$token, $aop, $auth_token] = $this->getToken($this->authCode, 1, $token['refresh_token']); } $request = new AlipayUserInfoShareRequest(); $result = $aop->execute ($request, $token['access_token'], $auth_token); $result = json_encode($result); $result = json_decode($result,true); $token = $result['alipay_user_info_share_response']; if ((int)$token['code'] !== 10000) { return [ 'code' => 1, 'msg' => $token['msg'] ]; } }else{ $response = Json::decode($this->response); if (empty($response['response'])) { return [ 'code' => 1, 'msg' => 'response 不能为空' ]; } // 获取user_id $token = $this->socialite->create('alipay')->tokenFromCode($this->authCode); } if (empty($token['user_id'])) { return [ 'code' => 1, 'msg' => '获取user_id失败' ]; } $alipay_config = self::getAlipayConfig(); if (empty($alipay_config) && !is_isv()) { return [ 'code' => 1, 'msg' => '支付宝配置信息不能为空' ]; } $aes_key = $alipay_config['aes_key']; if(!is_isv()){ $result = openssl_decrypt(base64_decode($response['response']), 'AES-128-CBC', base64_decode($aes_key), OPENSSL_RAW_DATA); // 获取手机号解密 if (!$result) { return [ 'code' => 1, 'msg' => '解密失败' ]; } $res = Json::decode($result); if ($res['code'] != '10000') { $res['msg'] .= (string)$res['subMsg']; return $res; } $mobile = $res['mobile']; // 创建平台会员saas_user $saas_user = SaasUser::find()->where(['mobile' => $mobile, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])->one(); if (!$saas_user) { $saas_user = new SaasUser(); $saas_user->access_token = \Yii::$app->security->generateRandomString(); $saas_user->avatar = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png'; $saas_user->mobile = $mobile; $saas_user->name = substr_replace($mobile, '******', 3, 6); $saas_user->store_id = $this->store_id; $saas_user->ali_user_id = $token['user_id']; $saas_user->save(); } } if ($token['nick_name']) { $nick_name = $token['nick_name']; } else { if (!empty($mobile)) { $nick_name = substr_replace($mobile, '******', 3, 6); } else { $str = md5(time()); $nick_name = substr($str, 5, 8); } } $where = [ 'is_delete' => SaasUser::DELETE_STATUS_FALSE ]; if (!empty($mobile)) { $where['mobile'] = $mobile; } else { $where['ali_user_id'] = $token['user_id']; } // 创建平台会员saas_user $saas_user = SaasUser::find()->where($where)->one(); if (!$saas_user) { $saas_user = new SaasUser(); $saas_user->access_token = \Yii::$app->security->generateRandomString(); $saas_user->avatar = $token['avatar'] ?: (\Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png'); $saas_user->mobile = $mobile ?? ''; $saas_user->name = $nick_name; $saas_user->store_id = $this->store_id; $saas_user->ali_user_id = $token['user_id'] ?: ''; $saas_user->save(); } else { $saas_user->ali_user_id = $token['user_id'] ?: ''; $saas_user->save(); } $mobile = $saas_user->mobile; $where = [ 'store_id' => $this->store_id ]; if (!empty($mobile)) { $where['binding'] = $mobile; } else { $where['alipay_open_id'] = $token['user_id']; } $user = User::findOne($where); if (!$user) { $user = new User(); $user->type = User::USER_TYPE_NORMAL; $user->binding = $mobile ?? ''; $user->avatar_url = $token['avatar'] ?: \Yii::$app->request->hostInfo . '/web/v1/statics/images/avatar.png'; $user->username = \Yii::$app->security->generateRandomString(); $user->nickname = $nick_name; $user->password = \Yii::$app->security->generatePasswordHash(\Yii::$app->security->generateRandomString(), 5); $user->auth_key = \Yii::$app->security->generateRandomString(); $user->access_token = \Yii::$app->security->generateRandomString(); $user->is_delete = User::USER_NOT_DELETE; $user->alipay_open_id = $token['user_id'] ?: ''; $user->store_id = $this->store_id; $user->platform = User::USER_FROM_ALIPAY; // 支付宝 if (!$user->save()) { return [ 'code' => 1, 'msg' => '登录失败', 'data' => $user->getErrorSummary(false)[0] ]; } } else { if (empty($user->alipay_open_id)) { $user->alipay_open_id = $token['user_id']; $user->save(); } } $userAuditLog = UserAuditLog::findOne(['user_id' => $user->id, 'is_delete' => 0]); if (!$userAuditLog) { $userAuditLog = UserAuditLog::findOne(['ali_user_id' => $user->alipay_open_id, 'is_delete' => 0]); if (!empty($userAuditLog)) { $userAuditLog->user_id = $user->id; $userAuditLog->save(); } } if ($user->blacklist == '1') { return [ 'code' => 1, 'msg' => '您的账号已被限制登录!', ]; } $share = $share_user = null; if ($this->share_user_id > 0) { // 绑定上下级 $bindForm = new BindForm(); $bindForm->store_id = $this->store_id; $bindForm->user_id = $user->id; $bindForm->parent_id = $this->share_user_id; $bindForm->condition = 0; $bindForm->save(); } if ($user->parent_id > 0) { $share = Share::findOne(['user_id' => $user->parent_id]); $share_user = User::findOne(['id' => $share->user_id]); } $data = [ 'nickname' => $saas_user->name, 'binding' => $saas_user->mobile, 'id' => $user->id, 'is_distributor' => $user->is_distributor ? $user->is_distributor : 0, 'avatar_url' => $saas_user->avatar, 'errCode' => 0, 'parent' => $share ? ($share->name ? $share->name : $share_user->nickname) : '总店', 'money' => $user->money ? $user->money : 0, 'blacklist' => $user->blacklist ? $user->blacklist : 0, 'access_token' => $saas_user->access_token, 'level' => $user->level ? $user->level : -1, 'is_clerk' => $user->is_clerk === null ? 0 : $user->is_clerk, 'integral' => $user->integral === null ? 0 : $user->integral, 'is_saas_clerk' => (int)$user->is_saas_clerk, ]; return [ 'code' => 0, 'msg' => '登录成功', 'data' => $data, ]; } public function getToken($code, $type = 0, $refresh_token = '') { if ($type === 0) { $auth = 'authorization_code'; } else { $auth = 'refresh_token'; } $aop = new AopClient(); if(is_open_platform()){ $aop->appId = Option::get("alipay_appid",0,'saas')['value'];; $aop->rsaPrivateKey = Option::get("alipay_app_private_key",0,'saas')['value']; $aop->alipayrsaPublicKey=Option::get("alipay_public_key",0,'saas')['value']; }else{ $value = Option::get(Option::OPTOPN_KEY, get_store_id(), 'alipay')['value']; $conf = json_decode($value, true); $aop->appId = $conf['app_id']; $aop->rsaPrivateKey = $conf['app_private_key']; $aop->alipayrsaPublicKey = $conf['alipay_public_key']; } $aop->apiVersion = '1.0'; $aop->signType = "RSA2"; $aop->postCharset="utf-8"; $aop->format='json'; $request = new AlipaySystemOauthTokenRequest(); $request->setGrantType($auth); $request->setCode($code); if ($type !== 0) { $request->setRefreshToken($refresh_token); } $auth_token = Option::get("ali_template_token",0,'saas')['value']; if(!empty($this->mini_id)){ $mini = StoreAliMini::findOne($this->mini_id); $auth_token = !empty($mini->auth_token)?$mini->auth_token:$auth_token; } $result = $aop->execute ($request, null, $auth_token); //第三方应用代小程序模板调用接口必须传入 $result = json_encode($result); $result = json_decode($result,true); $token = $result['alipay_system_oauth_token_response']; return [ $token, $aop, $auth_token ]; } }