123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- <?php
- namespace App\Http\Controllers\WeChat;
- use App\Models\Setting;
- use App\Models\Student;
- use GuzzleHttp\Client;
- use Illuminate\Http\Request;
- use App\Http\Controllers\Controller;
- use Illuminate\Support\Facades\Log;
- class ApiController extends Controller
- {
- public function login(Request $request)
- {
- if(empty($request->input('code')) || empty($request->input('iv')) || empty($request->input('encryptedData'))) {
- return response()->json(['status' => 'error', 'info' => '参数错误']);
- }
- $code = $request->input('code');
- $iv = $request->input('iv');
- $encryptedData = $request->input('encryptedData');
- $app = app('wechat.mini_program');
- $res = $app->auth->session($code);
- if(!isset($res['session_key'])) {
- return response()->json(['status' => 'error', 'info' => '接口错误']);
- }
- $info = $app->encryptor->decryptData($res['session_key'], $iv, $encryptedData);
- if(!isset($info['openId'])) {
- return response()->json(['status' => 'error', 'info' => '接口错误']);
- }
- $student = Student::firstOrCreate([
- 'open_id' => $info['openId']
- ], [
- 'nickname' => $info['nickName'],
- 'gender' => $info['gender'],
- 'city' => $info['city'],
- 'province' => $info['province'],
- 'country' => $info['country'],
- 'avatar_url' => $info['avatarUrl'],
- 'name' => $info['nickName'],
- 'short_leave_times' => 0,
- 'long_leave_times' => 0,
- ]);
- $data = ['id' => $student->id, 'nickname' => $student->nickname, 'avatar_url' => $student->avatar_url];
- return response()->json(['status' => 'success', 'info' => '操作成功', 'data' => $data]);
- }
- public function checkPosition(Request $request)
- {
- if(empty($request->input('latitude')) || empty($request->input('longitude'))) {
- return response()->json(['status' => 'fail', 'info' => '参数错误']);
- }
- $center_position = Setting::where('key', 'check_card_location')->first();
- if(empty($center_position) || empty($center_position->value) || count($tmp = explode(',', $center_position->value)) < 2) {
- $tmp = ['39.916527', '116.397128'];
- }
- $client = new Client();
- $from = $tmp[0] . ',' . $tmp[1];
- $to = $request->input('latitude') . ',' . $request->input('longitude');
- $url = 'https://apis.map.qq.com/ws/distance/v1/?from=' . $from . '&to=' . $to . '&key=' . env('TECENT_POSITION_KEY');
- $res = $client->get($url);
- $res = json_decode((string)$res->getBody());
- $result = 'no';
- if($res->status == 0) {
- $radius = Setting::where('key', 'check_card_radius')->first();
- $radius = empty($radius) ? 1000 : $radius->value;
- $distance = $res->result->elements[0]->distance;
- if($distance <= $radius) {
- $result = 'ok';
- }
- }
- return response()->json(['status' => 'success', 'result' => $result]);
- }
- }
|