網易雲信golang介面
阿新 • • 發佈:2019-02-06
友情推廣
網易雲信介紹
詳細資訊請見http://netease.im,進入這個網易雲信官網後,註冊賬號(有網易郵箱的直接登入)。
api介面介紹
- SendCode函式,
- VerifyCode函式
主要通過上述兩個函式,實現簡訊認證過程,第一個函式接收一個引數,即手機號,然後向網易雲信發出訊息,通知其傳送驗證碼到指定的手機上,第二個函式接收兩個引數,第一個引數是手機號,第二個引數是使用者輸入的驗證碼,這個函式用於檢查使用者輸入的驗證碼是否正確。
實現程式碼
package netease
import (
"crypto/sha1"
"crypto/tls"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/http/cookiejar"
"net/url"
"strconv"
"strings"
"time"
"github.com/hzwy23/hauth/logs"
)
type msgCodeInfo struct {
Code int `json:"code"`
Msg string `json:"msg"`
Obj string `json:"obj"`
}
type verifyCode struct {
Code int `json:"code"`
}
var (
msgurl = "https://api.netease.im/sms/sendcode.action"
verifyurl = "https://api.netease.im/sms/verifycode.action"
appKey = "0b5eb2a6a180bbeqw3aa732acbe80e71"
appSecret = "0de6fed20d2e"
nonce = "yph2b"
)
func genSHA1(sec, nonce, curtme string) string {
var sum = sec + nonce + curtme
h := sha1.New()
h.Write( []byte(sum))
bs := h.Sum(nil)
sha := fmt.Sprintf("%x", bs)
return sha
}
func checkCode(message []byte) (*msgCodeInfo, error) {
var msg msgCodeInfo
err := json.Unmarshal(message, &msg)
if err != nil {
logs.Error(err)
return &msg, err
}
if msg.Code != 200 {
return &msg, err
}
return &msg, nil
}
func SendCode(phone string) (*msgCodeInfo, error) {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
DisableCompression: true,
}
client := http.Client{Transport: tr}
client.Jar, _ = cookiejar.New(nil)
var mobile = url.Values{"mobile": {phone}}
req, err := http.NewRequest("POST", msgurl, strings.NewReader(mobile.Encode()))
if err != nil {
logs.Error(err)
return nil, err
}
var curTime = strconv.Itoa(int(time.Now().Unix()))
var checkSum = genSHA1(appSecret, nonce, curTime)
req.Header.Add("AppKey", appKey)
req.Header.Add("Nonce", nonce)
req.Header.Add("CurTime", curTime)
req.Header.Add("CheckSum", checkSum)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req) //傳送
if err != nil {
logs.Error(err)
return nil, err
}
defer resp.Body.Close() //一定要關閉resp.Body
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
logs.Error(err)
return nil, err
}
msg, err := checkCode(data)
if err != nil {
logs.Error(err)
return nil, err
}
return msg, nil
}
func VerifyCode(phone string, code string) (int, bool) {
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
DisableCompression: true,
}
client := http.Client{Transport: tr}
client.Jar, _ = cookiejar.New(nil)
var mobile = url.Values{"mobile": {phone}, "code": {code}}
req, err := http.NewRequest("POST", verifyurl, strings.NewReader(mobile.Encode()))
if err != nil {
logs.Error(err)
return 408, false
}
var curTime = strconv.Itoa(int(time.Now().Unix()))
var checkSum = genSHA1(appSecret, nonce, curTime)
req.Header.Add("AppKey", appKey)
req.Header.Add("Nonce", nonce)
req.Header.Add("CurTime", curTime)
req.Header.Add("CheckSum", checkSum)
req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
resp, err := client.Do(req) //傳送
if err != nil {
logs.Error(err)
return 405, false
}
defer resp.Body.Close() //一定要關閉resp.Body
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
logs.Error(err)
return 406, false
}
var ret verifyCode
err = json.Unmarshal(data, &ret)
if err != nil {
logs.Error(err)
return 407, false
}
if ret.Code == 200 {
return ret.Code, true
} else {
return ret.Code, false
}
}
程式碼分析
引數資訊列表
- msgurl 是網易的api簡訊認證碼獲取介面,固定不變
- verifyurl 是網易的api簡訊認證介面,固定不變
- appKey 是網易分配給你的賬號key值
- appSecret 是網易分配給你的賬號key的密碼
- nonce是隨機數,自己隨便改。
總結
在簡訊認證的過程中,後臺會獲取傳送給使用者的簡訊認證碼。所以不要在不認識的網站上下輸入,網路化境複雜。如果伺服器被攻克,或者別的什麼高階的手法,還是可以擴過簡訊驗證這道門檻。不要在不明來歷的地方隨便輸入自己的資訊,在想要輸入的地方,看清楚再輸入,提高自我防護意思,才能防止自己的財產免受損失。
tips:看淡這一切,不作惡,平平淡淡的看笑話。