using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace ZcPeng.weixin.PublicAccount
{
///
/// 错误信息
///
public class ErrorMessage
{
///
/// 成功对应的错误码
///
public const int SuccessCode = 0;
///
/// 成功
///
public static readonly ErrorMessage Success = new ErrorMessage(SuccessCode, "请求成功");
///
/// 异常
///
public static readonly ErrorMessage Exception = new ErrorMessage(ExceptionCode, "请求异常");
///
/// 程序异常对应的错误代码
///
public const int ExceptionCode = -99999;
///
/// 错误字典
///
public static Dictionary ErrorDictionary = new Dictionary()
{
{-1 , "系统繁忙"},
{0 , "请求成功"},
{40001 , "获取access_token时AppSecret错误,或者access_token无效"},
{40002 , "不合法的凭证类型"},
{40003 , "不合法的OpenID"},
{40004 , "不合法的媒体文件类型"},
{40005 , "不合法的文件类型"},
{40006 , "不合法的文件大小"},
{40007 , "不合法的媒体文件id"},
{40008 , "不合法的消息类型"},
{40009 , "不合法的图片文件大小"},
{40010 , "不合法的语音文件大小"},
{40011 , "不合法的视频文件大小"},
{40012 , "不合法的缩略图文件大小"},
{40013 , "不合法的APPID"},
{40014 , "不合法的access_token"},
{40015 , "不合法的菜单类型"},
{40016 , "不合法的按钮个数"},
{40017 , "不合法的按钮个数"},
{40018 , "不合法的按钮名字长度"},
{40019 , "不合法的按钮KEY长度"},
{40020 , "不合法的按钮URL长度"},
{40021 , "不合法的菜单版本号"},
{40022 , "不合法的子菜单级数"},
{40023 , "不合法的子菜单按钮个数"},
{40024 , "不合法的子菜单按钮类型"},
{40025 , "不合法的子菜单按钮名字长度"},
{40026 , "不合法的子菜单按钮KEY长度"},
{40027 , "不合法的子菜单按钮URL长度"},
{40028 , "不合法的自定义菜单使用用户"},
{40029 , "不合法的oauth_code"},
{40030 , "不合法的refresh_token"},
{40031 , "不合法的openid列表"},
{40032 , "不合法的openid列表长度"},
{40033 , "不合法的请求字符,不能包含\\uxxxx格式的字符"},
{40035 , "不合法的参数"},
{40038 , "不合法的请求格式"},
{40039 , "不合法的URL长度"},
{40050 , "不合法的分组id"},
{40051 , "分组名字不合法"},
{41001 , "缺少access_token参数"},
{41002 , "缺少appid参数"},
{41003 , "缺少refresh_token参数"},
{41004 , "缺少secret参数"},
{41005 , "缺少多媒体文件数据"},
{41006 , "缺少media_id参数"},
{41007 , "缺少子菜单数据"},
{41008 , "缺少oauthcode"},
{41009 , "缺少openid"},
{42001 , "access_token超时"},
{42002 , "refresh_token超时"},
{42003 , "oauth_code超时"},
{43001 , "需要GET请求"},
{43002 , "需要POST请求"},
{43003 , "需要HTTPS请求"},
{43004 , "需要接收者关注"},
{43005 , "需要好友关系"},
{44001 , "多媒体文件为空"},
{44002 , "POST的数据包为空"},
{44003 , "图文消息内容为空"},
{44004 , "文本消息内容为空"},
{45001 , "多媒体文件大小超过限制"},
{45002 , "消息内容超过限制"},
{45003 , "标题字段超过限制"},
{45004 , "描述字段超过限制"},
{45005 , "链接字段超过限制"},
{45006 , "图片链接字段超过限制"},
{45007 , "语音播放时间超过限制"},
{45008 , "图文消息超过限制"},
{45009 , "接口调用超过限制"},
{45010 , "创建菜单个数超过限制"},
{45015 , "回复时间超过限制"},
{45016 , "系统分组,不允许修改"},
{45017 , "分组名字过长"},
{45018 , "分组数量超过上限"},
{46001 , "不存在媒体数据"},
{46002 , "不存在的菜单版本"},
{46003 , "不存在的菜单数据"},
{46004 , "不存在的用户"},
{47001 , "解析JSON/XML内容错误"},
{48001 , "api功能未授权"},
{50001 , "用户未授权该api"},
//客服管理接口错误码
{61450 , "系统错误(system error)"},
{61451 , "参数错误(invalid parameter)"},
{61452 , "无效客服账号(invalid kf_account)"},
{61453 , "账号已存在(kf_account exsited)"},
{61454 , "账号名长度超过限制(前缀10个英文字符)(invalid kf_acount length)"},
{61455 , "账号名包含非法字符(英文+数字)(illegal character in kf_account)"},
{61456 , "账号个数超过限制(10个客服账号)(kf_account count exceeded)"},
{61457 , "无效头像文件类型(invalid file type)"},
{61458 , "客户正在被其他客服接待(customer accepted by xxx@xxxx)"},
{61459 , "客服不在线(kf offline)"},
{61500 , "日期格式错误"},
{61501 , "日期范围错误"},
//语义理解接口错误码
{7000000 , "请求正常,无语义结果"},
{7000001 , "缺失请求参数"},
{7000002 , "signature 参数无效"},
{7000003 , "地理位置相关配置 1 无效"},
{7000004 , "地理位置相关配置 2 无效"},
{7000005 , "请求地理位置信息失败"},
{7000006 , "地理位置结果解析失败"},
{7000007 , "内部初始化失败"},
{7000008 , "非法 appid(获取密钥失败)"},
{7000009 , "请求语义服务失败"},
{7000010 , "非法 post 请求"},
{7000011 , "post 请求 json 字段无效 "},
{7000030 , "查询 query 太短"},
{7000031 , "查询 query 太长"},
{7000032 , "城市、经纬度信息缺失"},
{7000033 , "query 请求语义处理失败"},
{7000034 , "获取天气信息失败"},
{7000035 , "获取股票信息失败"},
{7000036 , "utf8 编码转换失败"},
{9001001 , "POST数据参数不合法"},
{9001002 , "远端服务不可用"},
{9001003 , "Ticket不合法"},
{9001004 , "获取摇周边用户信息失败"},
{9001005 , "获取商户信息失败"},
{9001006 , "获取OpenID失败"},
{9001007 , "上传文件缺失"},
{9001008 , "上传素材的文件类型不合法"},
{9001009 , "上传素材的文件尺寸不合法"},
{9001010 , "上传失败"},
{9001020 , "帐号不合法"},
{9001021 , "已有设备激活率低于50%,不能新增设备"},
{9001022 , "设备申请数不合法,必须为大于0的数字"},
{9001023 , "已存在审核中的设备ID申请"},
{9001024 , "一次查询设备ID数量不能超过50"},
{9001025 , "设备ID不合法"},
{9001026 , "页面ID不合法"},
{9001027 , "页面参数不合法"},
{9001028 , "一次删除页面ID数量不能超过10"},
{9001029 , "页面已应用在设备中,请先解除应用关系再删除"},
{9001030 , "一次查询页面ID数量不能超过50"},
{9001031 , "时间区间不合法"},
{9001032 , "保存设备与页面的绑定关系参数错误"},
{9001033 , "门店ID不合法"},
{9001034 , "设备备注信息过长"},
{9001035 , "设备申请参数不合法"},
{9001036 , "查询起始值begin不合法"}
};
///
/// 错误码
///
public int errcode { get; set; }
///
/// 错误提示
///
public string errmsg { get; set; }
///
/// 获取是否为成功消息
///
///
public bool IsSuccess
{
get
{
return errcode == SuccessCode;
}
}
///
/// 获取汉字错误提示
///
///
public string ChineseMessage
{
get
{
return GetChineseMessage(errcode, errmsg);
}
}
///
/// 获取汉字错误提示
///
/// 错误码
/// 错误提示
/// 返回汉字错误提示
internal static string GetChineseMessage(int errcode, string errmsg = null)
{
string msg = errmsg;
if (ErrorDictionary.ContainsKey(errcode))
msg = ErrorDictionary[errcode];
return msg;
}
///
/// 构造函数
///
/// 错误码
/// 错误提示
public ErrorMessage(int _errcode, string _errmsg)
{
errcode = _errcode;
errmsg = _errmsg;
}
///
/// 构造函数
///
/// 异常
public ErrorMessage(Exception e)
{
errcode = ExceptionCode;
errmsg = string.Format("异常源:{0}\r\n错误描述:{1}\r\n堆栈:{2}", e.Source, e.Message, e.StackTrace);
}
///
/// 返回错误消息字符串
///
///
public override string ToString()
{
return string.Format("编码:{0}\r\n提示:{1}", errcode, ChineseMessage ?? "");
}
///
/// 返回JSON字符串
///
///
public string ToJson()
{
return JsonConvert.SerializeObject(this);
}
///
/// 从JSON字符串解析错误消息
///
/// JSON字符串
/// 返回错误消息
internal static ErrorMessage Parse(string json)
{
var em = JsonConvert.DeserializeAnonymousType(json, new { errcode = 0, errmsg = "ok" });
return new ErrorMessage(em.errcode, em.errmsg);
}
///
/// 尝试从JSON字符串解析错误消息
///
/// JSON字符串
/// 如果解析成功,返回错误消息;否则,返回null。
///
internal static bool TryParse(string json, out ErrorMessage msg)
{
bool success = false;
msg = null;
try
{
msg = Parse(json);
success = true;
}
catch { }
return success;
}
///
/// 判断JSON字符串是否为错误消息
///
/// JSON字符串
/// 如果是,返回true;否则,返回false。
internal static bool IsErrorMessage(string json)
{
JObject jo = JObject.Parse(json);
JToken jt;
return jo.TryGetValue("errcode", out jt) && jo.TryGetValue("errmsg", out jt);
}
}
}