Login.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | ThinkAdmin
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2014~2019 广州楚才信息科技有限公司 [ http://www.cuci.cc ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://demo.thinkadmin.top
  8. // +----------------------------------------------------------------------
  9. // | 开源协议 ( https://mit-license.org )
  10. // +----------------------------------------------------------------------
  11. // | gitee 代码仓库:https://gitee.com/zoujingli/ThinkAdmin
  12. // | github 代码仓库:https://github.com/zoujingli/ThinkAdmin
  13. // +----------------------------------------------------------------------
  14. namespace app\api\controller;
  15. use AlibabaCloud\Client\AlibabaCloud;
  16. use AlibabaCloud\Client\Exception\ClientException;
  17. use AlibabaCloud\Client\Exception\ServerException;
  18. use app\api\controller\Base;
  19. use think\Db;
  20. use Firebase\JWT\JWT;
  21. use EasyWeChat\Factory;
  22. use think\route\RuleItem;
  23. /**
  24. * @title 登录
  25. * @controller Login
  26. * @group worker
  27. */
  28. class Login extends Base
  29. {
  30. /**
  31. * @title 用户协议
  32. * @desc 用户协议
  33. * @author QGF
  34. * @url /api/Login/agreement
  35. * @method GET
  36. * @tag 用户协议
  37. * @return name:-- type:string default:-- desc:用户协议内容(富文本)
  38. */
  39. public function agreement(){
  40. $this->success('获取成功',htmlspecialchars_decode(sysconf('agreement')));
  41. }
  42. /**
  43. * @title 隐私政策
  44. * @desc 隐私政策
  45. * @author QGF
  46. * @url /api/Login/privacy_policy
  47. * @method GET
  48. * @tag 隐私政策
  49. * @return name:-- type:string default:-- desc:隐私政策(富文本)
  50. */
  51. public function privacy_policy(){
  52. $this->success('获取成功',htmlspecialchars_decode(sysconf('privacy_policy')));
  53. }
  54. /**
  55. * @title 注册
  56. * @desc 注册
  57. * @author QGF
  58. * @url /api/Login/register
  59. * @method POST
  60. * @tag 注册
  61. * @param name:phone type:int require:1 default:-- desc:手机号
  62. * @param name:code type:int require:1 default:-- desc:短信验证码
  63. * @param name:pid type:int require:0 default:-- desc:邀请者ID(优惠券扫码注册)
  64. */
  65. public function register(){
  66. $phone = input('phone');
  67. $code = input('code');
  68. $pid = input('pid',0);
  69. if(empty($phone) || empty($code)){
  70. $this ->error('参数错误');
  71. }
  72. $sms_id = $this->verify_sms($phone,$code);
  73. if(empty($sms_id)){
  74. $this->error('验证码不正确');
  75. }
  76. $member_id = Db::name('store_member')->where('phone',$phone)->value('id');
  77. if(!empty($member_id)){
  78. $this->error('该手机号已被注册');
  79. }
  80. $data = array(
  81. 'phone'=>$phone,
  82. 'name' => substr($phone,-4),
  83. 'headimg' => 'https://zjth2021.oss-cn-beijing.aliyuncs.com/0909a49add201291/a20687c6493d3eab.jpg',
  84. 'pid' => $pid
  85. );
  86. Db::name('store_member')->insert($data);
  87. $member_id = Db::name('store_member')->where('phone',$phone)->value('id');
  88. //发放优惠券
  89. $this->send_coupon($member_id);
  90. Db::name('store_member_sms')->where('id',$sms_id)->update(array('used'=>1));
  91. $token = self::create_jwt($member_id);
  92. $this->success('注册成功',$token);
  93. }
  94. /**
  95. * @title 微信登录/授权
  96. * @desc 微信登录
  97. * @author QGF
  98. * @url /api/Login/we_chat_app
  99. * @method POST
  100. * @tag 登录 授权
  101. * @param name:code type:int require:1 default:-- desc:code值
  102. * @return name:-- type:json default:-- desc:微信注册返回授权后的信息(openid:微信openid,name:微信昵称,headimgurl:微信头像地址,token:token值(这时为空)注:仅微信注册有)
  103. * @return name:token type:string default:-- desc:用户微信登录成功后的token值(仅用户登录有)
  104. */
  105. public function we_chat_app(){
  106. $code = input('code');
  107. if(empty($code)){
  108. $this->error('参数错误');
  109. }
  110. $res = requestGet('https://api.weixin.qq.com/sns/oauth2/access_token?appid='.config('app_program')['app_id'].'&secret='.config('app_program')['secret'].'&code='.$code.'&grant_type=authorization_code');
  111. $res = json_decode($res,true);
  112. $user_info = requestGet('https://api.weixin.qq.com/sns/userinfo?access_token='.$res['access_token'].'&openid='.$res['openid']);
  113. $user_info = json_decode($user_info,true);
  114. $data['openid'] = $user_info['openid'];
  115. $data['name'] = $user_info['nickname'];
  116. $data['headimg'] = $user_info['headimgurl'];
  117. $data['token'] = '';
  118. $member_id = Db::name('store_member')->where('openid',$data['openid'])->value('id');
  119. if(empty($member_id)){
  120. $this->success('授权成功',$data);
  121. }else{
  122. $token = self::create_jwt($member_id);
  123. $data['token'] = $token;
  124. $this->success('登录成功',$data);
  125. }
  126. }
  127. /**
  128. * @title 验证码登录
  129. * @desc 验证码登录
  130. * @author QGF
  131. * @url /api/Login/code_login
  132. * @method POST
  133. * @tag 验证码登录
  134. * @param name:phone type:int require:1 default:-- desc:手机号
  135. * @param name:code type:string require:1 default:-- desc:短信验证码
  136. * @return name:token type:string default:-- desc:用户登录成功后的token值
  137. */
  138. public function code_login(){
  139. $phone = input('phone');
  140. $code = input('code');
  141. if(empty($phone) || empty($code)){
  142. $this ->error('参数错误');
  143. }
  144. $sms_id = $this->verify_sms($phone,$code);
  145. if(empty($sms_id)){
  146. $this->error('验证码不正确');
  147. }
  148. $member_id = Db::name('store_member')->where('phone',$phone)->value('id');
  149. if(empty($member_id)){
  150. $this->error('该手机号未注册');
  151. }
  152. $token = self::create_jwt($member_id);
  153. $this->success('登录成功',$token);
  154. }
  155. /**
  156. * @title 绑定手机号(点击微信登录时还没注册,绑定完手机号提交信息去注册)
  157. * @desc 绑定手机号
  158. * @author QGF
  159. * @url /api/Login/binding_phone
  160. * @method POST
  161. * @tag 绑定手机号
  162. * @param name:phone type:int require:1 default:-- desc:要绑定的手机号
  163. * @param name:code type:int require:1 default:-- desc:短信验证码
  164. * @param name:openid type:string require:1 default:-- desc:微信授权返回的openid
  165. * @param name:name type:string require:1 default:-- desc:微信授权返回的用户昵称
  166. * @param name:headimg type:string require:1 default:-- desc:微信授权返回的用户头像地址
  167. * @return name:token type:string default:-- desc:绑定成功后的token值
  168. */
  169. public function binding_phone(){
  170. $phone = input('phone');
  171. $code = input('code');
  172. $openid = input('openid');
  173. $name = input('name');
  174. $headimg = input('headimg');
  175. if(empty($phone) || empty($code) || empty($openid) || empty($name) || empty($headimg)){
  176. $this ->error('参数错误');
  177. }
  178. $sms_id = $this->verify_sms($phone,$code);
  179. if(empty($sms_id)){
  180. $this->error('验证码不正确');
  181. }
  182. $member_id = Db::name('store_member')->where('phone',$phone)->value('id');
  183. if(!$member_id){
  184. $data = array(
  185. 'phone'=>$phone,
  186. 'name' => $name,
  187. 'headimg' => $headimg,
  188. 'openid' => $openid
  189. );
  190. Db::name('store_member')->insert($data);
  191. $member_id = Db::name('store_member')->where('phone',$phone)->value('id');
  192. //发放优惠券
  193. $this->send_coupon($member_id);
  194. }else{
  195. Db::name('store_member')->where('id',$member_id)->update(array('openid'=>$openid));
  196. }
  197. Db::name('store_member_sms')->where('id',$sms_id)->update(array('used'=>1));
  198. $token = self::create_jwt($member_id);
  199. $this->success('绑定成功',$token);
  200. }
  201. //注册成功送优惠券
  202. public function send_coupon($uid){
  203. if(empty($uid)){
  204. return false;
  205. }
  206. $coupon_list = Db::name('store_coupon_config')->where('status',1)->where('is_deleted',0)->where('type',2)->select();
  207. if(empty($coupon_list)){
  208. return false;
  209. }
  210. foreach ($coupon_list as $value){
  211. $data = array(
  212. 'config_id' => $value['id'],
  213. 'user_id' => $uid,
  214. 'title' => $value['title'],
  215. 'low_amount' => $value['low_amount'],
  216. 'amount' => $value['amount'],
  217. 'is_new' => 1,
  218. 'start' => date('Y-m-d'),
  219. 'end' => date('Y-m-d', strtotime('+'.$value['low_day'].' days') )
  220. );
  221. Db::table('store_coupon_list')->insert($data);
  222. }
  223. return true;
  224. }
  225. /**
  226. * @title 发送短信验证码
  227. * @desc 发送短信验证码
  228. * @author QGF
  229. * @url /api/Login/send_sms
  230. * @method POST
  231. * @tag 短信验证码
  232. * @param name:phone type:int require:1 default:-- desc:要获取验证码的手机号
  233. * @return name:code type:string default:-- desc:验证码
  234. */
  235. public function send_sms(){
  236. $phone = input('phone');
  237. if(empty($phone)){
  238. $this ->error('参数错误');
  239. }
  240. $code = rand(0,9).rand(0,9).rand(0,9).rand(0,9);
  241. AlibabaCloud::accessKeyClient('LTAI5tSMNtYuD3TdEkM65fyp', 'lcmARfziFDS4PUJ0K7AKTf3Ytl3Z8O')->regionId('cn-hangzhou')->asDefaultClient();
  242. try {
  243. $result = AlibabaCloud::rpc()
  244. ->product('Dysmsapi')
  245. ->version('2017-05-25')
  246. ->action('SendSms')
  247. ->method('POST')
  248. ->host('dysmsapi.aliyuncs.com')
  249. ->options([
  250. 'query' => [
  251. 'RegionId' => "cn-hangzhou",
  252. 'PhoneNumbers' => $phone,
  253. 'SignName' => "唐山光速信息技术有限公司",
  254. 'TemplateCode' => "SMS_223005098",
  255. 'TemplateParam' => json_encode(array("code"=>$code)),
  256. ],
  257. ])->request();
  258. $result = $result->toArray();
  259. $sms_data = array(
  260. 'phone'=>$phone,
  261. 'code'=>$code,
  262. 'result'=>$result['Message']
  263. );
  264. Db::name('store_member_sms')->insert($sms_data);
  265. } catch (ClientException $e) {
  266. echo $e->getErrorMessage() . PHP_EOL;
  267. } catch (ServerException $e) {
  268. echo $e->getErrorMessage() . PHP_EOL;
  269. }
  270. $this->success('发送成功',$code);
  271. }
  272. //校验短信验证码
  273. public function verify_sms($phone = '',$code = ''){
  274. $store_member_sms = Db::name('store_member_sms')->field('id,code')->where('phone',$phone)->where('used',0)->order('id desc')->find();
  275. if($store_member_sms['code'] == $code){
  276. return $store_member_sms['id'];
  277. }else{
  278. return 0;
  279. }
  280. }
  281. //token加密
  282. public function create_jwt($uid)
  283. {
  284. $key = md5(config('app.jwt')); //jwt的签发密钥,验证token的时候需要用到
  285. $time = time(); //签发时间
  286. $expire = $time + config('app.jwt_time'); //过期时间
  287. $token = array(
  288. "uid" => $uid,
  289. "iss" => "https://zain.com",//签发组织
  290. "aud" => "https://zain.com", //签发作者
  291. "iat" => $time,
  292. "nbf" => $time,
  293. "exp" => $expire
  294. );
  295. $jwt = JWT::encode($token, $key);
  296. return $jwt;
  297. }
  298. public function get_token(){
  299. $goods_price = Db::name('store_goods_list')->where('goods_id',1)->where('goods_spec','like','%加急处理(5分钟急速响应)%')->where('goods_spec','like','%iphone11%')->value('price_market');
  300. var_dump($goods_price);exit();
  301. }
  302. }