err.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package taxerr
  2. import (
  3. "errors"
  4. "git.listensoft.net/tool/jspkit/logger"
  5. "strings"
  6. "github.com/go-rod/rod"
  7. )
  8. // FormatLoginError 格式化错误信息
  9. func FormatLoginError(str string) error {
  10. logger.Info("原始错误信息 - ", str)
  11. if strings.Contains(str, "短信发送次数超限") {
  12. return TelSmsOverrun
  13. }
  14. if strings.Contains(str, "手机号不在线") {
  15. return SmsUnOnline
  16. }
  17. if strings.Contains(str, "请调用发送验证码") || strings.Contains(str, "您的登录已掉线,请重新授权后再次发起任务") {
  18. return TelOffline
  19. }
  20. if strings.Contains(str, "手机验证码接收失败") || strings.Contains(str, "服务未获取到短信验证码") {
  21. return SmsCodeNotReceived
  22. }
  23. if strings.Contains(str, "连续认证错误次数过多") || strings.Contains(str, "次输入个人用户密码错误") || strings.Contains(str, "次输入密码错误") {
  24. return PasswdLockError
  25. }
  26. if strings.Contains(str, "输入的短信验证码错误") {
  27. return TelSmsError
  28. }
  29. if strings.Contains(str, "输入的个人账号或密码错误") {
  30. return PasswdError
  31. }
  32. if strings.Contains(str, "税局服务繁忙") {
  33. return TaxAbnormalError(true)
  34. }
  35. if strings.Contains(str, "输入的统一社会信用代码或纳税人识别号错误") {
  36. return TaxNoError
  37. }
  38. if strings.Contains(str, "未查询到您与该企业的关联关系") {
  39. return ComIrrelevantRelationError
  40. }
  41. if strings.Contains(str, "未查询到您与该代理企业的关联关系信息") {
  42. return NewUserV3("税局提示:未查询到您与该代理企业的关联关系信息", "请确认录入的信息是否正确")
  43. }
  44. if strings.Contains(str, "办税人登录信息与企业无关联关系") {
  45. return ComIrrelevantRelationError
  46. }
  47. if strings.Contains(str, "税局服务繁忙") || strings.Contains(str, `登录失败~`) || strings.Contains(str, "内部异常:") ||
  48. strings.Contains(str, "应用令牌无效") || str == "税局服务异常,请稍后重试" ||
  49. strings.Contains(str, "渠道认证") {
  50. // {"code":-1,"data":{},"message":"内部异常:error parse true"}
  51. // {"code":-1,"data":{},"message":"登录失败~syntax error, pos 1, json : Read timed out"}
  52. return TaxAbnormalError(true)
  53. }
  54. if strings.Contains(str, "手机号码不存在") {
  55. return NewUserV3("税局提示:手机号码不存在", "您可以尝试使用证件号码登录")
  56. }
  57. if strings.Contains(str, "您与该企业的绑定关系已过期") {
  58. return NewUserV3("税局提示:您与该企业的绑定关系已过期", "请重新绑定版税身份后重试")
  59. }
  60. if strings.Contains(str, "请在自然人业务入口进行用户注册") {
  61. return UnRegisteredError
  62. }
  63. if strings.Contains(str, "登记企业信息不存在") {
  64. return NewSystemV3("税局提示:登记企业信息不存在", "请核实")
  65. }
  66. if strings.Contains(str, "查询到您与该企业的关联关系信息仍未确认,请确认是否扫脸或稍后再试") {
  67. return NewUserV3(`税局提示:查询到您与该企业的关联关系信息仍未确认,请确认是否扫脸或稍后再试`, "请核实该企业与办税员绑定是否正常")
  68. }
  69. if strings.Contains(str, "请先完成扫脸认证") || strings.Contains(str, "请前往税务APP扫脸认证身份") {
  70. return NewUser(str)
  71. }
  72. if strings.Contains(str, "输入的个人账号、密码或报税手机号错误,请重新输入!") {
  73. return TaxNotMatch
  74. }
  75. if strings.Contains(str, `确认成为该企业办税人失败,请在网站自行扫脸验证确认后使用`) {
  76. return FaceVerifyError
  77. }
  78. if strings.Contains(str, "请核对账套内填写的手机号") || strings.Contains(str, "请自行确认为该企业内的身份2") {
  79. return NewUser(str)
  80. }
  81. // 扫码失败或者login一分钟超时后等等待一分钟扫码失败
  82. if strings.Contains(str, "请登陆后再操作") || strings.Contains(str, "请先完成登录,再执行此项业务") {
  83. return TaxAbnormalError(true)
  84. }
  85. if strings.Contains(str, "不存在用户") || strings.Contains(str, "返回当前用户") {
  86. return NewUser("代理登录未绑定该企业,请先去税局绑定")
  87. }
  88. if strings.Contains(str, "税号错误") {
  89. return NewUserV3(`输入的纳税人识别号与公司名不匹配`, `请在“企业信息”修改后重试`)
  90. }
  91. if strings.Contains(str, "您使用短信验证码过于频繁") || strings.Contains(str, "短信发送申请过于频繁") {
  92. return NewUser("税局提示:您使用短信验证码过于频繁")
  93. }
  94. if strings.Contains(str, "请先完成渠道认证") {
  95. return NewUserV3(`请先完成渠道认证`, `再执行此项业务`)
  96. }
  97. return New(str)
  98. }
  99. // TaskErrMsg 尝试从错误中提取任务错误信息
  100. func TaskErrMsg(err error) (string, bool) {
  101. if se := new(SystemErr); errors.As(err, &se) {
  102. return se.Msg, true
  103. }
  104. if ue := new(UserErr); errors.As(err, &ue) {
  105. return ue.Msg, true
  106. }
  107. return "", false
  108. }
  109. // AsTaskErr 尝试将错误强转为 tax 错误
  110. func AsTaskErr(err error) (error, bool) {
  111. if se := new(SystemErr); errors.As(err, &se) {
  112. return se, true
  113. }
  114. if ue := new(UserErr); errors.As(err, &ue) {
  115. return ue, true
  116. }
  117. return nil, false
  118. }
  119. func M(err error) {
  120. if err != nil {
  121. panic(err)
  122. }
  123. }
  124. func E[T any](t T, err error) T {
  125. if err != nil {
  126. panic(err)
  127. }
  128. return t
  129. }
  130. // U 尝试解析 rod.Try 返回 err 的底层 error
  131. func U(err error) error {
  132. if err == nil {
  133. return nil
  134. }
  135. te := new(rod.TryError)
  136. if !errors.As(err, &te) {
  137. return err
  138. }
  139. ue := errors.Unwrap(te)
  140. if ue == nil {
  141. return te
  142. }
  143. return ue
  144. }