RestController.php
4.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
<?php
namespace filsh\yii2\oauth2server\controllers;
use Yii;
use yii\helpers\ArrayHelper;
use common\providers\MallLog;
use filsh\yii2\oauth2server\models\OauthClients;
use filsh\yii2\oauth2server\filters\ErrorToExceptionFilter;
use stdClass;
use function md5;
class RestController extends \yii\rest\Controller
{
/**
* @inheritdoc
*/
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'exceptionFilter' => [
'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();
}
}