AuthForm_Copy.php 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\client\models\v1\alipay;
  8. use app\models\User;
  9. use app\modules\admin\models\AlipayThirdForm;
  10. use app\utils\Alipay\Alipay;
  11. use Overtrue\Socialite\SocialiteManager;
  12. use yii\base\BaseObject;
  13. use yii\base\Model;
  14. use yii\helpers\Json;
  15. use app\models\SaasUser;
  16. use app\modules\client\models\v1\BindForm;
  17. use app\models\Share;
  18. use yii\log\Logger;
  19. use app\utils\Alipay\alipaySdk\aop\request\AlipaySystemOauthTokenRequest;
  20. use AopClient;
  21. use app\models\StoreAliMini;
  22. use app\models\Option;
  23. include_once "./utils/Alipay/alipaySdk/aop/AopClient.php";
  24. class AuthForm extends \app\modules\client\models\ApiModel
  25. {
  26. public $store_id;
  27. public $authCode;
  28. public $isv_appid;
  29. public $response;
  30. public $mini_id;
  31. public $share_user_id;
  32. /**
  33. * @var SocialiteManager $socialite
  34. */
  35. public $socialite;
  36. public function rules()
  37. {
  38. return [
  39. [['store_id', 'share_user_id','mini_id'], 'integer'],
  40. [['authCode', 'response'], 'required'],
  41. [['authCode', 'response'], 'trim'],
  42. [['authCode', 'response','isv_appid'], 'string']
  43. ];
  44. }
  45. /**
  46. *
  47. */
  48. public function codeAnalysis()
  49. {
  50. $user = $this->socialite->create('alipay')->tokenFromCode($this->authCode);
  51. \Yii::warning($user);
  52. }
  53. /**
  54. * 用户登录注册
  55. * @return array|mixed|null
  56. */
  57. public function analysisPhone()
  58. {
  59. \Yii::getLogger()->log("支付宝配置",Logger::LEVEL_ERROR);
  60. if (!$this->validate()) {
  61. return [
  62. 'code' => 1,
  63. 'msg' => $this->getErrorSummary(false)[0]
  64. ];
  65. }
  66. $response = Json::decode($this->response);
  67. if (empty($response['response'])) {
  68. return [
  69. 'code' => 1,
  70. 'msg' => 'response 不能为空'
  71. ];
  72. }
  73. if(is_isv()){
  74. $aop = new AopClient();
  75. // $store = StoreAliMini::find()->where(['id'=>$this->mini_id])->one();
  76. $aop->appId = Option::get("alipay_appid",0,'saas')['value'];;
  77. $aop->rsaPrivateKey = Option::get("alipay_app_private_key",0,'saas')['value'];
  78. $aop->alipayrsaPublicKey=Option::get("alipay_public_key",0,'saas')['value'];
  79. $aop->apiVersion = '1.0';
  80. $aop->signType = "RSA2";
  81. $aop->postCharset="utf-8";
  82. $aop->format='json';
  83. $request = new AlipaySystemOauthTokenRequest();
  84. $request->setGrantType("authorization_code");
  85. $request->setCode($this->authCode);
  86. $auth_token = Option::get("ali_template_token",0,'saas')['value'];
  87. if(!empty($this->mini_id)){
  88. $mini = StoreAliMini::findOne($this->mini_id);
  89. $auth_token = !empty($mini->auth_token)?$mini->auth_token:$auth_token;
  90. }
  91. $result = $aop->execute ($request, null, $auth_token); //第三方应用代小程序模板调用接口必须传入
  92. $result = json_encode($result);
  93. $result = json_decode($result,true);
  94. $token = $result['alipay_system_oauth_token_response'];
  95. }else{
  96. // 获取user_id
  97. $token = $this->socialite->create('alipay')->tokenFromCode($this->authCode);
  98. }
  99. \Yii::getLogger()->log($token,Logger::LEVEL_ERROR);
  100. if (empty($token['user_id'])) {
  101. return [
  102. 'code' => 1,
  103. 'msg' => '获取user_id失败'
  104. ];
  105. }
  106. $alipay_config = self::getAlipayConfig();
  107. if (empty($alipay_config) && !is_isv()) {
  108. return [
  109. 'code' => 1,
  110. 'msg' => '支付宝配置信息不能为空'
  111. ];
  112. }
  113. $aes_key = $alipay_config['aes_key'];
  114. if(is_isv()){
  115. $aes_key = Option::get("ali_template_aes",0,'saas')['value'];//支付宝三方小程序模板AES密钥
  116. if(!empty($this->mini_id)){
  117. $mini = StoreAliMini::findOne($this->mini_id);
  118. $aes_key = !empty($mini->aes_key)?$mini->aes_key:$aes_key;
  119. }
  120. }
  121. $result = openssl_decrypt(base64_decode($response['response']), 'AES-128-CBC', base64_decode($aes_key), OPENSSL_RAW_DATA);
  122. // 获取手机号解密
  123. if (!$result) {
  124. return [
  125. 'code' => 1,
  126. 'msg' => '解密失败'
  127. ];
  128. }
  129. $res = Json::decode($result);
  130. if ($res['code'] != '10000') {
  131. return $res;
  132. }
  133. $mobile = $res['mobile'];
  134. // 创建平台会员saas_user
  135. $saas_user = SaasUser::find()->where(['mobile' => $mobile, 'is_delete' => SaasUser::DELETE_STATUS_FALSE])->one();
  136. if (!$saas_user) {
  137. $saas_user = new SaasUser();
  138. $saas_user->access_token = \Yii::$app->security->generateRandomString();
  139. $saas_user->avatar = \Yii::$app->request->hostInfo . \Yii::$app->request->baseUrl . '/web/v1/statics/images/avatar.png';
  140. $saas_user->mobile = $mobile;
  141. $saas_user->name = substr_replace($mobile, '****', 3, 4);
  142. $saas_user->store_id = $this->store_id;
  143. $saas_user->save();
  144. }
  145. $user = User::findOne(['store_id' => $this->store_id, 'binding' => $mobile]);
  146. if (!$user) {
  147. $user = new User();
  148. $user->type = User::USER_TYPE_NORMAL;
  149. $user->binding = $mobile;
  150. $user->avatar_url = \Yii::$app->request->hostInfo . '/web/v1/statics/images/avatar.png';
  151. $user->username = \Yii::$app->security->generateRandomString();
  152. $user->nickname = substr_replace($mobile, '******', 3, 2);
  153. $user->password = \Yii::$app->security->generatePasswordHash(\Yii::$app->security->generateRandomString(), 5);
  154. $user->auth_key = \Yii::$app->security->generateRandomString();
  155. $user->access_token = \Yii::$app->security->generateRandomString();
  156. $user->is_delete = User::USER_NOT_DELETE;
  157. $user->alipay_open_id = $token['user_id'];
  158. $user->store_id = $this->store_id;
  159. $user->platform = User::USER_FROM_ALIPAY; // 支付宝
  160. if (!$user->save()) {
  161. return [
  162. 'code' => 1,
  163. 'msg' => '登录失败',
  164. 'data' => $user->getErrorSummary(false)[0]
  165. ];
  166. }
  167. } else {
  168. if (empty($user->alipay_open_id)) {
  169. $user->alipay_open_id = $token['user_id'];
  170. $user->save();
  171. }
  172. }
  173. if ($user->blacklist == '1') {
  174. return [
  175. 'code' => 1,
  176. 'msg' => '您的账号已被限制登录!',
  177. ];
  178. }
  179. $share = $share_user = null;
  180. if ($this->share_user_id > 0) {
  181. // 绑定上下级
  182. $bindForm = new BindForm();
  183. $bindForm->store_id = $this->store_id;
  184. $bindForm->user_id = $user->id;
  185. $bindForm->parent_id = $this->share_user_id;
  186. $bindForm->condition = 0;
  187. $bindForm->save();
  188. }
  189. if ($user->parent_id > 0) {
  190. $share = Share::findOne(['user_id' => $user->parent_id]);
  191. $share_user = User::findOne(['id' => $share->user_id]);
  192. }
  193. $data = [
  194. 'nickname' => $saas_user->name,
  195. 'binding' => $saas_user->mobile,
  196. 'id' => $user->id,
  197. 'is_distributor' => $user->is_distributor ? $user->is_distributor : 0,
  198. 'avatar_url' => $saas_user->avatar,
  199. 'errCode' => 0,
  200. 'parent' => $share ? ($share->name ? $share->name : $share_user->nickname) : '总店',
  201. 'money' => $user->money ? $user->money : 0,
  202. 'blacklist' => $user->blacklist ? $user->blacklist : 0,
  203. 'access_token' => $saas_user->access_token,
  204. 'level' => $user->level ? $user->level : -1,
  205. 'is_clerk' => $user->is_clerk === null ? 0 : $user->is_clerk,
  206. 'integral' => $user->integral === null ? 0 : $user->integral,
  207. 'is_saas_clerk' => (int)$user->is_saas_clerk,
  208. ];
  209. return [
  210. 'code' => 0,
  211. 'msg' => '登录成功',
  212. 'data' => $data,
  213. ];
  214. }
  215. }