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.2 kB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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.SET(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. err = redis_client.HINCRBY(conn, timesKey, phoneNumber, 1)
  45. if err != nil {
  46. return err
  47. }
  48. }
  49. return nil
  50. }
  51. func IsVerifyCodeRight(phoneNumer string, verifyCode string) bool {
  52. if phoneNumer == "" {
  53. return false
  54. }
  55. value, err := redis_client.Get(GetPhoneCodeKey(phoneNumer))
  56. if err != nil {
  57. log.Warn("redis err", err)
  58. return false
  59. } else {
  60. if value == "" {
  61. return false
  62. }
  63. return value == verifyCode
  64. }
  65. }
  66. func GetPhoneCodeKey(phoneNumber string) string {
  67. return fmt.Sprintf(CODE_PREFIX, phoneNumber)
  68. }
  69. func GetPhoneTimesHKey() string {
  70. today := time.Now().Format("2006-01-02")
  71. return fmt.Sprintf(TIMES_PREFIX, today)
  72. }
  73. func getRemainSecondOfDay(t time.Time) int {
  74. return 86400 - 60*60*t.Hour() - 60*t.Minute() - t.Second()
  75. }