open_wechat/
error.rs

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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
use serde_repr::Deserialize_repr;

use aes::cipher::block_padding::UnpadError;
use aes::cipher::InvalidLength as AesInvalidLength;
use base64::DecodeError as Base64DecodeError;
use reqwest::Error as ReqwestError;
use serde_json::Error as SerdeJsonError;
use strum::Display;

#[non_exhaustive]
#[derive(Debug, thiserror::Error)]
pub enum Error {
    #[error("system error: {0}")]
    System(String),
    #[error("invalid credential: {0}")]
    InvalidCredential(String),
    #[error("invalid grant type: {0}")]
    InvalidGrantType(String),
    #[error("invalid app id: {0}")]
    InvalidAppId(String),
    #[error("invalid code: {0}")]
    InvalidCode(String),
    #[error("invalid parameter: {0}")]
    InvalidParameter(String),
    #[error("invalid secret: {0}")]
    InvalidSecret(String),
    #[error("forbidden ip: {0}")]
    ForbiddenIp(String),
    #[error("code blocked: {0}")]
    CodeBlocked(String),
    #[error("secret frozen: {0}")]
    SecretFrozen(String),
    #[error("missing access token: {0}")]
    MissingAccessToken(String),
    #[error("missing app id: {0}")]
    MissingAppId(String),
    #[error("missing secret: {0}")]
    MissingSecret(String),
    #[error("missing code: {0}")]
    MissingCode(String),
    #[error("required post method: {0}")]
    RequiredPostMethod(String),
    #[error("daily request limit exceeded: {0}")]
    DailyRequestLimitExceeded(String),
    #[error("rate limit exceeded: {0}")]
    RateLimitExceeded(String),
    #[error("forbidden token: {0}")]
    ForbiddenToken(String),
    #[error("account frozen: {0}")]
    AccountFrozen(String),
    #[error("third party token: {0}")]
    ThirdPartyToken(String),
    #[error("session key not existed or expired: {0}")]
    SessionKeyNotExistedOrExpired(String),
    #[error("invalid signature method: {0}")]
    InvalidSignatureMethod(String),
    #[error("invalid signature: {0}")]
    InvalidSignature(String),
    #[error("confirm required: {0}")]
    ConfirmRequired(String),
    #[error("request denied one day: {0}")]
    RequestDeniedOneDay(String),
    #[error("request denied one hour: {0}")]
    RequestDeniedOneHour(String),
    #[error("unpad error: {0}")]
    Unpad(UnpadError),
    #[error("aes invalid length: {0}")]
    AesInvalidLength(#[from] AesInvalidLength),
    #[error("base64 decode error: {0}")]
    Base64Decode(#[from] Base64DecodeError),
    #[error("reqwest: {0}")]
    Reqwest(#[from] ReqwestError),
    #[error("json error: {0}")]
    SerdeJson(#[from] SerdeJsonError),
    #[error("internal error: {0}")]
    InternalServer(String),
}

impl From<UnpadError> for Error {
    fn from(error: UnpadError) -> Self {
        Error::Unpad(error)
    }
}

/// 微信小程序返回的错误码
#[derive(Debug, Deserialize_repr, Display)]
#[repr(i32)]
pub enum ErrorCode {
    #[strum(serialize = "系统繁忙,此时请开发者稍候再试")]
    System = -1,
    #[strum(
        serialize = "获取 access_token 时 AppSecret 错误,或者 access_token 无效。请开发者认真比对 AppSecret 的正确性,或查看是否正在为恰当的公众号调用接口"
    )]
    InvalidCredential = 40001,
    #[strum(serialize = "不合法的凭证类型")]
    InvalidGrantType = 40002,
    #[strum(serialize = "不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写")]
    InvalidAppId = 40013,
    #[strum(serialize = "code 无效")]
    InvalidCode = 40029,
    #[strum(serialize = "参数错误")]
    InvalidParameter = 40097,
    #[strum(serialize = "无效的appsecret,请检查appsecret的正确性")]
    InvalidSecret = 40125,
    #[strum(serialize = "将ip添加到ip白名单列表即可")]
    ForbiddenIp = 40164,
    #[strum(serialize = "高风险等级用户,小程序登录拦截 。风险等级详见用户安全解方案")]
    CodeBlocked = 40226,
    #[strum(serialize = "AppSecret已被冻结,请登录小程序平台解冻后再次调用")]
    SecretFrozen = 40243,
    #[strum(serialize = "缺少 access token 参数")]
    MissingAccessToken = 41001,
    #[strum(serialize = "缺少 appid 参数")]
    MissingAppId = 41002,
    #[strum(serialize = "缺少 secret 参数")]
    MissingSecret = 41004,
    MissingCode = 41008,
    #[strum(serialize = "需要 POST 请求")]
    RequiredPostMethod = 43002,
    #[strum(serialize = "调用超过天级别频率限制。可调用clear_quota接口恢复调用额度。")]
    DailyRequestLimitExceeded = 45009,
    #[strum(serialize = "API 调用太频繁,请稍候再试")]
    RateLimitExceeded = 45011,
    #[strum(serialize = "禁止使用 token 接口")]
    ForbiddenToken = 50004,
    #[strum(serialize = "账号已冻结")]
    AccountFrozen = 50007,
    #[strum(serialize = "第三方平台 API 需要使用第三方平台专用 token")]
    ThirdPartyToken = 61024,
    #[strum(serialize = "session_key is not existed or expired")]
    SessionKeyNotExistedOrExpired = 87007,
    #[strum(serialize = "invalid sig_method")]
    InvalidSignatureMethod = 87008,
    #[strum(serialize = "无效的签名")]
    InvalidSignature = 87009,
    #[strum(serialize = "此次调用需要管理员确认,请耐心等候")]
    ConfirmRequired = 89503,
    #[strum(
        serialize = "该IP调用求请求已被公众号管理员拒绝,请24小时后再试,建议调用前与管理员沟通确认"
    )]
    RequestDeniedOneDay = 89506,
    #[strum(
        serialize = "该IP调用求请求已被公众号管理员拒绝,请1小时后再试,建议调用前与管理员沟通确认"
    )]
    RequestDeniedOneHour = 89507,
}

