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
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. return value == verifyCode
  69. }
  70. }
  71. func GetPhoneCodeKey(phoneNumber string) string {
  72. return fmt.Sprintf(CODE_PREFIX, phoneNumber)
  73. }
  74. func GetPhoneTimesHKey() string {
  75. today := time.Now().Format("2006-01-02")
  76. return fmt.Sprintf(TIMES_PREFIX, today)
  77. }
  78. func getRemainSecondOfDay(t time.Time) int {
  79. return 86400 - 60*60*t.Hour() + 60*t.Minute() + t.Second()
  80. }