Login.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 会员管理中心
  7. */
  8. namespace app\system\controller\passport;
  9. use app\common\facade\Alisms;
  10. use app\common\event\Passport;
  11. use app\common\model\SystemApis;
  12. use app\common\model\SystemMember;
  13. use app\common\model\SystemMemberMiniapp;
  14. use app\common\model\SystemMemberCloud;
  15. use Yurun\Util\HttpRequest;
  16. class Login extends Common{
  17. /**
  18. * 会员首页
  19. */
  20. public function index(){
  21. if(request()->isPost()){
  22. $data = [
  23. '__token__' => $this->request->param('__token__/s'),
  24. 'captcha' => $this->request->param('captcha/s'),
  25. 'login_id' => $this->request->param('login_id/s'),
  26. 'login_password' => $this->request->param('login_password/s'),
  27. ];
  28. $validate = $this->validate($data,'Member.login');
  29. if(true !== $validate){
  30. return json(['code'=>0,'message'=>$validate]);
  31. }
  32. $result = SystemMember::login($data);
  33. if($result){
  34. Passport::clearMiniapp();
  35. Passport::setlogout();
  36. //判断是不是子管理员
  37. $condition['is_lock'] = 0;
  38. if($result->bind_member_miniapp_id && $result->parent_id){
  39. $condition['id'] = $result->bind_member_miniapp_id;
  40. $condition['member_id'] = $result->parent_id;
  41. }else{
  42. $condition['member_id'] = $result->id;
  43. }
  44. $miniapp = SystemMemberMiniapp::where($condition)->order('id desc')->find();
  45. if(!empty($miniapp)){
  46. $param = [
  47. 'member_id' => $result->parent_id,
  48. 'miniapp_id' => $miniapp->miniapp_id,
  49. 'member_miniapp_id' => $miniapp->id,
  50. ];
  51. Passport::setMiniapp($param);
  52. }
  53. Passport::setLogin($result);
  54. return json(['code'=>200,'message'=>'登录成功','url' => url('system/passport.Index/index')]);
  55. }else{
  56. return json(['code'=>0,'message'=>'密码错误或账户已被锁定']);
  57. }
  58. }else{
  59. $wechataccount = SystemApis::Config('wechataccount');
  60. $view['wechataccount'] = empty($wechataccount) || $wechataccount['qrcode_login'] == 0 ? 0 : 1;
  61. return view('passport/login/index')->assign($view);
  62. }
  63. }
  64. /**
  65. * 腾讯云市场登录
  66. * @return void
  67. */
  68. public function cloud(){
  69. $code = $this->request->param('code');
  70. $signature = $this->request->param('signature');
  71. $config = SystemApis::config('wechatcloud');
  72. if(empty($config) || empty($this->web)){
  73. return $this->error('腾讯云授权配置错误,请联系客服.');
  74. }
  75. if(md5($code.$config['encry_key']) != $signature){
  76. return redirect('https://www.qcloud.com/open/authorize?scope=login&app_id='.$config['app_id'].'&redirect_url=https://'.$this->web->url.'/system/passport/cloud.html');
  77. }
  78. $http = new HttpRequest;
  79. $strsign = [
  80. 'SecretId' => $config['secret_id'],
  81. 'Action' => 'GetUserAccessToken',
  82. 'SignatureMethod' => 'HmacSHA1',
  83. 'Nonce' => getcode(5),
  84. 'Timestamp' => time(),
  85. 'userAuthCode' => $code,
  86. 'Region' =>'ap-beijing'
  87. ];
  88. ksort($strsign);
  89. $str = [];
  90. foreach ($strsign as $key=>$value) {
  91. if (isset($value) && !empty($value)) {
  92. $str[] = $key."=".trim($value);
  93. }
  94. }
  95. $paramstring = "GETopen.api.qcloud.com/v2/index.php?".join("&", $str);
  96. $signStr = base64_encode(hash_hmac('sha1', $paramstring, $config['secret_key'], true));
  97. $strsign['Signature'] = $signStr;
  98. $response = $http->get('https://open.api.qcloud.com/v2/index.php',$strsign);
  99. $json = json_decode($response->body());
  100. if($json->code != 0){
  101. return redirect('https://www.qcloud.com/open/authorize?scope=login&app_id='.$config['app_id'].'&redirect_url=https://'.$this->web->url.'/system/passport/cloud.html');
  102. }
  103. Passport::clearMiniapp();
  104. Passport::setlogout();
  105. $userinfo = [];
  106. $userCloud = SystemMemberCloud::where(['openId' => $json->data->userOpenId])->find();
  107. if(!empty($userCloud)){
  108. $userinfo = SystemMember::where(['id' => $userCloud->member_id])->find();
  109. }
  110. if(empty($userCloud) && empty($userinfo)){
  111. $data['username'] = '腾讯云'.getcode(5);
  112. $data['password'] = password_hash(md5($json->data->userOpenId),PASSWORD_DEFAULT);
  113. $data['safe_password'] = password_hash(md5('123456'),PASSWORD_DEFAULT);
  114. $data['login_time'] = time();
  115. $data['login_ip'] = request()->ip();
  116. $data['update_time'] = time();
  117. $data['create_time'] = time();
  118. $userinfo = SystemMember::create($data);
  119. if($userinfo){
  120. SystemMemberCloud::create(['member_id'=>$userinfo->id,'openId'=>$json->data->userOpenId,'unionId'=>$json->data->userUnionId,'create_time'=> time()]);
  121. }
  122. }else{
  123. $condition['is_lock'] = 0;
  124. $condition['member_id'] = $userinfo->id;
  125. $miniapp = SystemMemberMiniapp::where($condition)->order('id desc')->find();
  126. if(!empty($miniapp)){
  127. $param = [
  128. 'member_id' => $userinfo->parent_id,
  129. 'miniapp_id' => $miniapp->miniapp_id,
  130. 'member_miniapp_id' => $miniapp->id,
  131. ];
  132. Passport::setMiniapp($param);
  133. }
  134. }
  135. Passport::setLogin($userinfo);
  136. return redirect(url('system/passport.Index/index'));
  137. }
  138. /**
  139. * 会员注册
  140. */
  141. public function reg(){
  142. if(request()->isPost()){
  143. $data = [
  144. 'captcha' => $this->request->param('captcha/s'),
  145. 'phone_id' => $this->request->param('phone_id/s'),
  146. 'login_password' => $this->request->param('login_password/s'),
  147. 'sms_code' => $this->request->param('sms_code/s'),
  148. 'username' => $this->request->param('username/s'),
  149. ];
  150. $validate = $this->validate($data,'Member.reg');
  151. if(true !== $validate){
  152. return json(['code'=>0,'message'=>$validate]);
  153. }
  154. $result = SystemMember::reg($data);
  155. if($result['code'] == 200){
  156. $userinfo = SystemMember::where(['id' => $result['data']['id']])->find();
  157. Passport::clearMiniapp();
  158. Passport::setlogout();
  159. Passport::setLogin($userinfo);
  160. return json(['code'=>200,'message'=>'注册成功','url' => url('system/passport.Index/index')]);
  161. }else{
  162. return json($result);
  163. }
  164. }else{
  165. return view('passport/login/reg');
  166. }
  167. }
  168. /**
  169. * 忘记密码
  170. */
  171. public function getPassword(){
  172. if(request()->isPost()){
  173. $data = [
  174. 'captcha' => $this->request->param('captcha/s'),
  175. 'phone_id' => $this->request->param('phone_id/s'),
  176. 'login_password' => $this->request->param('login_password/s'),
  177. 'sms_code' => $this->request->param('sms_code/s'),
  178. ];
  179. $validate = $this->validate($data,'Member.getpasspord');
  180. if(true !== $validate){
  181. return json(['code'=>0,'message'=>$validate]);
  182. }
  183. //判断验证码
  184. if(!Alisms::isSms($data['phone_id'],$data['sms_code'])){
  185. return json(['code'=>0,'message'=>"验证码错误"]);
  186. }
  187. //验证码通过
  188. $result = SystemMember::getPasspord($data);
  189. if($result){
  190. Passport::clearMiniapp();
  191. Passport::setlogout();
  192. return json(['code'=>200,'message'=>'密码重置成功','url' => url('system/passport.Login/index')]);
  193. }else{
  194. return json(['code'=>0,'message'=>'密码重置失败']);
  195. }
  196. }else{
  197. return view('passport/login/getpassword');
  198. }
  199. }
  200. /**
  201. * 会员退出
  202. */
  203. public function logout(){
  204. Passport::setlogout();
  205. Passport::clearMiniapp();
  206. $this->redirect('system/passport.Login/index');
  207. }
  208. /**
  209. * 获取注册验证码
  210. */
  211. public function getRegSms(){
  212. if(request()->isPost()){
  213. $data = [
  214. 'phone_id' => $this->request->param('phone/s')
  215. ];
  216. $validate = $this->validate($data,'Sms.getsms');
  217. if(true !== $validate){
  218. return json(['code'=>0,'message'=>$validate]);
  219. }
  220. $user = SystemMember::where(['phone_id' => $data['phone_id']])->find();
  221. if(isset($user)) {
  222. return json(['code'=>0,'message' => "手机已被注册"]);
  223. }
  224. $sms = Alisms::putSms($data['phone_id']);
  225. return json($sms);
  226. }else{
  227. return $this->error("404 NOT FOUND");
  228. }
  229. }
  230. /**
  231. * 获取登录/找回密码等验证码
  232. */
  233. public function getLoginSms(){
  234. if(request()->isPost()){
  235. $data = [
  236. 'phone_id' => $this->request->param('phone/s')
  237. ];
  238. $validate = $this->validate($data,'Sms.getsms');
  239. if(true !== $validate){
  240. return json(['code'=>0,'message'=>$validate]);
  241. }
  242. //判断是否登录
  243. $getuser = Passport::getUser();
  244. if($getuser){
  245. if($data['phone_id'] != $getuser['phone_id']){
  246. return json(['code'=>0,'message'=>"请确认手机号输入正确"]);
  247. }
  248. }
  249. $user = SystemMember::where(['phone_id' => $data['phone_id']])->find();
  250. if(empty($user)) {
  251. return json(['code'=>0,'message'=>"用户不存在"]);
  252. }
  253. $sms = Alisms::putSms($data['phone_id']);
  254. return json($sms);
  255. }else{
  256. return $this->error("404 NOT FOUND");
  257. }
  258. }
  259. }