You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

phone.go 2.4 kB

3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package phone
  2. import (
  3. "fmt"
  4. "time"
  5. "code.gitea.io/gitea/modules/log"
  6. "code.gitea.io/gitea/modules/phone"
  7. "code.gitea.io/gitea/modules/redis/redis_client"
  8. "code.gitea.io/gitea/modules/setting"
  9. "github.com/gomodule/redigo/redis"
  10. )
  11. //验证码存储前缀 使用时%s用手机号替代
  12. const CODE_PREFIX = "P_C:%s"
  13. //手机号发送验证码次数Hkey,%s对应日期, 存储在hset中,值是hashet,记录手机号和发送次数
  14. const TIMES_PREFIX = "P_T:%s"
  15. func GetPhoneNumberSendTimes(conn redis.Conn, phoneNumber string) (int, error) {
  16. i, err := redis_client.HGET(conn, GetPhoneTimesHKey(), phoneNumber)
  17. return redis.Int(i, err)
  18. }
  19. func GetPhoneCodeTTL(conn redis.Conn, phoneNumber string) (int, error) {
  20. return redis_client.Ttl(conn, GetPhoneCodeKey(phoneNumber))
  21. }
  22. func SendVerifyCode(conn redis.Conn, phoneNumber string) error {
  23. timesKey := GetPhoneTimesHKey()
  24. exists, err := redis_client.EXISTS(conn, timesKey)
  25. if err != nil {
  26. return err
  27. }
  28. code := phone.GenerateVerifyCode(setting.PhoneService.VerifyCodeLength)
  29. err = phone.SendVerifyCode(phoneNumber, code)
  30. if err != nil {
  31. return err
  32. }
  33. redis_client.SETNX(conn, GetPhoneCodeKey(phoneNumber), code, setting.PhoneService.CodeTimeout)
  34. if !exists {
  35. err = redis_client.HSETNX(conn, timesKey, phoneNumber, 1)
  36. if err != nil {
  37. return err
  38. }
  39. err = redis_client.Expire(conn, timesKey, getRemainSecondOfDay(time.Now()))
  40. if err != nil {
  41. return err
  42. }
  43. } else {
  44. timesPhoneExists, err := redis_client.HEXISTS(conn, timesKey, phoneNumber)
  45. if err != nil {
  46. return err
  47. }
  48. if timesPhoneExists {
  49. err = redis_client.HINCRBY(conn, timesKey, phoneNumber, 1)
  50. } else {
  51. err = redis_client.HSETNX(conn, timesKey, phoneNumber, 1)
  52. }
  53. if err != nil {
  54. return err
  55. }
  56. }
  57. return nil
  58. }
  59. func IsVerifyCodeRight(phoneNumer string, verifyCode string) bool {
  60. if phoneNumer == "" {
  61. return false
  62. }
  63. value, err := redis_client.Get(GetPhoneCodeKey(phoneNumer))
  64. if err != nil {
  65. log.Warn("redis err", err)
  66. return false
  67. } else {
  68. if value==""{
  69. return false
  70. }
  71. return value == verifyCode
  72. }
  73. }
  74. func GetPhoneCodeKey(phoneNumber string) string {
  75. return fmt.Sprintf(CODE_PREFIX, phoneNumber)
  76. }
  77. func GetPhoneTimesHKey() string {
  78. today := time.Now().Format("2006-01-02")
  79. return fmt.Sprintf(TIMES_PREFIX, today)
  80. }
  81. func getRemainSecondOfDay(t time.Time) int {
  82. return 86400 - 60*60*t.Hour() + 60*t.Minute() + t.Second()
  83. }