golang获取小程序手机号
1、获取手机号需要用到accessToken,所以先获取accessToken
//小程序全局唯一后台接口调用凭据,token有效期为7200s
var ACCESS_TOKEN = ""
initAssessToken()
2、定时获取并修改ACCESS_TOKEN
func initAssessToken() {
freshTokenTicker := time.NewTicker(7000 * time.Second)
accessToken, err := requestToken(appid, secret)
if err != nil {
panic(err)
}
ACCESS_TOKEN = accessToken
go func() {
for range freshTokenTicker.C {
accessToken, err = requestToken(appid, secret)
if err != nil {
panic(err)
}
ACCESS_TOKEN = accessToken
}
}()
}
/*获取小程序token*/
func requestToken(appid, secret string) (string, error) {
u, err := url.Parse("https://api.weixin.qq.com/cgi-bin/token")
if err != nil {
log.Fatal(err)
}
paras := &url.Values{}
paras.Set("appid", appid)
paras.Set("secret", secret)
paras.Set("grant_type", "client_credential")
u.RawQuery = paras.Encode()
resp, err := http.Get(u.String())
if resp != nil && resp.Body != nil {
defer resp.Body.Close()
}
if err != nil {
return "", errors.New("request token err :" + err.Error())
}
jMap := make(map[string]interface{})
err = json.NewDecoder(resp.Body).Decode(&jMap)
if err != nil {
return "", errors.New("request token response json parse err :" + err.Error())
}
if jMap["errcode"] == nil || jMap["errcode"] == 0 {
accessToken, _ := jMap["access_token"].(string)
return accessToken, nil
} else {
errcode := jMap["errcode"].(string)
errmsg := jMap["errmsg"].(string)
err = errors.New(errcode + ":" + errmsg)
return "", err
}
}
3、最后获取手机号
func wxgetphone() error {
url := "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s"
url = fmt.Sprintf(url, ACCESS_TOKEN)
var reqMap = make(map[string]interface{}, 0)
reqMap["code"] = 从小程序端获取到的code
jsonData, err := json.Marshal(reqMap)
if err != nil {
return err
}
client := &http.Client{}
req, err := http.NewRequest("POST", url, bytes.NewReader(jsonData))
if err != nil {
return err
}
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()
var jMap JMapInfo
err = json.NewDecoder(resp.Body).Decode(&jMap)
if jMap.Errcode == 0 {
//jMap.Phone_info 手机号在里面
}
return nil
}
/*wx返回接收手机号*/
type JMapInfo struct {
Errcode int
Errmsg string
Phone_info PhoneInfo
}
type PhoneInfo struct {
PhoneNumber string
PurePhoneNumber string
CountryCode string
}