正在显示
5 个修改的文件
包含
591 行增加
和
4 行删除
controller/ServerProxy.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace Controller; | ||
4 | + | ||
5 | +use Lib\Mail\Mail; | ||
6 | +use Lib\Mail\MailFun; | ||
7 | +use Lib\UploadFile; | ||
8 | +use Lib\Verify; | ||
9 | +use Model\bodySql; | ||
10 | +use Model\emailSql; | ||
11 | +use Model\folderSql; | ||
12 | +use Model\listsSql; | ||
13 | +use Model\sendJobsSql; | ||
14 | +use Service\MailProxy; | ||
15 | +use Service\SyncMail; | ||
16 | + | ||
17 | + | ||
18 | +/** | ||
19 | + * 读取代理服务器配置 | ||
20 | + * @author:dc | ||
21 | + * @time 2025/3/10 16:36 | ||
22 | + * Class ServerProxy | ||
23 | + * @package Controller | ||
24 | + */ | ||
25 | +class ServerProxy extends Base { | ||
26 | + | ||
27 | + /** | ||
28 | + * shopk和mail-server都必须使用这个 进行分配 | ||
29 | + * @return array[] | ||
30 | + * @author:dc | ||
31 | + * @time 2025/3/10 16:39 | ||
32 | + */ | ||
33 | + public function index(){ | ||
34 | + $email = app()->request('email'); | ||
35 | + $smtp = app()->request('smtp'); | ||
36 | + $imap = app()->request('imap'); | ||
37 | + $proxy = new MailProxy($email,$imap,$smtp); | ||
38 | + $proxy->proxySuccess(); | ||
39 | + app()->_json([ | ||
40 | + 'imap_proxy' => $proxy->getImapProxy(), | ||
41 | + 'smtp_proxy' => $proxy->getSmtpProxy() | ||
42 | + ]); | ||
43 | + } | ||
44 | + | ||
45 | + | ||
46 | + | ||
47 | +} | ||
48 | + | ||
49 | + | ||
50 | + | ||
51 | + | ||
52 | + | ||
53 | + | ||
54 | + | ||
55 | + | ||
56 | + | ||
57 | + | ||
58 | + | ||
59 | + | ||
60 | + | ||
61 | + |
nginx-proxy-tcp.conf
0 → 100644
1 | +server { | ||
2 | + listen 10087; # 监听的端口 | ||
3 | + proxy_pass smtp.gmail.com:465; | ||
4 | +} | ||
5 | +server { | ||
6 | + listen 10086; # 监听的端口 | ||
7 | + proxy_pass imap.gmail.com:993; | ||
8 | +} | ||
9 | +server { | ||
10 | + listen 10088; # 监听的端口 | ||
11 | + proxy_pass imap-mail.outlook.com:993; | ||
12 | +} | ||
13 | +server { | ||
14 | + listen 10089; # 监听的端口 | ||
15 | + proxy_pass smtp-mail.outlook.com:465; | ||
16 | +} | ||
17 | +server { | ||
18 | + listen 10092; # 监听的端口 | ||
19 | + proxy_pass imap.mail.yahoo.com:993; | ||
20 | +} | ||
21 | +server { | ||
22 | + listen 10093; # 监听的端口 | ||
23 | + proxy_pass smtp.mail.yahoo.com:465; | ||
24 | +} | ||
25 | +server { | ||
26 | + listen 10080; # 监听的端口 | ||
27 | + proxy_pass imaphz.qiye.163.com:993; | ||
28 | +} | ||
29 | +server { | ||
30 | + listen 10081; # 监听的端口 | ||
31 | + proxy_pass smtphz.qiye.163.com:465; | ||
32 | +} | ||
33 | + | ||
34 | +server { | ||
35 | + listen 10094; # 监听的端口 | ||
36 | + proxy_pass imap.qiye.aliyun.com:993; | ||
37 | +} | ||
38 | +server { | ||
39 | + listen 10095; # 监听的端口 | ||
40 | + proxy_pass smtp.qiye.aliyun.com:465; | ||
41 | +} |
@@ -7,18 +7,19 @@ | @@ -7,18 +7,19 @@ | ||
7 | return [ | 7 | return [ |
8 | 8 | ||
9 | '/' => [\Controller\Test::class, 'home'], | 9 | '/' => [\Controller\Test::class, 'home'], |
10 | + 'axxx' => [\Controller\Test::class, 'a'], | ||
10 | 11 | ||
11 | // 登录操作 | 12 | // 登录操作 |
12 | 'login' => [\Controller\Login::class, 'login'], | 13 | 'login' => [\Controller\Login::class, 'login'], |
13 | // 邮件列表 | 14 | // 邮件列表 |
14 | - 'lists' => [\Controller\Home::class, 'lists'], | 15 | + 'lists' => [\Controller\HomeEs::class, 'lists'], |
15 | // 统计 | 16 | // 统计 |
16 | - 'count' => [\Controller\Home::class, 'count'], | 17 | + 'count' => [\Controller\HomeEs::class, 'count'], |
17 | // 这个是单独处理的 aicc那边的应用 | 18 | // 这个是单独处理的 aicc那边的应用 |
18 | 'v2/lists' => [\Controller\v2\Home::class, 'lists'], | 19 | 'v2/lists' => [\Controller\v2\Home::class, 'lists'], |
19 | // 黑格专用路由 | 20 | // 黑格专用路由 |
20 | - 'fob/lists' => [\Controller\fob_ai\MailListV2::class, 'lists'], | ||
21 | - 'fob/count' => [\Controller\fob_ai\MailListV2::class, 'count'],// 统计数量 | 21 | + 'fob/lists' => [\Controller\fob_ai\MailListV2Es::class, 'lists'], |
22 | + 'fob/count' => [\Controller\fob_ai\MailListV2Es::class, 'count'],// 统计数量 | ||
22 | 23 | ||
23 | 'fob/v2/lists' => [\Controller\fob_ai\MailListV2::class, 'lists'], | 24 | 'fob/v2/lists' => [\Controller\fob_ai\MailListV2::class, 'lists'], |
24 | 'fob/v2/count' => [\Controller\fob_ai\MailListV2::class, 'count'],// 统计数量 | 25 | 'fob/v2/count' => [\Controller\fob_ai\MailListV2::class, 'count'],// 统计数量 |
@@ -27,6 +28,9 @@ return [ | @@ -27,6 +28,9 @@ return [ | ||
27 | 'fob/es/count' => [\Controller\fob_ai\MailListV2Es::class, 'count'],// 统计数量 | 28 | 'fob/es/count' => [\Controller\fob_ai\MailListV2Es::class, 'count'],// 统计数量 |
28 | 29 | ||
29 | 30 | ||
31 | + // 代理 ip分配 | ||
32 | + 'proxy/server' => [\Controller\ServerProxy::class,'index'], | ||
33 | + | ||
30 | 34 | ||
31 | 35 | ||
32 | // 邮件详情 | 36 | // 邮件详情 |
service/MailProxy.php
0 → 100644
1 | +<?php | ||
2 | + | ||
3 | +namespace Service; | ||
4 | + | ||
5 | +use Lib\Mail\MailFun; | ||
6 | + | ||
7 | +/** | ||
8 | + * @author:dc | ||
9 | + * @time 2025/3/11 9:20 | ||
10 | + * Class MailProxy | ||
11 | + * @package Service | ||
12 | + */ | ||
13 | +class MailProxy { | ||
14 | + | ||
15 | + /** 原域名 | ||
16 | + * @var | ||
17 | + */ | ||
18 | + protected $originImapHost = ''; | ||
19 | + | ||
20 | + protected $originSmtpHost = ''; | ||
21 | + | ||
22 | + | ||
23 | + /** | ||
24 | + * 代理服务器 | ||
25 | + * @var string | ||
26 | + */ | ||
27 | + private $proxyImapHost = ''; | ||
28 | + | ||
29 | + private $proxySmtpHost = ''; | ||
30 | + | ||
31 | + /** | ||
32 | + * 代理配置 | ||
33 | + * @var array | ||
34 | + */ | ||
35 | + protected $config = [ | ||
36 | + | ||
37 | + 'smtp.gmail.com:465' => '10087', | ||
38 | + 'imap.gmail.com:993' => '10086', | ||
39 | + | ||
40 | + 'imap-mail.outlook.com:993' => '10088', | ||
41 | + 'smtp-mail.outlook.com:465' => '10089', | ||
42 | + | ||
43 | + 'imap.mail.yahoo.com:993' => '10092', | ||
44 | + 'smtp.mail.yahoo.com:465' => '10093', | ||
45 | + | ||
46 | + 'imaphz.qiye.163.com:993' => '10080', | ||
47 | + 'smtphz.qiye.163.com:465' => '10081', | ||
48 | + | ||
49 | + 'imap.qiye.aliyun.com:993' => '10094', | ||
50 | + 'smtp.qiye.aliyun.com:465' => '10095', | ||
51 | + | ||
52 | + 'imap.qq.com:993' => '10096', | ||
53 | + 'smtp.qq.com:465' => '10097', | ||
54 | + | ||
55 | + ]; | ||
56 | + | ||
57 | + /** | ||
58 | + * 代理服务器 地址 | ||
59 | + * @var string[] | ||
60 | + */ | ||
61 | + protected $proxyService = [ | ||
62 | + '43.134.162.250', // 这个是新加坡服务器 代理 | ||
63 | + '43.154.117.107', // 这个是 shopk的那台服务器 | ||
64 | + ]; | ||
65 | + | ||
66 | + /** | ||
67 | + * 分配到的ip服务 | ||
68 | + * @var string | ||
69 | + */ | ||
70 | + protected $assignIp = ''; | ||
71 | + | ||
72 | + /** | ||
73 | + * 邮箱 | ||
74 | + * @var string | ||
75 | + */ | ||
76 | + protected $email = ''; | ||
77 | + | ||
78 | + /** | ||
79 | + * MailProxy constructor. | ||
80 | + * @param string $email | ||
81 | + * @param string $imap | ||
82 | + * @param string $smtp | ||
83 | + * @throws \Exception | ||
84 | + */ | ||
85 | + public function __construct(string $email, string $imap, string $smtp) | ||
86 | + { | ||
87 | + $this->email = str_replace(['"',"'"],'',$email); | ||
88 | + // 先分配 | ||
89 | + $this->assignEmail(); | ||
90 | + | ||
91 | + $this->originImapHost = $imap; | ||
92 | + | ||
93 | + $this->originSmtpHost = $smtp; | ||
94 | + // 解析 | ||
95 | + $this->proxyImapHost = $this->parse($imap,993); | ||
96 | + // 解析 | ||
97 | + $this->proxySmtpHost = $this->parse($smtp,465); | ||
98 | + } | ||
99 | + | ||
100 | + /** | ||
101 | + * 代理地址 | ||
102 | + * @author:dc | ||
103 | + * @time 2025/3/13 17:38 | ||
104 | + */ | ||
105 | + public function getImapProxy(){ | ||
106 | + return $this->proxyImapHost; | ||
107 | + } | ||
108 | + | ||
109 | + /** | ||
110 | + * 代理地址 | ||
111 | + * @return string | ||
112 | + * @author:dc | ||
113 | + * @time 2025/3/14 10:31 | ||
114 | + */ | ||
115 | + public function getSmtpProxy(){ | ||
116 | + return $this->proxySmtpHost; | ||
117 | + } | ||
118 | + | ||
119 | + /** | ||
120 | + * @return mixed | ||
121 | + */ | ||
122 | + public function getOriginImapHost(): string | ||
123 | + { | ||
124 | + return $this->originImapHost; | ||
125 | + } | ||
126 | + | ||
127 | + /** | ||
128 | + * @return string | ||
129 | + */ | ||
130 | + public function getOriginSmtpHost(): string | ||
131 | + { | ||
132 | + return $this->originSmtpHost; | ||
133 | + } | ||
134 | + | ||
135 | + /** | ||
136 | + * 解析地址 | ||
137 | + * @param string $host | ||
138 | + * @param int $port | ||
139 | + * @return string | ||
140 | + * @author:dc | ||
141 | + * @time 2025/3/13 17:18 | ||
142 | + */ | ||
143 | + public function parse(string $host, int $port){ | ||
144 | + $host = parse_url($host); | ||
145 | + // 协议 | ||
146 | + $scheme = $host['scheme']??'ssl'; | ||
147 | + // 地址 | ||
148 | + $serve = strtolower(empty($host['host']) ? $host['path'] : $host['host']); | ||
149 | + | ||
150 | + // 传入的是代理地址 并且是数据库里面已分配的ip | ||
151 | + if(in_array($serve,$this->proxyService)){ | ||
152 | + // 传入的服务器 和 分配的不一致 更新分配的 | ||
153 | + if($serve != $this->assignIp){ | ||
154 | + $this->assignIp = $serve; | ||
155 | + // 更新 ip | ||
156 | + db()->throw()->update('mail_proxy',[ | ||
157 | + 'ip' => $this->assignIp | ||
158 | + ],dbWhere(['email'=>$this->email]),false); | ||
159 | + } | ||
160 | + | ||
161 | + }else{ | ||
162 | + // 端口 | ||
163 | + $port = (empty($host['port'])?$port:$host['port']); | ||
164 | + | ||
165 | + // 端口不在,说明没有配置 | ||
166 | + if(empty($this->config[$serve.':'.$port])){ | ||
167 | + // 返回不代理 | ||
168 | + $this->assignIp = $serve; | ||
169 | + }else{ | ||
170 | + if(in_array($this->assignIp,$this->proxyService)){ | ||
171 | + $port = $this->config[$serve.':'.$port]; // 代理服务器端口 | ||
172 | + } | ||
173 | + } | ||
174 | + | ||
175 | + } | ||
176 | + | ||
177 | + // 组装 | ||
178 | + $proxyHost = $scheme.'://'.$this->assignIp.":".(empty($host['port'])?$port:$host['port']); | ||
179 | + | ||
180 | + | ||
181 | + return implode(':',MailFun::getHostPort($proxyHost)); | ||
182 | + } | ||
183 | + | ||
184 | + /** | ||
185 | + * 分配邮箱 到 服务器 | ||
186 | + * @author:dc | ||
187 | + * @time 2025/3/11 18:01 | ||
188 | + */ | ||
189 | + private function assignEmail(){ | ||
190 | + $data = db()->throw()->first('select * from mail_proxy where email = "'.$this->email.'"'); | ||
191 | + // 存在记录 并且 还在服务器列表 | ||
192 | + if($data && in_array($data['ip'],$this->proxyService)){ | ||
193 | + $this->assignIp = $data['ip']; | ||
194 | + return ; | ||
195 | + } | ||
196 | + // 一个月活跃用户 | ||
197 | + $t = date('Y-m-d H:i:s',strtotime("-30 day")); | ||
198 | + foreach ($this->proxyService as $ip){ | ||
199 | + $num = db()->count("select count(*) from `mail_proxy` where `status` = 1 and `time` > '{$t}' and `ip` = '{$ip}'"); | ||
200 | + // 每个ip分配1000个 | ||
201 | + if($num<1000){ | ||
202 | + $this->assignIp = $ip; | ||
203 | + // 如果某个服务器 停止了,进来了就要重新分配 | ||
204 | + if($data){ | ||
205 | + db()->throw()->update('mail_proxy',[ | ||
206 | + 'ip' => $this->assignIp | ||
207 | + ],'id = '.$data['id']); | ||
208 | + }else{ | ||
209 | + db()->throw()->insert('mail_proxy',[ | ||
210 | + 'email' => $this->email, | ||
211 | + 'ip' => $this->assignIp, | ||
212 | + 'time' => date('Y-m-d H:i:s'), | ||
213 | + 'status' => 0 | ||
214 | + ],false); | ||
215 | + } | ||
216 | + | ||
217 | + return ; | ||
218 | + } | ||
219 | + } | ||
220 | + | ||
221 | + throw new \Exception('没有资源可分配'); | ||
222 | + } | ||
223 | + | ||
224 | + | ||
225 | + /** | ||
226 | + * 标记为正常使用代理 | ||
227 | + * @author:dc | ||
228 | + * @time 2025/3/14 14:39 | ||
229 | + */ | ||
230 | + public function proxySuccess(){ | ||
231 | + db()->update('mail_proxy',[ | ||
232 | + 'status' => 1 | ||
233 | + ],dbWhere(['email'=>$this->email]),false); | ||
234 | + } | ||
235 | + | ||
236 | + | ||
237 | + | ||
238 | +} | ||
239 | + | ||
240 | + | ||
241 | + | ||
242 | + | ||
243 | + | ||
244 | + | ||
245 | + | ||
246 | + | ||
247 | + | ||
248 | + | ||
249 | + | ||
250 | + | ||
251 | + | ||
252 | + | ||
253 | + | ||
254 | + |
x.html
0 → 100644
1 | +<!DOCTYPE html> | ||
2 | +<html lang="en"> | ||
3 | +<head> | ||
4 | + <meta charset="UTF-8"> | ||
5 | + <title>Title</title> | ||
6 | +</head> | ||
7 | +<body> | ||
8 | + | ||
9 | +<style> | ||
10 | + pre{ | ||
11 | + background-color: #f0f0f0; | ||
12 | + } | ||
13 | +</style> | ||
14 | +<h3><div style="text-align:center">深圳国际贸易单一窗口业务对接创贸集团技术方案</div></h3> | ||
15 | +<p>> 一. 签名</p> | ||
16 | +<ol> | ||
17 | + <li>签名采用rsa 2048</li> | ||
18 | +</ol> | ||
19 | + | ||
20 | +<pre> | ||
21 | + <code class="language-injectablephp"> | ||
22 | + /** | ||
23 | + * rsa 签名 | ||
24 | + * @param array $data 请求的参数 | ||
25 | + * @return string 签名字符串 | ||
26 | + */ | ||
27 | + function rsaEnSign(array $data){ | ||
28 | + ksort($data); | ||
29 | + $dataString = http_build_query($data); | ||
30 | + if (openssl_sign($dataString, $signature, 'private_key', OPENSSL_ALGO_SHA1)) { | ||
31 | + return base64_encode($signature); | ||
32 | + } else { | ||
33 | + return ''; | ||
34 | + } | ||
35 | + } | ||
36 | + </code> | ||
37 | +</pre> | ||
38 | + | ||
39 | +<ol start="2"> | ||
40 | + <li>验证数据</li> | ||
41 | +</ol> | ||
42 | + | ||
43 | +<pre> | ||
44 | + <code class="language-injectablephp"> | ||
45 | + /** | ||
46 | + * 验证数据来源 | ||
47 | + * @param array $data | ||
48 | + * @param string $sign | ||
49 | + */ | ||
50 | + function rsaVerify(array $data, string $sign){ | ||
51 | + ksort($data); | ||
52 | + $dataString = http_build_query($data); | ||
53 | + $verified = openssl_verify($dataString, base64_decode($sign), 'public_key', OPENSSL_ALGO_SHA1); | ||
54 | + if ($verified === 1) { | ||
55 | + // 验证成功 | ||
56 | + } elseif ($verified === 0) { | ||
57 | + // 验证失败 | ||
58 | + } else { | ||
59 | + // 签名错误 | ||
60 | + $errorMsg = openssl_error_string(); | ||
61 | + } | ||
62 | + } | ||
63 | + </code> | ||
64 | +</pre> | ||
65 | +<p>> 二. 接口</p> | ||
66 | +<ol> | ||
67 | + <li><p>用户授权</p> | ||
68 | + <ul> | ||
69 | + <li>请求地址 /api/southern/auth</li> | ||
70 | + | ||
71 | + <li>请求类型 POST</li> | ||
72 | + | ||
73 | + <li>签名规则 rsa</li> | ||
74 | + | ||
75 | + <li>请求示例</li> | ||
76 | + | ||
77 | + </ul> | ||
78 | + | ||
79 | + <pre> | ||
80 | + <code class="language-injectablephp"> | ||
81 | + $postData = [ | ||
82 | + 'payload' => [ | ||
83 | + "serviceFlowId" => "本次业务操作流水id", | ||
84 | + "uniCode" => "南方电子口岸给对接方分配的 唯一ID号", | ||
85 | + "mobile" => "手机", | ||
86 | + "userId" => "用户 ID", | ||
87 | + "userName" => "用户名称", | ||
88 | + "entName" => "企业名称", | ||
89 | + "scCode" => "企业统一社会信用代码" | ||
90 | + ], | ||
91 | + 'sign' => '', | ||
92 | + ]; | ||
93 | + $postData['sign'] = rsaEnSign($postData['payload']); | ||
94 | + $result = Http::post('url', $postData); | ||
95 | + if($result['code']===200){ | ||
96 | + // 成功 | ||
97 | + }else{ | ||
98 | + // 失败 | ||
99 | + } | ||
100 | + </code> | ||
101 | + </pre> | ||
102 | + | ||
103 | + <ul> | ||
104 | + <li>返回结果 成功</li> | ||
105 | + </ul> | ||
106 | + | ||
107 | + <pre> | ||
108 | + <code class="language-json"> | ||
109 | + { | ||
110 | + "code": 200, | ||
111 | + "message": "SUCCESS", | ||
112 | + "data": { | ||
113 | + "url": [ | ||
114 | + { | ||
115 | + "name": "ai搜索", | ||
116 | + "url": "https://fob.ai.cc/ai_search?iframe_sign=xxxxx" | ||
117 | + }, | ||
118 | + { | ||
119 | + "name": "企业洞察", | ||
120 | + "url": "https://fob.ai.cc/ai_company_search?iframe_sign=xxxxx" | ||
121 | + }, | ||
122 | + ... | ||
123 | + ], | ||
124 | + "uniCode": "1", | ||
125 | + "firstLogin": true //是否第一次登录 | ||
126 | + }, | ||
127 | + "success": true | ||
128 | + } | ||
129 | + </code></pre> | ||
130 | + | ||
131 | + <ul> | ||
132 | + <li>失败信息</li> | ||
133 | + | ||
134 | + </ul> | ||
135 | + | ||
136 | + <pre> | ||
137 | + <code class="language-json"> | ||
138 | + { | ||
139 | + "code": 500, | ||
140 | + "message": "签名验证失败", | ||
141 | + "success": false | ||
142 | + } | ||
143 | + </code> | ||
144 | + </pre> | ||
145 | + | ||
146 | + </li> | ||
147 | + | ||
148 | + <li><p>意向登记</p> | ||
149 | + <ul> | ||
150 | + <li>请求地址 /api/southern/intention</li> | ||
151 | + | ||
152 | + <li>请求类型 POST</li> | ||
153 | + | ||
154 | + <li>签名规则 rsa</li> | ||
155 | + | ||
156 | + <li>请求示例</li> | ||
157 | + | ||
158 | + </ul> | ||
159 | + | ||
160 | + <pre><code class="language-injectablephp"> | ||
161 | + $postData = [ | ||
162 | + "guid"=>"166970C4-AF54-470A-87E4-D598463783A2", | ||
163 | + "busiCode"=> "CMJT04", | ||
164 | + "senderId"=> "XXXXXX", | ||
165 | + "version"=> "1.0", | ||
166 | + 'payload' => [ | ||
167 | + "serviceFlowId"=> "F2310011420000001", | ||
168 | + "orgName"=>"xxx", | ||
169 | + "orgCode"=>"xxx", | ||
170 | + "userId"=>"xxx", | ||
171 | + "userName"=>"xxxxx 有限公司", | ||
172 | + "contactAddress"=> "xxxxxxxxxxxxxxxxxx", | ||
173 | + "contactMan"=> "xxx", | ||
174 | + "contactTel"=> "xxx", | ||
175 | + "email"=> "xxx", | ||
176 | + "position"=> "xxx", | ||
177 | + "notes"=> "xxx" | ||
178 | + ], | ||
179 | + 'sign' => '', | ||
180 | + ]; | ||
181 | + $postData['sign'] = rsaEnSign($postData['payload']); | ||
182 | + $result = Http::post('url', $postData); | ||
183 | + if($result['code']===200){ | ||
184 | + // 成功 | ||
185 | + }else{ | ||
186 | + // 失败 | ||
187 | + } | ||
188 | + </code></pre> | ||
189 | + | ||
190 | + <ul> | ||
191 | + <li>返回结果 成功</li> | ||
192 | + | ||
193 | + </ul> | ||
194 | + | ||
195 | + <pre> | ||
196 | + <code class="language-json"> | ||
197 | + { | ||
198 | + "code": 200, | ||
199 | + "message": "SUCCESS", | ||
200 | + "data": { | ||
201 | + "serviceFlowId": "F2310011420000001", | ||
202 | + "status": "11", | ||
203 | + "statusTime": "20230818081331", | ||
204 | + "statusDetail": "" | ||
205 | + }, | ||
206 | + "success": true | ||
207 | + } | ||
208 | + </code> | ||
209 | + </pre> | ||
210 | + | ||
211 | + <ul> | ||
212 | + <li>失败信息</li> | ||
213 | + </ul> | ||
214 | + | ||
215 | + <pre><code class="language-json"> | ||
216 | + { | ||
217 | + "code": 500, | ||
218 | + "message": "签名验证失败", | ||
219 | + "success": false | ||
220 | + }</code></pre> | ||
221 | + | ||
222 | + </li> | ||
223 | + | ||
224 | +</ol> | ||
225 | + | ||
226 | +</body> | ||
227 | +</html> |
-
请 注册 或 登录 后发表评论