| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440 |
- <?php
- /**
- * 重庆赤晓店信息科技有限公司
- * https://www.chixiaodian.com
- * Copyright (c) 2023 赤店商城 All rights reserved.
- */
- namespace app\modules\client\models\v1\alipay;
- use app\models\User;
- use app\models\UserAuditLog;
- use app\modules\admin\models\AlipayThirdForm;
- use app\utils\Alipay\Alipay;
- use app\utils\Alipay\alipaySdk\aop\request\AlipayUserInfoShareRequest;
- use Overtrue\Socialite\SocialiteManager;
- use yii\base\BaseObject;
- use yii\base\Model;
- use yii\helpers\Json;
- use app\models\SaasUser;
- use app\modules\client\models\v1\BindForm;
- use app\models\Share;
- use yii\log\Logger;
- use app\utils\Alipay\alipaySdk\aop\request\AlipaySystemOauthTokenRequest;
- use AopClient;
- use app\models\StoreAliMini;
- use app\models\Option;
- include_once \Yii::$app->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
- ];
- }
- }
|