open_wechat/
error.rs

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/// 微信小程序返回的错误码
86#[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}