<?php namespace App\Http\Controllers\Api; use App\Command\Log; use App\Models\PersonalAccessToken; use App\Models\User; use Exception; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use App\Models\Adapay; class LoginController extends BaseController { /** * 检验数据的真实性,并且获取解密后的明文. * @param $encryptedData string 加密的用户数据 * @param $iv string 与用户数据一同返回的初始向量 * @param $data string 解密后的原文 * * <li>-41001: encodingAesKey 非法</li> * <li>-41003: aes 解密失败</li> * <li>-41004: 解密后得到的buffer非法</li> * <li>-41005: base64加密失败</li> * <li>-41016: base64解密失败</li> * @return int 成功0,失败返回对应的错误码 */ private function decryptData($sessionKey, $encryptedData, $iv, &$data) { if (strlen($sessionKey) != 24) { return '-41001'; } $aesKey = base64_decode($sessionKey); if (strlen($iv) != 24) { return '-41002'; } $aesIV = base64_decode($iv); $aesCipher = base64_decode($encryptedData); $result = openssl_decrypt($aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV); //var_dump($result);exit; $dataObj = json_decode($result); if ($dataObj == NULL) { return '-41003'; } // $appid = config('-wxsite.wx_xcx_appid'); // if( $dataObj->watermark->appid != $appid ) // { // return '-41003'; // } $data = $dataObj; return '0'; } public function getOpenid(Request $request) { $appid = env('WX_XCX_APPID'); $secret = env('WX_XCX_KEY'); $jsCode = $request->js_code ?? ''; $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $jsCode . '&grant_type=authorization_code'; $wx_data = json_decode(file_get_contents($url), true); if (isset($wx_data['errcode'])) { Log::add('请求微信接口异常', $wx_data); return $this->JsonResponse('', '请求微信接口异常', 201); } return $this->JsonResponse([ 'session_key' => $wx_data['session_key'], 'openid' => $wx_data['openid'] ]); } //用户端登录 public function login(Request $request) { $code = $request->code ?? ''; $iv = $request->iv ?? ''; //$openId = $request->openid ?? ''; $encryptedData = $request->encryptedData ?? ''; $result = $this->codeToSession($code); if (isset($result['errcode'])) { return $this->JsonResponse('', $result['errmsg'], 201); } $openId = $result['openid']; $session_key = $result['session_key']; $res = $this->decryptData($session_key, $encryptedData, $iv, $data); if ($res != 0) { Log::add('登录截取结果', $res); return $this->JsonResponse('', '参数异常' . $res, 201); } $user = User::where(['phone' => $data->phoneNumber])->first(); if (!$user) { $user = new User(); $user->name = 'wx_' . uniqid(); $user->openid = $openId; $user->phone = $data->phoneNumber; $user->balance = 0; $user->freeze_balance = 0; $user->total_revenue = 0; $user->save(); } //对接汇付-创建个人对象 if (!$user->member_id) { $result = (new Adapay())->createMember($user->id, $user->phone); if (isset($result['status']) && $result['status'] == 'succeeded') { DB::table('users')->where('id', $user->id)->update(['member_id' => $result['member_id']]); } } //生成token $accessToken = 'Bearer ' . $user->createToken('Access-token')->plainTextToken; Log::add('用户--' . $user->id . '登录', ['token' => $accessToken]); return $this->JsonResponse([ 'Authorization' => $accessToken, ]); } //商户端授权绑定账号密码(提现时) public function merchantLogin(Request $request) { $muser = $request->user(); $appid = env('XCX_MERCHENT_APPID'); $secret = env('XCX_MERCHENT_SECRET'); $code = $request->code ?? ''; if (!$code) { return $this->JsonResponse('', '参数Code不能为空', 201); } DB::beginTransaction(); try { $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $code . '&grant_type=authorization_code'; $result = json_decode(file_get_contents($url), true); if (isset($result['errcode'])) { Log::add('商户端授权请求微信接口异常', $result); throw new \Exception($result['errmsg']); } $openId = $result['openid']; if (!$muser->openid && $openId) { $muser->openid = $openId; $muser->save(); } DB::commit(); } catch (\Exception $exception) { DB::rollBack(); return $this->JsonResponse('', $exception->getMessage(), 201); } return $this->JsonResponse(''); } public function logout(Request $request) { $request->user()->tokens()->delete(); //PersonalAccessToken::where(['tokenable_id' => $request->user()->id])->delete(); return $this->JsonResponse(''); } private function codeToSession($code) { $appid = env('WX_XCX_APPID'); $secret = env('WX_XCX_KEY'); if (!$code) { $this->error('无效参数Code'); } $url = 'https://api.weixin.qq.com/sns/jscode2session?appid=' . $appid . '&secret=' . $secret . '&js_code=' . $code . '&grant_type=authorization_code'; $wx_data = json_decode(file_get_contents($url), true); if (isset($wx_data['errcode'])) { Log::add('请求微信接口异常', $wx_data); //return $this->JsonResponse('', '请求微信接口异常', 201); } return $wx_data; } public function testLogin(Request $request) { $uid = $request->uid ?? 7; $user = User::find($uid); $accessToken = 'Bearer ' . $user->createToken('Access-token')->plainTextToken; //对接汇付-创建个人对象 if (!$user->member_id) { (new Adapay())->createMember($user->id, $user->phone); } return $this->JsonResponse(['Authorization' => $accessToken,]); } }