本篇文章为你整理了微信登录(微信登录操作频繁多久可以恢复)的详细内容,包含有微信登录不上怎么办 微信登录操作频繁多久可以恢复 微信登录过的设备有其他设备,是被监控了吗 微信登录密码忘记了怎么找回 微信登录,希望能帮助你了解 微信登录。
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:wx.properties")
@ConfigurationProperties(prefix = "wx.open")
@Data
public class ConstantProperties {
private String appId;
private String appSecret;
private String redirectUri;
}
前端请求方法
//切换微信登录
weixinLogin() {
this.dialogAtrr.showLoginType = weixin
user.getQRCodeParams().then((response) = {
new WxLogin({
//true:手机单击确认后可以在iframe内跳转到redirecturl
//false :手机单击确认登录后可以在top window 跳转到redirecturl
self_redirect: false,
id: weixinLogin, // 显示二维码的容器id
appid: response.data.appid,
scope: response.data.scope,
redirect_uri: response.data.redirectUri,
state: response.data.state,
style: black, // 提供"black"、"white"可选。二维码的样式
href: , // 外部css文件url,需要https
},
前端api
//获得微信登录二维码的相关参数
getQRCodeParams(){
return request({
url : `/api/user/wx/getQRCodeParams`,
method : `get`
},
生成二维码以及回调函数
api文档:网站应用微信登录开发指南
package com.atguigu.yygh.user.controller.api;
import com.atguigu.yygh.common.exception.YyghException;
import com.atguigu.yygh.common.result.R;
import com.atguigu.yygh.common.result.ResultCode;
import com.atguigu.yygh.common.utils.JwtHelper;
import com.atguigu.yygh.model.user.UserInfo;
import com.atguigu.yygh.user.service.UserInfoService;
import com.atguigu.yygh.user.utils.ConstantProperties;
import com.atguigu.yygh.user.utils.HttpClientUtils;
import com.google.gson.Gson;
import com.sun.org.apache.regexp.internal.RE;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.utils.URLEncodedUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import sun.net.util.URLUtil;
import javax.net.ssl.HttpsURLConnection;
import javax.servlet.http.HttpSession;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.UUID;
@Api(tags = "微信扫码登录")
@Controller //注意这里没有配置@restcontroller
@RequestMapping("/api/user/wx")
@Slf4j
public class ApiWxController {
@Autowired
private ConstantProperties constantProperties;
@Autowired
private UserInfoService userInfoService;
* 方法一: 在新的页面打开显示二维码
@GetMapping("/getQRCodeUrl")
public String getQRCodeUrl(HttpSession session){
try {
//处理回调url
String redirectUrl = URLEncoder.encode(constantProperties.getRedirectUri(), "UTF-8");
//处理state :生成随机数,存入session
String state = UUID.randomUUID().toString();
log.info("生成的state = "+ state);
session.setAttribute("wx_open_state",state);
String qrcUrl = "https://open.weixin.qq.com/connect/qrconnect" +
"?appid=" + constantProperties.getAppId() +
" redirect_uri=" + redirectUrl +
" response_type=code" +
" scope=snsapi_login" +
" state=" + state +
"#wechat_redirect";
return "redirect:" + qrcUrl;
} catch (UnsupportedEncodingException e) {
throw new YyghException(ResultCode.ERROR,"生成二维码错误");
* 在内嵌窗口打开
* @param session
* @return
@GetMapping("/getQRCodeParams")
@ResponseBody
public R getQRCodeParams(HttpSession session){
try {
String redirectUrl = URLEncoder.encode(constantProperties.getRedirectUri(), "UTF-8");
String state = UUID.randomUUID().toString();
log.info("生成的state : "+ state);
session.setAttribute("wx_open_state",state);
//组装好返回给前端的数据
HashMap String, Object map = new HashMap ();
map.put("appid",constantProperties.getAppId());
map.put("redirectUri",redirectUrl);
map.put("scope","snsapi_login");
map.put("state",state);
return R.ok().data(map);
} catch (UnsupportedEncodingException e) {
throw new YyghException(ResultCode.ERROR,"生成二维码错误");
回调
在配置文件中设置回调函数
# 微信开放平台 重定向url
wx.open.redirect_uri=http://localhost:9001/api/user/wx/callback
#在下文中背景颜色为红色
@GetMapping("/callback")
public String callback(String code, String state, HttpSession session) {
try {
String sessionState = (String)session.getAttribute("wx_open_state");
//判空操作
if(StringUtils.isEmpty(code) StringUtils.isEmpty(state) !state.equals(sessionState)){
throw new YyghException(ResultCode.ERROR,"回调参数错误");
//向微信发送请求,请求获得access_tokens
String accessTokenUrl ="https://api.weixin.qq.com/sns/oauth2/access_token" +
"?appid=" + constantProperties.getAppId() +
" secret=" + constantProperties.getAppSecret() +
" code=" + code +
" grant_type=authorization_code";
//使用httpclient发送请求
String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);
//将json转换成map 获取其中的errcode键值 ,来判断相应的成功与否
Gson gson = new Gson();
HashMap String,Object accessTokenInfoMap = gson.fromJson(accessTokenInfo, HashMap.class);
//通过错误码是否存在来判断响应是否成功
if(accessTokenInfoMap.get("errcode") !=null ){ //errcode只要存在就说明有错误
throw new YyghException(ResultCode.ERROR,"获取access_token失败");
//微信获取access_token成功
String openid = (String) accessTokenInfoMap.get("openid");
String accessToken = (String) accessTokenInfoMap.get("access_token");
//根据openid判断数据库中的数据是否存在
UserInfo userInfo= userInfoService.selectWxInfoByOpenId(openid);
if(userInfo==null){
//用户不存在则进行注册操作
//向微信的资源服务器发送请求,获得当前用户的信息
String userInfoUrl ="https://api.weixin.qq.com/sns/userinfo" +
"?access_token=" + accessToken +
" openid=" + openid;
String userInfResult = HttpClientUtils.get(userInfoUrl);
HashMap String,Object userInfResultMap = gson.fromJson(userInfResult, HashMap.class);
//判断响应是否失败,同上
//通过错误码是否存在来判断响应是否成功
if(accessTokenInfoMap.get("errcode") !=null ){ //errcode只要存在就说明有错误
throw new YyghException(ResultCode.ERROR,"获取用户信息失败");
//解析用户信息
String nickname =(String) userInfResultMap.get("nickname");
//用户注册(添加)
userInfo = new UserInfo();
userInfo.setName(nickname);
userInfo.setNickName(nickname);
userInfo.setOpenid(openid);
userInfoService.save(userInfo);
}else {
//用户存在则只需判断用户状态是否可用
if(userInfo.getStatus() == 0){
throw new YyghException(ResultCode.ERROR,"用户已被锁定");
//生成jwt字符串
String token = JwtHelper.createToken(userInfo.getId(), userInfo.getName());
//跳转到前端页面
return "redirect:http://localhost:3000/" +
"?token=" + token +
" name=" + URLEncoder.encode(userInfo.getName(), "utf-8") +
" openid=" + openid +
" phone=" + userInfo.getPhone() ;
} catch (Exception e) {
throw new YyghException(ResultCode.ERROR,"微信登录失败",e);
}
微信用户可获得的数据
工具类
package com.atguigu.yygh.user.utils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.config.RequestConfig.Builder;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicNameValuePair;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import java.io.IOException;
import java.net.SocketTimeoutException;
import java.security.GeneralSecurityException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
* 依赖的jar包有:commons-lang-2.6.jar、httpclient-4.3.2.jar、httpcore-4.3.1.jar、commons-io-2.4.jar
* @author zhaoyb
public class HttpClientUtils {
public static final int connTimeout=10000;
public static final int readTimeout=10000;
public static final String charset="UTF-8";
private static HttpClient client = null;
static {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setMaxTotal(128);
cm.setDefaultMaxPerRoute(128);
client = HttpClients.custom().setConnectionManager(cm).build();
public static String postParameters(String url, String parameterStr) throws ConnectTimeoutException, SocketTimeoutException, Exception{
return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout);
public static String postParameters(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout) throws ConnectTimeoutException, SocketTimeoutException, Exception{
return post(url,parameterStr,"application/x-www-form-urlencoded",charset,connTimeout,readTimeout);
public static String postParameters(String url, Map String, String params) throws ConnectTimeoutException,
SocketTimeoutException, Exception {
return postForm(url, params, null, connTimeout, readTimeout);
public static String postParameters(String url, Map String, String params, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,
SocketTimeoutException, Exception {
return postForm(url, params, null, connTimeout, readTimeout);
public static String get(String url) throws Exception {
return get(url, charset, null, null);
public static String get(String url, String charset) throws Exception {
return get(url, charset, connTimeout, readTimeout);
* 发送一个 Post 请求, 使用指定的字符集编码.
* @param url
* @param body RequestBody
* @param mimeType 例如 application/xml "application/x-www-form-urlencoded" a=1 b=2 c=3
* @param charset 编码
* @param connTimeout 建立链接超时时间,毫秒.
* @param readTimeout 响应超时时间,毫秒.
* @return ResponseBody, 使用指定的字符集编码.
* @throws ConnectTimeoutException 建立链接超时异常
* @throws SocketTimeoutException 响应超时
* @throws Exception
public static String post(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout)
throws ConnectTimeoutException, SocketTimeoutException, Exception {
HttpClient client = null;
HttpPost post = new HttpPost(url);
String result = "";
try {
if (StringUtils.isNotBlank(body)) {
HttpEntity entity = new StringEntity(body, ContentType.create(mimeType, charset));
post.setEntity(entity);
// 设置参数
Builder customReqConf = RequestConfig.custom();
if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
post.setConfig(customReqConf.build());
HttpResponse res;
if (url.startsWith("https")) {
// 执行 Https 请求.
client = createSSLInsecureClient();
res = client.execute(post);
} else {
// 执行 Http 请求.
client = HttpClientUtils.client;
res = client.execute(post);
result = IOUtils.toString(res.getEntity().getContent(), charset);
} finally {
post.releaseConnection();
if (url.startsWith("https") client != null client instanceof CloseableHttpClient) {
((CloseableHttpClient) client).close();
return result;
public static String postForm(String url, Map String, String params, Map String, String headers, Integer connTimeout,Integer readTimeout) throws ConnectTimeoutException,
SocketTimeoutException, Exception {
HttpClient client = null;
HttpPost post = new HttpPost(url);
try {
if (params != null !params.isEmpty()) {
List NameValuePair formParams = new ArrayList NameValuePair ();
Set Entry String, String entrySet = params.entrySet();
for (Entry String, String entry : entrySet) {
formParams.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formParams, Consts.UTF_8);
post.setEntity(entity);
if (headers != null !headers.isEmpty()) {
for (Entry String, String entry : headers.entrySet()) {
post.addHeader(entry.getKey(), entry.getValue());
// 设置参数
Builder customReqConf = RequestConfig.custom();
if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
post.setConfig(customReqConf.build());
HttpResponse res = null;
if (url.startsWith("https")) {
// 执行 Https 请求.
client = createSSLInsecureClient();
res = client.execute(post);
} else {
// 执行 Http 请求.
client = HttpClientUtils.client;
res = client.execute(post);
return IOUtils.toString(res.getEntity().getContent(), "UTF-8");
} finally {
post.releaseConnection();
if (url.startsWith("https") client != null
client instanceof CloseableHttpClient) {
((CloseableHttpClient) client).close();
* @throws ConnectTimeoutException 建立链接超时
* @throws SocketTimeoutException 响应超时
* @throws Exception
public static String get(String url, String charset, Integer connTimeout,Integer readTimeout)
throws ConnectTimeoutException,SocketTimeoutException, Exception {
HttpClient client = null;
HttpGet get = new HttpGet(url);
String result = "";
try {
// 设置参数
Builder customReqConf = RequestConfig.custom();
if (connTimeout != null) {
customReqConf.setConnectTimeout(connTimeout);
if (readTimeout != null) {
customReqConf.setSocketTimeout(readTimeout);
get.setConfig(customReqConf.build());
HttpResponse res = null;
if (url.startsWith("https")) {
// 执行 Https 请求.
client = createSSLInsecureClient();
res = client.execute(get);
} else {
// 执行 Http 请求.
client = HttpClientUtils.client;
res = client.execute(get);
result = IOUtils.toString(res.getEntity().getContent(), charset);
} finally {
get.releaseConnection();
if (url.startsWith("https") client != null client instanceof CloseableHttpClient) {
((CloseableHttpClient) client).close();
return result;
@SuppressWarnings("unused")
private static String getCharsetFromResponse(HttpResponse ressponse) {
// Content-Type:text/html; charset=GBK
if (ressponse.getEntity() != null ressponse.getEntity().getContentType() != null ressponse.getEntity().getContentType().getValue() != null) {
String contentType = ressponse.getEntity().getContentType().getValue();
if (contentType.contains("charset=")) {
return contentType.substring(contentType.indexOf("charset=") + 8);
return null;
private static CloseableHttpClient createSSLInsecureClient() throws GeneralSecurityException {
try {
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] chain,String authType) throws CertificateException {
return true;
}).build();
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new X509HostnameVerifier() {
@Override
public boolean verify(String arg0, SSLSession arg1) {
return true;
@Override
public void verify(String host, SSLSocket ssl)
throws IOException {
@Override
public void verify(String host, X509Certificate cert)
throws SSLException {
@Override
public void verify(String host, String[] cns,
String[] subjectAlts) throws SSLException {
return HttpClients.custom().setSSLSocketFactory(sslsf).build();
} catch (GeneralSecurityException e) {
throw e;
public static void main(String[] args) {
try {
String str= post("https://localhost:443/ssl/test.shtml","name=12 page=34","application/x-www-form-urlencoded", "UTF-8", 10000, 10000);
//String str= get("https://localhost:443/ssl/test.shtml?name=12 page=34","GBK");
/*Map String,String map = new HashMap String,String
map.put("name", "111");
map.put("page", "222");
String str= postForm("https://localhost:443/ssl/test.shtml",map,null, 10000, 10000);*/
System.out.println(str);
} catch (ConnectTimeoutException e) {
e.printStackTrace();
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
View Code
以上就是微信登录(微信登录操作频繁多久可以恢复)的详细内容,想要了解更多 微信登录的内容,请持续关注盛行IT软件开发工作室。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。