UniApp开发H5接入微信登录的全过程
作者:CodeXu-cyber 时间:2024-04-10 16:21:13
最近的uniapp开发中遇到了H5调微信授权登录的业务,记录一下解决方法
微信授权
微信授权分为两种类型:
静默授权:scope=snsapi_base。没有弹窗,只能获取到用户的openid。
非静默授权:scope=snsapi_userinfo。有弹窗,需要用户手动点击同意授权,可获取到用户的openid、昵称、头像、性别。
以下为官方文档中对两种授权的解释
关于网页授权的两种scope的区别说明
1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
微信授权的流程:
微信开放文档 (qq.com)
在微信的开放文档中有详细的说明,建议先阅读文档理清思路
解决思路
明白了具体的授权流程之后我们就可以来实现我们的业务了
1.正则匹配请求地址中的参数函数
getUrlCode(name) {
return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) ||[, ''])[1].replace(/\+/g, '%20')) || null
},
2.进入页面时调用这个函数去看地址中有没有code参数
getCode() {
let code = this.getUrlCode('code')
if (code === null || code === '') {
window.location.href = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=' +
this.$common.wx.appID +
'&redirect_uri=' + encodeURIComponent(this.$common.wx.wxcallback) +
'&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect'
} else {
uni.$u.http.get('/rest/getOpenId', {
params: {
code: code
}
}).then(res => {
let openId = res.openid;
if (openId != null && openId != '') {
this.openId = openId
console.log(this.openId)
}
}).catch(err => {
})
}
},
如果没有code参数的话则请求微信官方的接口并获取包含code的回调链接
3.使用code换取openid及access_token等参数
当链接中有code的时候携带code请求下一个接口去获取openid和access_token等参数,这部分我是用Java写的后端来实现的,代码如下:
package tech.niua.rest.H5Controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import tech.niua.admin.common.constant.WeiXinProperties;
import tech.niua.common.model.ResultCode;
import tech.niua.common.model.ResultJson;
import tech.niua.core.annotation.Log;
import java.io.IOException;
@RestController
@RequestMapping("/rest")
public class H5Controller {
@Autowired
WeiXinProperties weiXinProperties;
/**
* 根据code获取openid
*
* @param code
* @return
*/
@Log(value = "根据code获取openid")
@GetMapping("/getOpenId")
public ResultJson getOpenId(String code) throws IOException {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?&appid=" + weiXinProperties.getAppid() + "&secret=" + weiXinProperties.getAppSecret() + "&code=" + code + "&grant_type=authorization_code";
CloseableHttpClient client = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
CloseableHttpResponse res = client.execute(httpGet);
if (res.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = res.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
JSONObject jsonObject = JSON.parseObject(result);
return ResultJson.ok(jsonObject);
}
return ResultJson.failure(ResultCode.BAD_REQUEST);
}
}
请求成功的话微信的接口会返回类似如下参数
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
参数说明
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID |
scope | 用户授权的作用域,使用逗号(,)分隔 |
请求错误时会返回如下
{"errcode":40029,"errmsg":"invalid code"}
4.拉取用户信息(需scope为 snsapi_userinfo)
如果网页授权作用域为snsapi_userinfo,则此时开发者可以通过access_token和openid拉取用户信息了。
请求方法
http:GET(请使用https协议) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
参数说明
参数 | 描述 |
---|---|
access_token | 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同 |
openid | 用户的唯一标识 |
lang | 返回国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语 |
返回说明
正确时返回的JSON数据包如下:
{
"openid": "OPENID",
"nickname": NICKNAME,
"sex": 1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl":"https://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 | 描述 |
---|---|
openid | 用户的唯一标识 |
nickname | 用户昵称 |
sex | 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知 |
province | 用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空。若用户更换头像,原有头像URL将失效。 |
privilege | 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom) |
unionid | 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。 |
错误时微信会返回JSON数据包如下(示例为openid无效):
{"errcode":40003,"errmsg":" invalid openid "}
这样业务就实现了,具体的其他接口请参照
微信开放文档 (qq.com)https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
来源:https://blog.csdn.net/qq_16469323/article/details/123076104
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
python3简单实现微信爬虫
jquery在vue脚手架中的使用方式示例
程序员的七夕用30行代码让Python化身表白神器
![](https://img.aspxhome.com/file/2023/3/113153_0s.png)
Python matplotlib模块及柱状图用法解析
![](https://img.aspxhome.com/file/2023/5/117335_0s.png)
ASP.NET(AJAX+JSON)实现对象调用
Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度
![](https://img.aspxhome.com/file/2023/5/62895_0s.png)
keras和tensorflow使用fit_generator 批次训练操作
如何从数据库断开recordset,提高运行速度?
如何从Python的cmd中获得.py文件参数
![](https://img.aspxhome.com/file/2023/3/131273_0s.png)
Python实现登录接口的示例代码
![](https://img.aspxhome.com/file/2023/1/118721_0s.jpg)
tensorflow ckpt模型和pb模型获取节点名称,及ckpt转pb模型实例
Jmeter通过OS进程取样器调用Python脚本实现参数互传
![](https://img.aspxhome.com/file/2023/8/68958_0s.png)
MySQL 多表关联一对多查询实现取最新一条数据的方法示例
简单介绍各种浏览器中的本地存储方法
golang 实现两个结构体复制字段
滑动展开/收缩广告代码实例效果
python 删除非空文件夹的实例
MySQL的Query Cache原理分析
php中使用session_set_save_handler()函数把session保存到MySQL数据库实例
网站分析方法系列二——分析页面区块价值
![](https://img.aspxhome.com/file/UploadPic/20111/6/javascript-selectors1-57s.jpg)