[ 'class' => ErrorToExceptionFilter::className() ], ]); } /** * 封装给省采商城调用的API * @return bool|stdClass */ public function actionGetAccessToken() { $result = new stdClass(); $request = $this->module->getRequest(); $requestData = $request->request; if (empty($requestData)) { $result->success = false; $result->desc = '请求参数不能为空'; return $result; } MallLog::debug('封装给省采商城调用的API: 请求数据=>' . json_encode($requestData)); // 参数检查 if (!isset($requestData['timestamp']) || empty($requestData['timestamp'])) { $result->success = false; $result->desc = 'timestamp请求参数不能为空'; return $result; } if (!isset($requestData['username']) || empty($requestData['username'])) { $result->success = false; $result->desc = 'username请求参数不能为空'; return $result; } if (!isset($requestData['password']) || empty($requestData['password'])) { $result->success = false; $result->desc = 'password请求参数不能为空'; return $result; } if (!isset($requestData['sign']) || empty($requestData['sign'])) { $result->success = false; $result->desc = 'sign请求参数不能为空'; return $result; } $timestamp = $requestData['timestamp']; $username = $requestData['username']; $password = $requestData['password']; $sign = $requestData['sign']; // 将 username+password+timestamp+password MD5加密后转为小写 $combineStr = $username . $password . $timestamp . $password; $validSign = strtolower(md5($combineStr)); if (strcmp($validSign, $sign) != 0) { $result->success = false; $result->desc = '签名校验失败'; return $result; } // 重设请求参数 unset($request->request['timestamp'], $request->request['username'], $request->request['password'], $request->request['sign']); $request->request['grant_type'] = 'client_credentials'; $request->request['client_id'] = $username; $request->request['client_secret'] = $password; $request->request['scope'] = 'user'; // 校验参数成功, 返回API访问令牌 $server = $this->module->getServer(); $response = $server->handleTokenRequest($request); $responseParamters = $response->getParameters(); // {"access_token":"d26aa8ed51462e79de2f2c5c06c6d7f996a462df","expires_in":86400,"token_type":"Bearer","scope":"user"} $result->success = true; $result->access_token = $responseParamters['access_token']; $result->expires_at = $responseParamters['expires_in']; // 更新数据库数据 $oauthClient = OauthClients::findOne(["client_id" => $username, "client_secret" => $password]); if ($oauthClient) { $oauthClient->access_token = $result->access_token; $oauthClient->expired_at = $result->expires_at + time(); $oauthClient->save(); } return $result; } public function actionToken() { $server = $this->module->getServer(); $request = $this->module->getRequest(); $response = $server->handleTokenRequest($request); return $response->getParameters(); } public function actionRevoke() { $server = $this->module->getServer(); $request = $this->module->getRequest(); $response = $server->handleRevokeRequest($request); return $response->getParameters(); } }