1use serde_repr::Deserialize_repr;
2
3use aes::cipher::block_padding::UnpadError;
4use aes::cipher::InvalidLength as AesInvalidLength;
5use base64::DecodeError as Base64DecodeError;
6use reqwest::Error as ReqwestError;
7use serde_json::Error as SerdeJsonError;
8use strum::Display;
9
10#[non_exhaustive]
11#[derive(Debug, thiserror::Error)]
12pub enum Error {
13 #[error("system error: {0}")]
14 System(String),
15 #[error("invalid credential: {0}")]
16 InvalidCredential(String),
17 #[error("invalid grant type: {0}")]
18 InvalidGrantType(String),
19 #[error("invalid app id: {0}")]
20 InvalidAppId(String),
21 #[error("invalid code: {0}")]
22 InvalidCode(String),
23 #[error("invalid parameter: {0}")]
24 InvalidParameter(String),
25 #[error("invalid secret: {0}")]
26 InvalidSecret(String),
27 #[error("forbidden ip: {0}")]
28 ForbiddenIp(String),
29 #[error("code blocked: {0}")]
30 CodeBlocked(String),
31 #[error("secret frozen: {0}")]
32 SecretFrozen(String),
33 #[error("missing access token: {0}")]
34 MissingAccessToken(String),
35 #[error("missing app id: {0}")]
36 MissingAppId(String),
37 #[error("missing secret: {0}")]
38 MissingSecret(String),
39 #[error("missing code: {0}")]
40 MissingCode(String),
41 #[error("required post method: {0}")]
42 RequiredPostMethod(String),
43 #[error("daily request limit exceeded: {0}")]
44 DailyRequestLimitExceeded(String),
45 #[error("rate limit exceeded: {0}")]
46 RateLimitExceeded(String),
47 #[error("forbidden token: {0}")]
48 ForbiddenToken(String),
49 #[error("account frozen: {0}")]
50 AccountFrozen(String),
51 #[error("third party token: {0}")]
52 ThirdPartyToken(String),
53 #[error("session key not existed or expired: {0}")]
54 SessionKeyNotExistedOrExpired(String),
55 #[error("invalid signature method: {0}")]
56 InvalidSignatureMethod(String),
57 #[error("invalid signature: {0}")]
58 InvalidSignature(String),
59 #[error("confirm required: {0}")]
60 ConfirmRequired(String),
61 #[error("request denied one day: {0}")]
62 RequestDeniedOneDay(String),
63 #[error("request denied one hour: {0}")]
64 RequestDeniedOneHour(String),
65 #[error("unpad error: {0}")]
66 Unpad(UnpadError),
67 #[error("aes invalid length: {0}")]
68 AesInvalidLength(#[from] AesInvalidLength),
69 #[error("base64 decode error: {0}")]
70 Base64Decode(#[from] Base64DecodeError),
71 #[error("reqwest: {0}")]
72 Reqwest(#[from] ReqwestError),
73 #[error("json error: {0}")]
74 SerdeJson(#[from] SerdeJsonError),
75 #[error("internal error: {0}")]
76 InternalServer(String),
77}
78
79impl From<UnpadError> for Error {
80 fn from(error: UnpadError) -> Self {
81 Error::Unpad(error)
82 }
83}
84
85#[derive(Debug, Deserialize_repr, Display)]
87#[repr(i32)]
88pub enum ErrorCode {
89 #[strum(serialize = "系统繁忙,此时请开发者稍候再试")]
90 System = -1,
91 #[strum(
92 serialize = "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"
93 )]
94 InvalidCredential = 40001,
95 #[strum(serialize = "不合法的凭证类型")]
96 InvalidGrantType = 40002,
97 #[strum(serialize = "不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写")]
98 InvalidAppId = 40013,
99 #[strum(serialize = "code 无效")]
100 InvalidCode = 40029,
101 #[strum(serialize = "参数错误")]
102 InvalidParameter = 40097,
103 #[strum(serialize = "无效的appsecret,请检查appsecret的正确性")]
104 InvalidSecret = 40125,
105 #[strum(serialize = "将ip添加到ip白名单列表即可")]
106 ForbiddenIp = 40164,
107 #[strum(serialize = "高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案")]
108 CodeBlocked = 40226,
109 #[strum(serialize = "AppSecret已被冻结,请登录小程序平台解冻后再次调用")]
110 SecretFrozen = 40243,
111 #[strum(serialize = "缺少 access token 参数")]
112 MissingAccessToken = 41001,
113 #[strum(serialize = "缺少 appid 参数")]
114 MissingAppId = 41002,
115 #[strum(serialize = "缺少 secret 参数")]
116 MissingSecret = 41004,
117 MissingCode = 41008,
118 #[strum(serialize = "需要 POST 请求")]
119 RequiredPostMethod = 43002,
120 #[strum(serialize = "调用超过天级别频率限制。可调用clear_quota接口恢复调用额度。")]
121 DailyRequestLimitExceeded = 45009,
122 #[strum(serialize = "API 调用太频繁,请稍候再试")]
123 RateLimitExceeded = 45011,
124 #[strum(serialize = "禁止使用 token 接口")]
125 ForbiddenToken = 50004,
126 #[strum(serialize = "账号已冻结")]
127 AccountFrozen = 50007,
128 #[strum(serialize = "第三方平台 API 需要使用第三方平台专用 token")]
129 ThirdPartyToken = 61024,
130 #[strum(serialize = "session_key is not existed or expired")]
131 SessionKeyNotExistedOrExpired = 87007,
132 #[strum(serialize = "invalid sig_method")]
133 InvalidSignatureMethod = 87008,
134 #[strum(serialize = "无效的签名")]
135 InvalidSignature = 87009,
136 #[strum(serialize = "此次调用需要管理员确认,请耐心等候")]
137 ConfirmRequired = 89503,
138 #[strum(
139 serialize = "该IP调用求请求已被公众号管理员拒绝,请24小时后再试,建议调用前与管理员沟通确认"
140 )]
141 RequestDeniedOneDay = 89506,
142 #[strum(
143 serialize = "该IP调用求请求已被公众号管理员拒绝,请1小时后再试,建议调用前与管理员沟通确认"
144 )]
145 RequestDeniedOneHour = 89507,
146}
147
148impl From<(ErrorCode, String)> for Error {
149 fn from((code, message): (ErrorCode, String)) -> Self {
150 use ErrorCode::*;
151
152 match code {
153 System => Error::System(message),
154 InvalidCredential => Error::InvalidCredential(message),
155 InvalidGrantType => Error::InvalidGrantType(message),
156 InvalidAppId => Error::InvalidAppId(message),
157 InvalidCode => Error::InvalidCode(message),
158 InvalidParameter => Error::InvalidParameter(message),
159 InvalidSecret => Error::InvalidSecret(message),
160 ForbiddenIp => Error::ForbiddenIp(message),
161 CodeBlocked => Error::CodeBlocked(message),
162 SecretFrozen => Error::SecretFrozen(message),
163 MissingAccessToken => Error::MissingAccessToken(message),
164 MissingAppId => Error::MissingAppId(message),
165 MissingSecret => Error::MissingSecret(message),
166 MissingCode => Error::MissingCode(message),
167 RequiredPostMethod => Error::RequiredPostMethod(message),
168 DailyRequestLimitExceeded => Error::DailyRequestLimitExceeded(message),
169 RateLimitExceeded => Error::RateLimitExceeded(message),
170 ForbiddenToken => Error::ForbiddenToken(message),
171 AccountFrozen => Error::AccountFrozen(message),
172 ThirdPartyToken => Error::ThirdPartyToken(message),
173 SessionKeyNotExistedOrExpired => Error::SessionKeyNotExistedOrExpired(message),
174 InvalidSignatureMethod => Error::InvalidSignatureMethod(message),
175 InvalidSignature => Error::InvalidSignature(message),
176 ConfirmRequired => Error::ConfirmRequired(message),
177 RequestDeniedOneDay => Error::RequestDeniedOneDay(message),
178 RequestDeniedOneHour => Error::RequestDeniedOneHour(message),
179 }
180 }
181}