impl From<(ErrorCode, String)> for Error {
    fn from((code, message): (ErrorCode, String)) -> Self {
        use ErrorCode::*;

        match code {
            System => Error::System(message),
            InvalidCredential => Error::InvalidCredential(message),
            InvalidGrantType => Error::InvalidGrantType(message),
            InvalidAppId => Error::InvalidAppId(message),
            InvalidCode => Error::InvalidCode(message),
            InvalidParameter => Error::InvalidParameter(message),
            InvalidSecret => Error::InvalidSecret(message),
            ForbiddenIp => Error::ForbiddenIp(message),
            CodeBlocked => Error::CodeBlocked(message),
            SecretFrozen => Error::SecretFrozen(message),
            MissingAccessToken => Error::MissingAccessToken(message),
            MissingAppId => Error::MissingAppId(message),
            MissingSecret => Error::MissingSecret(message),
            MissingCode => Error::MissingCode(message),
            RequiredPostMethod => Error::RequiredPostMethod(message),
            DailyRequestLimitExceeded => Error::DailyRequestLimitExceeded(message),
            RateLimitExceeded => Error::RateLimitExceeded(message),
            ForbiddenToken => Error::ForbiddenToken(message),
            AccountFrozen => Error::AccountFrozen(message),
            ThirdPartyToken => Error::ThirdPartyToken(message),
            SessionKeyNotExistedOrExpired => Error::SessionKeyNotExistedOrExpired(message),
            InvalidSignatureMethod => Error::InvalidSignatureMethod(message),
            InvalidSignature => Error::InvalidSignature(message),
            ConfirmRequired => Error::ConfirmRequired(message),
            RequestDeniedOneDay => Error::RequestDeniedOneDay(message),
            RequestDeniedOneHour => Error::RequestDeniedOneHour(message),
        }
    }
}