赞
踩
项目开发中用到了小程序手机号码一键登录功能,这里简单记录一下流程,如有其他见解,欢迎留言讨论~
开发流程大致如下图
微信官方文档中已经有蛮详细的流程了,这里大致记录一下代码部分的实现
根据官方文档可以看出,获取手机号码可直接调用接口
POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
请求参数中有两项必传的参数:access_token,code
我们需要先获取一下access_token,至于code,就交给前端的同学来获取
直接调用接口:
https://api.weixin.qq.com/cgi-bin/stable_token
需要传入的参数有:appid,secret和grant_type,appid和secret可以由小程序管理者查看,grant_type是固定值client_credential。
这里我们可以创建一个map将需要传入的参数包进去,然后发送一个Post请求,通过解析就能获取到access_code
//创建一个GetToken 结构体用于解析响应,其中ExpiresIn 表示AccessToken 的过期时间 type GetToken struct { AccessToken string `json:"access_token"` ExpiresIn int64 `json:"expires_in"` } url := "https://api.weixin.qq.com/cgi-bin/stable_token" tokenMsg := map[string]interface{}{ "appid": "APPID", "secret": "SECRET", "grant_type": "client_credential", } tokenMsgBytes, err := json.Marshal(tokenMsg) if err != nil { return "", nil } tokenUrl, err := http.Post(url, "application/json", bytes.NewBuffer(tokenMsgBytes)) if err != nil { return "", nil } defer tokenUrl.Body.Close() //解析响应体 var getToken dto.GetToken if err := json.NewDecoder(tokenUrl.Body).Decode(&getToken); err != nil { return "", err } accessToken := getToken.AccessToken
接口的返回参数有很多,我们需要先创建一个结构体用来存储返回值
// PhoneNumberResponse 响应体结构
type PhoneNumberResponse struct {
ErrCode int `json:"errcode"`
ErrMsg string `json:"errmsg"`
PhoneInfo struct {
PhoneNumber string `json:"phoneNumber"`
PurePhoneNumber string `json:"purePhoneNumber"`
CountryCode string `json:"countryCode"`
Watermark struct {
Timestamp int `json:"timestamp"`
AppID string `json:"appid"`
} `json:"watermark"`
} `json:"phone_info"`
}
接下来就是和上面一样的操作了,将参数包进map中,发送post请求获取返回值,对返回值进行解析就能得到我们想要的结果啦
需要注意的是,这里面的access_token需要使用拼接的方式传参
//首先拿到前端传来的code var req dto.PhoneNumberRequest err := c.Bind(&req) //用获取到的token和前端传入的code获取电话号码 numUrl := "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + accessToken codeMsg := map[string]interface{}{ "code": req.Code, } codeMsgBytes, err := json.Marshal(codeMsg) resUrl, err := http.Post(numUrl, "application/json", bytes.NewBuffer(codeMsgBytes)) if err != nil { return "", nil } defer resUrl.Body.Close() //解析响应体 var result dto.PhoneNumberResponse if err := json.NewDecoder(resUrl.Body).Decode(&result); err != nil { return "", err } if result.ErrMsg != "ok" { return "", err } return result.PhoneInfo.PhoneNumber, nil
之后的操作就是使用得到的手机号码进行注册/登录操作了,这里就不过多赘述了~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。