golang實現手機號驗證碼登入

1. 調用的時序圖

 

2. 安裝redis

因爲短息驗證碼是存在redis服務中,所以需要安裝redis,redis的安裝比較簡單可以自行安裝即可。

3.  啓動redis

4. 監聽端口代碼

package main

import (
	"fmt"
	"log"
	"net/http"
	"src/login"
)

func main() {
	fmt.Println("server start")
	http.HandleFunc("/login", loginByPassword)
	// 獲取驗證碼
	http.HandleFunc("/getPhoneCode", getPhoneCode)
	// 校驗驗證碼
	http.HandleFunc("/checkCode", checkCode)
	if err := http.ListenAndServe(":8888", nil); err != nil{
		log.Fatal("Server error", err)
	}
	fmt.Println("server out")
}

func loginByPassword(w http.ResponseWriter, r *http.Request)  {
	login.Login(w, r)
}

func getPhoneCode(w http.ResponseWriter, r *http.Request)  {
	login.GetPhoneCode(w, r)
}

func checkCode(w http.ResponseWriter, r *http.Request)  {
	login.CheckCode(w, r)
}





5. 獲取驗證碼及調用短息服務

// 獲取手機號驗證碼
func GetPhoneCode(w http.ResponseWriter, r *http.Request)  {
	var result pojo.Resp
	query := r.URL.Query()
	phone := query["phone"][0]
	// 1.手機號校驗
	// 2.獲取隨機驗證碼
	code := randCode()
	// 3. redis記錄
	redis.SetMini(phone, code,5)
	// 4. 異步發送驗證碼
	go func() {
		// time.Sleep(time.Duration(10)*time.Second)
		send(phone, code)
	}()
	// 5.返回
	result.Msg = "success"
	result.Data = code
	if err := json.NewEncoder(w).Encode(result); err != nil {
		log.Fatal(err)
	}
}

6. 隨機生成6位數短息驗證碼

// 6位隨機驗證碼
func randCode() string {
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	rndCode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
	fmt.Println(rndCode)
	return rndCode
}

7. redis的連接

package redis
import (
	"log"
	"strconv"
	"github.com/go-redis/redis"
	"fmt"
)

var server = "127.0.0.1"
var port = 6379
var password = ""
var db = 0
// 注意int轉字符串
var addr  = server + ":" + strconv.Itoa(port)

/*
 基於go-redis
 github地址:https://github.com/go-redis/redis
 redis連接demo,連接數等自行設置
*/
func  GetClient() (clint *redis.Client) {
	fmt.Println(addr)
	fmt.Println(port)
	client := redis.NewClient(&redis.Options{
		Addr:     addr,
		Password: password, // no password set
		DB:       db,  // use default DB
	})

	pong, err := client.Ping().Result()
	log.Println(pong, err)
	return client
}

8. redis的工具類型如get或set

package redis

import (
	"github.com/go-redis/redis"
	_ "github.com/go-redis/redis"
	"time"
)

/*
 基於go-redis
 github地址:https://github.com/go-redis/redis
 設置小時demo
*/
func SetHour() (result *redis.StatusCmd) {
	client := GetClient()
	// 注意time.Hour 要乘以一個具體的數值
	set := client.Set("hour", "3個小時", time.Hour*3)
	return set
}

/*
 基於go-redis
 github地址:https://github.com/go-redis/redis
 設置分鐘demo
*/
func SetMini(key string, value string, i int64) (result *redis.StatusCmd) {
	client := GetClient()
	// 注意time.Minute 要乘以一個具體的數值
	set := client.Set(key, value, time.Duration(i) * time.Minute)
	return set
}

/*
 基於go-redis
 github地址:https://github.com/go-redis/redis
 get的demo
*/
func Get(key string) string {
	c := GetClient()
	get := c.Get(key)
	result, _ := get.Result()
	return result
}

9. 基本的代碼如上,如有疑問或需要源碼歡迎留言溝通。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章