WechatController.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Http\Requests\WechatRequest;
  4. use App\Models\DWBSUser;
  5. use App\Models\Enroll;
  6. use App\Models\Popover;
  7. use App\Models\User;
  8. use EasyWeChat\Factory;
  9. use Illuminate\Support\Facades\DB;
  10. use App\Handlers\JudegeHandler;
  11. use App\Models\Basic;
  12. use Carbon\Carbon;
  13. use Illuminate\Support\Facades\Auth;
  14. use Illuminate\Http\Request;
  15. use Illuminate\Support\Facades\Cache;
  16. use Illuminate\Support\Facades\Log;
  17. use GuzzleHttp\Client;
  18. use Overtrue\LaravelWeChat\Facade as EasyWeChat;
  19. class WechatController extends Controller
  20. {
  21. public function login(WechatRequest $request, JudegeHandler $handler)
  22. {
  23. if ($request->has('openid')) {
  24. if ($request->openid != 123) {
  25. $user = User::where('openid', $request->openid)->first();
  26. if (!$user) {
  27. if ($request->has('id')) {
  28. Log::error($request->get('openid') . '<==>' . '{TEST}' . $request->get('id'));
  29. }
  30. return $this->response()->array([
  31. 'code' => 300,
  32. 'msg' => '没有绑定手机号',
  33. ]);
  34. }
  35. if ($user->township == null) {
  36. if ($request->has('latitude')) {
  37. if ($request->latitude != '') {
  38. $key='926f74d687d39c232ca67606a93fcefa';
  39. $lat=$request->latitude;
  40. $lon=$request->longitude;
  41. $arr=['lon'=>$lon,'lat'=>$lat,'ver'=>1];
  42. $url='https://api.tianditu.gov.cn/geocoder?postStr='.json_encode($arr,true).'&type=geocode&tk='.$key;
  43. $client = new Client();
  44. $response = $client->request('GET', $url);
  45. $ad = json_decode($response->getBody()->getContents());
  46. Log::error('{--weizhi--}' . json_encode($ad));
  47. try {
  48. if ($ad->status == 0 && $ad->msg == 'ok') {
  49. $s['province'] = $ad->result->addressComponent->province;
  50. $s['city'] = $ad->result->addressComponent->city == null ? $ad->result->addressComponent->county : $ad->result->addressComponent->city;
  51. $s['area'] = $ad->result->addressComponent->county;
  52. $s['township'] = $ad->result->addressComponent->address;
  53. DB::table('user')->where('openid', $request->openid)->update($s);
  54. }
  55. } catch (\Exception $exception) {
  56. Log::error('(-----位置出错----)' . $request->openid);
  57. }
  58. }
  59. }
  60. }
  61. $openid = ['openid' => $request->openid];
  62. $token = Auth::guard('api')->fromUser($user);
  63. $token = ['token' => $token];
  64. $user_info = $this->user_info($user->id);//获取用户的基本信息
  65. $user_status = $handler->judege();//获取此时处于哪个阶段
  66. $user_status = ['status' => $user_status];
  67. $user_data = array_merge($user_info, $user_status, $token, $openid);
  68. return $this->response()->array([
  69. 'code' => 200,
  70. 'msg' => 'ok',
  71. 'data' => $user_data
  72. ]);
  73. } else {
  74. Log::error('{-------第一步----}');
  75. $code = $request->code;
  76. Log::error('{-------第二步----}' . $code);
  77. $header_type=$request->header('type');
  78. Log::error('headerType'.$header_type);
  79. if ($header_type){
  80. $config = [
  81. 'app_id' => 'wxa9d1325fd98f5a7d',
  82. 'secret' => 'b8cd4371804815530a1e1134e83a9488',
  83. 'log' => [
  84. 'level' => 'debug',
  85. 'file' => __DIR__.'/wechat.log',
  86. ],
  87. ];
  88. }else{
  89. $config = [
  90. 'app_id' => 'wx0348d5a266f867a3',
  91. 'secret' => 'c383d63a939a0d686e7b13b284a00bec',
  92. 'log' => [
  93. 'level' => 'debug',
  94. 'file' => __DIR__.'/wechat.log',
  95. ],
  96. ];
  97. }
  98. $miniProgram=Factory::miniProgram($config);
  99. //下面两句加上就正常了
  100. // $cache = new \Symfony\Component\Cache\Simple\FilesystemCache('', 0, storage_path('framework/cache/data'));
  101. // $miniProgram->rebind('cache', $cache);
  102. // $miniProgram=EasyWeChat::miniProgram();
  103. // $miniProgram = app('wechat.mini_program');
  104. $data = $miniProgram->auth->session($code);
  105. // Log::error();
  106. Log::error('{-------第三步----}' . json_encode($data));
  107. if (isset($data['errcode'])) {
  108. return $this->error(401,$data);
  109. }
  110. Log::error('{-------第四步----}' . $data['openid']);
  111. if ($header_type){
  112. $id=$request->input('HeaderID');
  113. if ($id){
  114. $user=User::find($id);
  115. if (!$user){
  116. return $this->response()->array([
  117. 'code' => 300,
  118. 'msg' => '没有绑定手机号',
  119. 'data' => [
  120. 'openid' => $data['openid']
  121. ]
  122. ]);
  123. }
  124. $user->openid=$data['openid'];
  125. $user->save();
  126. }else{
  127. $user = User::where('openid', $data['openid'])->first();
  128. $user1=[];
  129. }
  130. }else{
  131. $user = User::where('openid', $data['openid'])->first();
  132. // Log::error('{-------第五步----}' . json_encode($user));
  133. if (isset($data['unionid'])){
  134. $user1 = DB::connection('mysql_dwbs')->table('users')->where('unionid',$data['unionid'])->whereBetween('cert_status',[3,6])->first();
  135. }else{
  136. $user1=[];
  137. }
  138. }
  139. if (!$user && !$user1) {
  140. return $this->response()->array([
  141. 'code' => 300,
  142. 'msg' => '没有绑定手机号',
  143. 'data' => [
  144. 'openid' => $data['openid']
  145. ]
  146. ]);
  147. }
  148. if (!$user){
  149. $userss=User::where('phone',$user1->mobile)->first();
  150. if ($userss){
  151. return $this->response()->array([
  152. 'code' => 300,
  153. 'msg' => '没有绑定手机号',
  154. 'data' => [
  155. 'openid' => $data['openid']
  156. ]
  157. ]);
  158. }
  159. $user=new User();
  160. $user->openid=$data['openid'];
  161. $user->unionid=$data['unionid'];
  162. $user->phone=$user1->mobile;
  163. $user->dwbs_id=$user1->id;
  164. if ($user1->level!=3){
  165. $a_user=DB::connection('mysql_dwbs')->table('users')->where('id',$user1->agent_id)->first();
  166. if ($a_user->level!=3){
  167. $a_user=DB::connection('mysql_dwbs')->table('users')->where('id',$a_user->agent_id)->first();
  168. }
  169. $re=DB::table('service')->where('phone',$a_user->mobile)->first();
  170. $user->war_names=$re->war_names;
  171. }else{
  172. $re=DB::table('service')->where('phone',$user1->mobile)->first();
  173. $user->war_names=$re->war_names;
  174. }
  175. $user->avatar=$user1->headimgurl;
  176. $user->nickname=$user1->nickname;
  177. $user->save();
  178. $user=User::find($user->id);
  179. }else{
  180. try{
  181. if ($request->input('nickname')){
  182. $user->nickname=$request->input('nickname');
  183. $user->avatar=$request->input('avatar');
  184. $user->save();
  185. }
  186. }catch (\Exception $exception){
  187. }
  188. }
  189. try{
  190. if ($user->township == null) {
  191. if ($request->has('latitude')) {
  192. if ($request->latitude != '') {
  193. $key='926f74d687d39c232ca67606a93fcefa';
  194. $lat=$request->latitude;
  195. $lon=$request->longitude;
  196. $arr=['lon'=>$lon,'lat'=>$lat,'ver'=>1];
  197. $url='https://api.tianditu.gov.cn/geocoder?postStr='.json_encode($arr,true).'&type=geocode&tk='.$key;
  198. $client = new Client();
  199. $response = $client->request('GET', $url);
  200. $ad = json_decode($response->getBody()->getContents());
  201. try {
  202. if ($ad->status == 0 && $ad->msg == 'ok') {
  203. $s['province'] = $ad->result->addressComponent->province;
  204. $s['city'] = $ad->result->addressComponent->city == null ? $ad->result->addressComponent->county : $ad->result->addressComponent->city;
  205. $s['area'] = $ad->result->addressComponent->county;
  206. $s['township'] = $ad->result->addressComponent->address;
  207. DB::table('user')->where('openid', $data['openid'])->update($s);
  208. }
  209. } catch (\Exception $exception) {
  210. Log::error('(-----位置出错----)' . $data['openid']);
  211. }
  212. }
  213. }
  214. }
  215. }catch (\Exception $exception){
  216. Log::error('保存地址出错======'.$exception);
  217. }
  218. try{
  219. if (isset($data['unionid'])){
  220. $user->unionid=$data['unionid'];
  221. $user->save();
  222. }
  223. }catch (\Exception $exception){
  224. Log::error('保存Unionid出错');
  225. }
  226. // DB::table('user')->where('id', $user->id)->update(['avatar' => $request->avatar, 'nickname' => $request->nickname]);
  227. $token = Auth::guard('api')->fromUser($user);
  228. $openid = ['openid' => $user->openid];
  229. $token = ['token' => $token];
  230. $user_info = $this->user_info($user->id);//获取用户的基本信息
  231. $user_status = $handler->judege();//获取此时处于哪个阶段
  232. $user_status = ['status' => $user_status];
  233. $user_data = array_merge($user_info, $user_status, $token, $openid);
  234. return $this->response()->array([
  235. 'code' => 200,
  236. 'message' => 'ok',
  237. 'data' => $user_data
  238. ]);
  239. }
  240. }
  241. }
  242. public function user_info($id)
  243. {
  244. $handler = new JudegeHandler();
  245. $time = Carbon::today();//现在的时间
  246. $basic=DB::table('basic')->get();
  247. foreach ($basic as $k=>$v){
  248. $re[$v->keys]=$v->value;
  249. }
  250. $season=$re['season'];
  251. $now = Carbon::now()->timestamp;
  252. $user_data = DB::table('user')->where('id', $id)->first();//登录用户的信息
  253. $enrol_count=Enroll::where('uid',$id)->where('status',0)->count();
  254. $signup = DB::table('enroll')->where([['uid', '=', $id], ['season', '=', $re['season']], ['status', '=', 0]])->first();//当前用户是否报名
  255. $count = DB::table('enroll')->join('user','user.id','=','enroll.uid')->where([ ['enroll.season', '=', $re['season']], ['enroll.status', '=', 0]])->count();//当前用户是否报名
  256. $banner_1 = $re['banner_1'];
  257. $banner_2 = $re['banner_2'];
  258. $banner_3 = $re['banner_3'];
  259. $banner_4 = $re['banner_4'];
  260. $round_end = $re['round_end_time'];
  261. $repair_start = $re['repair_start'];
  262. $repair_end = $re['repair_end'];
  263. $money = $re['cost'];
  264. $day=ceil(($round_end-$now)/(3600*24));
  265. $key=Cache::get(md5($id));
  266. $link='';
  267. if ($signup){
  268. if (!$key){
  269. $t=$now-$re['round_start_time'];
  270. if ($t>0&&$t<3600*24*7*3){
  271. if ($t<3600*24*7){
  272. $week=1;
  273. }elseif (3600*24*7<$t&&$t<3600*24*7*2){
  274. $week=2;
  275. }elseif (3600*24*7*2<$t&&$t<3600*24*7*3){
  276. $week=3;
  277. }
  278. $re=DB::table('course_img')->where('season',$season)->where('week',$week)->first();
  279. if ($re){
  280. if ($re->course_img){
  281. $link=$re->course_img;
  282. }
  283. }
  284. }else{
  285. $re=DB::table('course_img')->where('season',$season)->where('week',0)->first();
  286. if ($re){
  287. if ($re->course_img){
  288. $link=$re->course_img;
  289. }
  290. }
  291. }
  292. }
  293. }
  294. if ($id==20){
  295. $re=DB::table('course_img')->where('season',$season)->where('week',3)->first();
  296. if ($re){
  297. if ($re->course_img){
  298. $link=$re->course_img;
  299. }
  300. }
  301. }
  302. $upload_status=false;
  303. if (mb_strlen($user_data->phone)<11){
  304. if ($signup){
  305. $upload_status=true;
  306. }
  307. }
  308. $s=0;
  309. if ($user_data->phone==18333333333){
  310. $s=0;
  311. }else{
  312. if($user_data->dwbs_id){
  313. $dw=DWBSUser::where('id',$user_data->dwbs_id)->first();
  314. if (!$dw){
  315. $s=1;
  316. }
  317. }else{
  318. $s=1;
  319. }
  320. }
  321. $user_back = [
  322. 'id' => $user_data->id,
  323. 'phone' => $user_data->phone,
  324. 'user_status' => $s,
  325. 'enrol_count'=>$enrol_count,
  326. 'name' => $user_data->nickname,
  327. 'avatar' => $user_data->avatar,
  328. 'super_name' => '',
  329. 'season' => (int)$season,
  330. 'start_time' => (int)$basic[2]->value * 1000,
  331. 'end_time' => (int)($round_end * 1000),
  332. 'money' => $money,
  333. 'day' => $day,
  334. 'banner_1' => $banner_1,
  335. 'banner_2' => $banner_2,
  336. 'banner_3' => $banner_3,
  337. 'banner_4' => $banner_4,
  338. 'repair_start' => (int)$repair_start,
  339. 'repair_end' => (int)$repair_end,
  340. 'count' => (int)$count,
  341. 'link'=>$link,
  342. 'upload_status' => $upload_status,
  343. ];//需要返回用户信息的一部分
  344. if (!$signup) {
  345. $da = [
  346. 'signuped' => false,
  347. 'grade' => '',
  348. 'progress' => 0,
  349. 'total' => 0,
  350. 'enroll_time' =>0,
  351. 'sales' => 0,
  352. 'rank' => 0,
  353. ];//未报名用户返回的部分信息
  354. } else {
  355. $user_sign = [
  356. 'signuped' => true,
  357. 'enroll_time' => strtotime($signup->created_at)*1000,
  358. ];//报名用户返回的部分信息
  359. $da = $handler->grade();
  360. $da = array_merge($user_sign, $da);
  361. }
  362. $da = array_merge($user_back, $da);//返回用户信息
  363. return $da;
  364. }
  365. public function weixinUrl(){
  366. $client=new Client();
  367. $config = [
  368. 'app_id' => 'wxa9d1325fd98f5a7d',
  369. 'secret' => 'b8cd4371804815530a1e1134e83a9488',
  370. 'log' => [
  371. 'level' => 'debug',
  372. 'file' => __DIR__.'/wechat.log',
  373. ],
  374. ];
  375. $miniProgram=Factory::miniProgram($config);
  376. $access_tokken=$miniProgram->access_token;
  377. $url='https://api.weixin.qq.com/wxa/query_urllink?access_token='.$access_tokken;
  378. $re=$client->post($url);
  379. dd($re);
  380. }
  381. }