当前位置:   article > 正文

微信小程序一键获取用户手机号码进行登录认证_小程序自动获取手机号登录

小程序自动获取手机号登录

前言

项目开发中用到了小程序手机号码一键登录功能,这里简单记录一下流程,如有其他见解,欢迎留言讨论~

开发流程

开发流程大致如下图
在这里插入图片描述
微信官方文档中已经有蛮详细的流程了,这里大致记录一下代码部分的实现

具体功能实现流程

根据官方文档可以看出,获取手机号码可直接调用接口

POST https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=ACCESS_TOKEN
  • 1

请求参数中有两项必传的参数:access_token,code
在这里插入图片描述
我们需要先获取一下access_token,至于code,就交给前端的同学来获取

获取access_token

直接调用接口:

https://api.weixin.qq.com/cgi-bin/stable_token
  • 1

需要传入的参数有: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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

解析手机号码

接口的返回参数有很多,我们需要先创建一个结构体用来存储返回值
在这里插入图片描述

// 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"`
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

接下来就是和上面一样的操作了,将参数包进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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

之后的操作就是使用得到的手机号码进行注册/登录操作了,这里就不过多赘述了~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/792038
推荐阅读
相关标签
  

闽ICP备14008679号