ErrorMessage.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320
  1. using Newtonsoft.Json;
  2. using Newtonsoft.Json.Linq;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. namespace LYFZ.Weixin.SDK
  8. {
  9. /// <summary>
  10. /// 错误信息
  11. /// </summary>
  12. public class ErrorMessage
  13. {
  14. /// <summary>
  15. /// 成功对应的错误码
  16. /// </summary>
  17. public const int SuccessCode = 0;
  18. /// <summary>
  19. /// 成功
  20. /// </summary>
  21. public static readonly ErrorMessage Success = new ErrorMessage(SuccessCode, "请求成功");
  22. /// <summary>
  23. /// 异常
  24. /// </summary>
  25. public static readonly ErrorMessage Exception = new ErrorMessage(ExceptionCode, "请求异常");
  26. /// <summary>
  27. /// 程序异常对应的错误代码
  28. /// </summary>
  29. public const int ExceptionCode = -99999;
  30. /// <summary>
  31. /// 错误字典
  32. /// </summary>
  33. public static Dictionary<int, string> ErrorDictionary = new Dictionary<int, string>()
  34. {
  35. {-1 , "系统繁忙"},
  36. {0 , "请求成功"},
  37. {40001 , "获取access_token时AppSecret错误,或者access_token无效"},
  38. {40002 , "不合法的凭证类型"},
  39. {40003 , "不合法的OpenID"},
  40. {40004 , "不合法的媒体文件类型"},
  41. {40005 , "不合法的文件类型"},
  42. {40006 , "不合法的文件大小"},
  43. {40007 , "不合法的媒体文件id"},
  44. {40008 , "不合法的消息类型"},
  45. {40009 , "不合法的图片文件大小"},
  46. {40010 , "不合法的语音文件大小"},
  47. {40011 , "不合法的视频文件大小"},
  48. {40012 , "不合法的缩略图文件大小"},
  49. {40013 , "不合法的APPID"},
  50. {40014 , "不合法的access_token"},
  51. {40015 , "不合法的菜单类型"},
  52. {40016 , "不合法的按钮个数"},
  53. {40017 , "不合法的按钮个数"},
  54. {40018 , "不合法的按钮名字长度"},
  55. {40019 , "不合法的按钮KEY长度"},
  56. {40020 , "不合法的按钮URL长度"},
  57. {40021 , "不合法的菜单版本号"},
  58. {40022 , "不合法的子菜单级数"},
  59. {40023 , "不合法的子菜单按钮个数"},
  60. {40024 , "不合法的子菜单按钮类型"},
  61. {40025 , "不合法的子菜单按钮名字长度"},
  62. {40026 , "不合法的子菜单按钮KEY长度"},
  63. {40027 , "不合法的子菜单按钮URL长度"},
  64. {40028 , "不合法的自定义菜单使用用户"},
  65. {40029 , "不合法的oauth_code"},
  66. {40030 , "不合法的refresh_token"},
  67. {40031 , "不合法的openid列表"},
  68. {40032 , "不合法的openid列表长度"},
  69. {40033 , "不合法的请求字符,不能包含\\uxxxx格式的字符"},
  70. {40035 , "不合法的参数"},
  71. {40038 , "不合法的请求格式"},
  72. {40039 , "不合法的URL长度"},
  73. {40050 , "不合法的分组id"},
  74. {40051 , "分组名字不合法"},
  75. {41001 , "缺少access_token参数"},
  76. {41002 , "缺少appid参数"},
  77. {41003 , "缺少refresh_token参数"},
  78. {41004 , "缺少secret参数"},
  79. {41005 , "缺少多媒体文件数据"},
  80. {41006 , "缺少media_id参数"},
  81. {41007 , "缺少子菜单数据"},
  82. {41008 , "缺少oauthcode"},
  83. {41009 , "缺少openid"},
  84. {42001 , "access_token超时"},
  85. {42002 , "refresh_token超时"},
  86. {42003 , "oauth_code超时"},
  87. {43001 , "需要GET请求"},
  88. {43002 , "需要POST请求"},
  89. {43003 , "需要HTTPS请求"},
  90. {43004 , "需要接收者关注"},
  91. {43005 , "需要好友关系"},
  92. {44001 , "多媒体文件为空"},
  93. {44002 , "POST的数据包为空"},
  94. {44003 , "图文消息内容为空"},
  95. {44004 , "文本消息内容为空"},
  96. {45001 , "多媒体文件大小超过限制"},
  97. {45002 , "消息内容超过限制"},
  98. {45003 , "标题字段超过限制"},
  99. {45004 , "描述字段超过限制"},
  100. {45005 , "链接字段超过限制"},
  101. {45006 , "图片链接字段超过限制"},
  102. {45007 , "语音播放时间超过限制"},
  103. {45008 , "图文消息超过限制"},
  104. {45009 , "接口调用超过限制"},
  105. {45010 , "创建菜单个数超过限制"},
  106. {45015 , "回复时间超过限制"},
  107. {45016 , "系统分组,不允许修改"},
  108. {45017 , "分组名字过长"},
  109. {45018 , "分组数量超过上限"},
  110. {46001 , "不存在媒体数据"},
  111. {46002 , "不存在的菜单版本"},
  112. {46003 , "不存在的菜单数据"},
  113. {46004 , "不存在的用户"},
  114. {47001 , "解析JSON/XML内容错误"},
  115. {48001 , "api功能未授权"},
  116. {50001 , "用户未授权该api"},
  117. //客服管理接口错误码
  118. {61450 , "系统错误(system error)"},
  119. {61451 , "参数错误(invalid parameter)"},
  120. {61452 , "无效客服账号(invalid kf_account)"},
  121. {61453 , "账号已存在(kf_account exsited)"},
  122. {61454 , "账号名长度超过限制(前缀10个英文字符)(invalid kf_acount length)"},
  123. {61455 , "账号名包含非法字符(英文+数字)(illegal character in kf_account)"},
  124. {61456 , "账号个数超过限制(10个客服账号)(kf_account count exceeded)"},
  125. {61457 , "无效头像文件类型(invalid file type)"},
  126. {61458 , "客户正在被其他客服接待(customer accepted by xxx@xxxx)"},
  127. {61459 , "客服不在线(kf offline)"},
  128. {61500 , "日期格式错误"},
  129. {61501 , "日期范围错误"},
  130. //语义理解接口错误码
  131. {7000000 , "请求正常,无语义结果"},
  132. {7000001 , "缺失请求参数"},
  133. {7000002 , "signature 参数无效"},
  134. {7000003 , "地理位置相关配置 1 无效"},
  135. {7000004 , "地理位置相关配置 2 无效"},
  136. {7000005 , "请求地理位置信息失败"},
  137. {7000006 , "地理位置结果解析失败"},
  138. {7000007 , "内部初始化失败"},
  139. {7000008 , "非法 appid(获取密钥失败)"},
  140. {7000009 , "请求语义服务失败"},
  141. {7000010 , "非法 post 请求"},
  142. {7000011 , "post 请求 json 字段无效 "},
  143. {7000030 , "查询 query 太短"},
  144. {7000031 , "查询 query 太长"},
  145. {7000032 , "城市、经纬度信息缺失"},
  146. {7000033 , "query 请求语义处理失败"},
  147. {7000034 , "获取天气信息失败"},
  148. {7000035 , "获取股票信息失败"},
  149. {7000036 , "utf8 编码转换失败"},
  150. {9001001 , "POST数据参数不合法"},
  151. {9001002 , "远端服务不可用"},
  152. {9001003 , "Ticket不合法"},
  153. {9001004 , "获取摇周边用户信息失败"},
  154. {9001005 , "获取商户信息失败"},
  155. {9001006 , "获取OpenID失败"},
  156. {9001007 , "上传文件缺失"},
  157. {9001008 , "上传素材的文件类型不合法"},
  158. {9001009 , "上传素材的文件尺寸不合法"},
  159. {9001010 , "上传失败"},
  160. {9001020 , "帐号不合法"},
  161. {9001021 , "已有设备激活率低于50%,不能新增设备"},
  162. {9001022 , "设备申请数不合法,必须为大于0的数字"},
  163. {9001023 , "已存在审核中的设备ID申请"},
  164. {9001024 , "一次查询设备ID数量不能超过50"},
  165. {9001025 , "设备ID不合法"},
  166. {9001026 , "页面ID不合法"},
  167. {9001027 , "页面参数不合法"},
  168. {9001028 , "一次删除页面ID数量不能超过10"},
  169. {9001029 , "页面已应用在设备中,请先解除应用关系再删除"},
  170. {9001030 , "一次查询页面ID数量不能超过50"},
  171. {9001031 , "时间区间不合法"},
  172. {9001032 , "保存设备与页面的绑定关系参数错误"},
  173. {9001033 , "门店ID不合法"},
  174. {9001034 , "设备备注信息过长"},
  175. {9001035 , "设备申请参数不合法"},
  176. {9001036 , "查询起始值begin不合法"}
  177. };
  178. /// <summary>
  179. /// 错误码
  180. /// </summary>
  181. public int errcode { get; set; }
  182. /// <summary>
  183. /// 错误提示
  184. /// </summary>
  185. public string errmsg { get; set; }
  186. /// <summary>
  187. /// 获取是否为成功消息
  188. /// </summary>
  189. /// <returns></returns>
  190. public bool IsSuccess
  191. {
  192. get
  193. {
  194. return errcode == SuccessCode;
  195. }
  196. }
  197. /// <summary>
  198. /// 获取汉字错误提示
  199. /// </summary>
  200. /// <returns></returns>
  201. public string ChineseMessage
  202. {
  203. get
  204. {
  205. return GetChineseMessage(errcode, errmsg);
  206. }
  207. }
  208. /// <summary>
  209. /// 获取汉字错误提示
  210. /// </summary>
  211. /// <param name="errcode">错误码</param>
  212. /// <param name="errmsg">错误提示</param>
  213. /// <returns>返回汉字错误提示</returns>
  214. internal static string GetChineseMessage(int errcode, string errmsg = null)
  215. {
  216. string msg = errmsg;
  217. if (ErrorDictionary.ContainsKey(errcode))
  218. msg = ErrorDictionary[errcode];
  219. return msg;
  220. }
  221. /// <summary>
  222. /// 构造函数
  223. /// </summary>
  224. /// <param name="_errcode">错误码</param>
  225. /// <param name="_errmsg">错误提示</param>
  226. public ErrorMessage(int _errcode, string _errmsg)
  227. {
  228. errcode = _errcode;
  229. errmsg = _errmsg;
  230. }
  231. /// <summary>
  232. /// 构造函数
  233. /// </summary>
  234. /// <param name="e">异常</param>
  235. public ErrorMessage(Exception e)
  236. {
  237. errcode = ExceptionCode;
  238. errmsg = string.Format("异常源:{0}\r\n错误描述:{1}\r\n堆栈:{2}", e.Source, e.Message, e.StackTrace);
  239. }
  240. /// <summary>
  241. /// 返回错误消息字符串
  242. /// </summary>
  243. /// <returns></returns>
  244. public override string ToString()
  245. {
  246. return string.Format("编码:{0}\r\n提示:{1}", errcode, ChineseMessage ?? "");
  247. }
  248. /// <summary>
  249. /// 返回JSON字符串
  250. /// </summary>
  251. /// <returns></returns>
  252. public string ToJson()
  253. {
  254. return JsonConvert.SerializeObject(this);
  255. }
  256. /// <summary>
  257. /// 从JSON字符串解析错误消息
  258. /// </summary>
  259. /// <param name="json">JSON字符串</param>
  260. /// <returns>返回错误消息</returns>
  261. internal static ErrorMessage Parse(string json)
  262. {
  263. var em = JsonConvert.DeserializeAnonymousType(json, new { errcode = 0, errmsg = "ok" });
  264. return new ErrorMessage(em.errcode, em.errmsg);
  265. }
  266. /// <summary>
  267. /// 尝试从JSON字符串解析错误消息
  268. /// </summary>
  269. /// <param name="json">JSON字符串</param>
  270. /// <param name="msg">如果解析成功,返回错误消息;否则,返回null。</param>
  271. /// <returns></returns>
  272. internal static bool TryParse(string json, out ErrorMessage msg)
  273. {
  274. bool success = false;
  275. msg = null;
  276. try
  277. {
  278. msg = Parse(json);
  279. success = true;
  280. }
  281. catch { }
  282. return success;
  283. }
  284. /// <summary>
  285. /// 判断JSON字符串是否为错误消息
  286. /// </summary>
  287. /// <param name="json">JSON字符串</param>
  288. /// <returns>如果是,返回true;否则,返回false。</returns>
  289. internal static bool IsErrorMessage(string json)
  290. {
  291. JObject jo = JObject.Parse(json);
  292. JToken jt;
  293. return jo.TryGetValue("errcode", out jt) && jo.TryGetValue("errmsg", out jt);
  294. }
  295. }
  296. }