/*** 1 第一步:用户同意授权,获取code* 2 第二步:通过code换取网页授权access_token* 3 第三步:刷新access_token(如果需要)* 4 第四步:拉取用户信息(需scope为 snsapi_userinfo)*/

第一部分:微信授权获取基本信息的介绍

我们首先来看看官方的文档怎么说:

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑。

关于网页授权回调域名的说明

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;
2、授权回调域名配置规范为全域名,比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com无法进行OAuth2.0鉴权
3、如果公众号登录授权给了第三方开发者来进行管理,则不必做任何设置,由第三方代替公众号实现网页授权即可

关于网页授权的两种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。

关于网页授权access_token和普通access_token的区别

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;
2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

关于UnionID机制

1、请注意,网页授权获取用户基本信息也遵循UnionID机制。即如果开发者有在多个公众号,或在公众号、移动应用之间统一用户帐号的需求,需要前往微信开放平台(open.weixin.qq.com)绑定公众号后,才可利用UnionID机制来满足上述需求。
2、UnionID机制的作用说明:如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为同一用户,对同一个微信开放平台下的不同应用(移动应用、网站应用和公众帐号),unionid是相同的。

关于特殊场景下的静默授权

1、上面已经提到,对于以snsapi_base为scope的网页授权,就静默授权的,用户无感知;
2、对于已关注公众号的用户,如果用户从公众号的会话或者自定义菜单进入本公众号的网页授权页,即使是scope为snsapi_userinfo,也是静默授权,用户无感知。

具体而言,网页授权流程分为四步:

1、引导用户进入授权页面同意授权,获取code
2、通过code换取网页授权access_token(与基础支持中的access_token不同)
3、如果需要,开发者可以刷新网页授权access_token,避免过期
4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

 第二部分:实现微信网页授权的详细方法

下面,我们来按照这个步骤来实现这个功能:

第一步:用户同意授权,获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面

参考链接(请在微信客户端中打开此链接体验)Scope为snsapi_basehttps://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdapter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_base&state=123#wechat_redirectScope为snsapi_userinfohttps://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

参数说明

参数 是否必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息
state 重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节
#wechat_redirect 无论直接打开还是做页面302重定向时候,必须带此参数

下图为scope等于snsapi_userinfo时的授权页面:

用户同意授权后

如果用户同意授权,页面将跳转至 redirect_uri/?code=CODE&state=STATE。若用户禁止授权,则重定向后不会带上code参数,仅会带上state参数redirect_uri?state=STATE

code说明 :
code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。

温馨提醒:以下的省略了搭建环境和导入jar的过程,以下的方法提供参考。如果需要的话,需要看下前面的系列文章。

我们首先创建一些需要用到的pojo :

1. 通过网页授权获取的用户信息

用户信息类:SNSUserInfo类

package com.souvc.weixin.pojo;import java.util.List;/**
* 类名: SNSUserInfo </br>
* 描述: 通过网页授权获取的用户信息 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class SNSUserInfo {// 用户标识private String openId;// 用户昵称private String nickname;// 性别(1是男性,2是女性,0是未知)private int sex;// 国家private String country;// 省份private String province;// 城市private String city;// 用户头像链接private String headImgUrl;// 用户特权信息private List<String> privilegeList;public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getHeadImgUrl() {return headImgUrl;}public void setHeadImgUrl(String headImgUrl) {this.headImgUrl = headImgUrl;}public List<String> getPrivilegeList() {return privilegeList;}public void setPrivilegeList(List<String> privilegeList) {this.privilegeList = privilegeList;}
}

View Code

2.  凭证实体类

package com.souvc.weixin.pojo;/**
* 类名: Token </br>
* 描述:  凭证  </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class Token {// 接口访问凭证private String accessToken;// 凭证有效期,单位:秒private int expiresIn;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}
}

View Code

3. 网页授权信息 WeixinOauth2Token类

package com.souvc.weixin.pojo;/**
* 类名: WeixinOauth2Token </br>
* 描述:  网页授权信息  </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class WeixinOauth2Token {// 网页授权接口调用凭证private String accessToken;// 凭证有效时长private int expiresIn;// 用于刷新凭证private String refreshToken;// 用户标识private String openId;// 用户授权作用域private String scope;public String getAccessToken() {return accessToken;}public void setAccessToken(String accessToken) {this.accessToken = accessToken;}public int getExpiresIn() {return expiresIn;}public void setExpiresIn(int expiresIn) {this.expiresIn = expiresIn;}public String getRefreshToken() {return refreshToken;}public void setRefreshToken(String refreshToken) {this.refreshToken = refreshToken;}public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public String getScope() {return scope;}public void setScope(String scope) {this.scope = scope;}
}

View Code

4.  微信用户的基本信息WeixinUserInfo类

package com.souvc.weixin.pojo;/**
* 类名: WeixinUserInfo </br>
* 描述: 微信用户的基本信息  </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class WeixinUserInfo {// 用户的标识private String openId;// 关注状态(1是关注,0是未关注),未关注时获取不到其余信息private int subscribe;// 用户关注时间,为时间戳。如果用户曾多次关注,则取最后关注时间private String subscribeTime;// 昵称private String nickname;// 用户的性别(1是男性,2是女性,0是未知)private int sex;// 用户所在国家private String country;// 用户所在省份private String province;// 用户所在城市private String city;// 用户的语言,简体中文为zh_CNprivate String language;// 用户头像private String headImgUrl;public String getOpenId() {return openId;}public void setOpenId(String openId) {this.openId = openId;}public int getSubscribe() {return subscribe;}public void setSubscribe(int subscribe) {this.subscribe = subscribe;}public String getSubscribeTime() {return subscribeTime;}public void setSubscribeTime(String subscribeTime) {this.subscribeTime = subscribeTime;}public String getNickname() {return nickname;}public void setNickname(String nickname) {this.nickname = nickname;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}public String getCountry() {return country;}public void setCountry(String country) {this.country = country;}public String getProvince() {return province;}public void setProvince(String province) {this.province = province;}public String getCity() {return city;}public void setCity(String city) {this.city = city;}public String getLanguage() {return language;}public void setLanguage(String language) {this.language = language;}public String getHeadImgUrl() {return headImgUrl;}public void setHeadImgUrl(String headImgUrl) {this.headImgUrl = headImgUrl;}
}

View Code

5. 封装AdvancedUtil来实现以下方法 。

但是如何获取到token值呢?

/*** 获取网页授权凭证* * @param appId 公众账号的唯一标识* @param appSecret 公众账号的密钥* @param code* @return WeixinAouth2Token*/public static WeixinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {WeixinOauth2Token wat = null;// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";requestUrl = requestUrl.replace("APPID", appId);requestUrl = requestUrl.replace("SECRET", appSecret);requestUrl = requestUrl.replace("CODE", code);// 获取网页授权凭证JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {wat = new WeixinOauth2Token();wat.setAccessToken(jsonObject.getString("access_token"));wat.setExpiresIn(jsonObject.getInt("expires_in"));wat.setRefreshToken(jsonObject.getString("refresh_token"));wat.setOpenId(jsonObject.getString("openid"));wat.setScope(jsonObject.getString("scope"));} catch (Exception e) {wat = null;int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return wat;}

View Code

获取用户信息:

/*** 通过网页授权获取用户信息* * @param accessToken 网页授权接口调用凭证* @param openId 用户标识* @return SNSUserInfo*/@SuppressWarnings( { "deprecation", "unchecked" })public static SNSUserInfo getSNSUserInfo(String accessToken, String openId) {SNSUserInfo snsUserInfo = null;// 拼接请求地址String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);// 通过网页授权获取用户信息JSONObject jsonObject = CommonUtil.httpsRequest(requestUrl, "GET", null);if (null != jsonObject) {try {snsUserInfo = new SNSUserInfo();// 用户的标识snsUserInfo.setOpenId(jsonObject.getString("openid"));// 昵称snsUserInfo.setNickname(jsonObject.getString("nickname"));// 性别(1是男性,2是女性,0是未知)snsUserInfo.setSex(jsonObject.getInt("sex"));// 用户所在国家snsUserInfo.setCountry(jsonObject.getString("country"));// 用户所在省份snsUserInfo.setProvince(jsonObject.getString("province"));// 用户所在城市snsUserInfo.setCity(jsonObject.getString("city"));// 用户头像snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));// 用户特权信息snsUserInfo.setPrivilegeList(JSONArray.toList(jsonObject.getJSONArray("privilege"), List.class));} catch (Exception e) {snsUserInfo = null;int errorCode = jsonObject.getInt("errcode");String errorMsg = jsonObject.getString("errmsg");log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);}}return snsUserInfo;}

View Code

 6. 封装https请求类 CommonUtil 类。

上面我们用到了一个支持发送https请求的工具:

package com.souvc.weixin.util;import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;/**
* 类名: MyX509TrustManager </br>
* 描述:信任管理器 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class MyX509TrustManager implements X509TrustManager {// 检查客户端证书public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 检查服务器端证书public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}// 返回受信任的X509证书数组public X509Certificate[] getAcceptedIssuers() {return null;}
}

View Code

/*** 发送https请求* * @param requestUrl 请求地址* @param requestMethod 请求方式(GET、POST)* @param outputStr 提交的数据* @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)*/public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {JSONObject jsonObject = null;try {// 创建SSLContext对象,并使用我们指定的信任管理器初始化TrustManager[] tm = { new MyX509TrustManager() };SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");sslContext.init(null, tm, new java.security.SecureRandom());// 从上述SSLContext对象中得到SSLSocketFactory对象SSLSocketFactory ssf = sslContext.getSocketFactory();URL url = new URL(requestUrl);HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();conn.setSSLSocketFactory(ssf);conn.setDoOutput(true);conn.setDoInput(true);conn.setUseCaches(false);// 设置请求方式(GET/POST)conn.setRequestMethod(requestMethod);// 当outputStr不为null时向输出流写数据if (null != outputStr) {OutputStream outputStream = conn.getOutputStream();// 注意编码格式outputStream.write(outputStr.getBytes("UTF-8"));outputStream.close();}// 从输入流读取返回内容InputStream inputStream = conn.getInputStream();InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String str = null;StringBuffer buffer = new StringBuffer();while ((str = bufferedReader.readLine()) != null) {buffer.append(str);}// 释放资源bufferedReader.close();inputStreamReader.close();inputStream.close();inputStream = null;conn.disconnect();jsonObject = JSONObject.fromObject(buffer.toString());} catch (ConnectException ce) {log.error("连接超时:{}", ce);} catch (Exception e) {log.error("https请求异常:{}", e);}return jsonObject;}

View Code

二、写授权类:

注意替换成自己的appid 和 密钥

package com.souvc.weixin.servlet;import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.souvc.weixin.pojo.SNSUserInfo;
import com.souvc.weixin.pojo.WeixinOauth2Token;
import com.souvc.weixin.util.AdvancedUtil;/**
* 类名: OAuthServlet </br>
* 描述: 授权后的回调请求处理 </br>
* 开发人员: souvc </br>
* 创建时间:  2015-11-27 </br>
* 发布版本:V1.0  </br>*/
public class OAuthServlet extends HttpServlet {private static final long serialVersionUID = -1847238807216447030L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");// 用户同意授权后,能获取到codeString code = request.getParameter("code");String state = request.getParameter("state");// 用户同意授权if (!"authdeny".equals(code)) {// 获取网页授权access_tokenWeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken("wxe34a90ac7bxxcab85c", "1207d566090a8344xxxd6224c02c", code);// 网页授权接口访问凭证String accessToken = weixinOauth2Token.getAccessToken();// 用户标识String openId = weixinOauth2Token.getOpenId();// 获取用户信息SNSUserInfo snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);// 设置要传递的参数request.setAttribute("snsUserInfo", snsUserInfo);request.setAttribute("state", state);}// 跳转到index.jsprequest.getRequestDispatcher("index.jsp").forward(request, response);}
}

View Code

三、授权后,显示信息的页面

<%@ page language="java" pageEncoding="utf-8"%>
<%@ page import="com.souvc.weixin.pojo.SNSUserInfo,java.lang.*"%>
<html>
<head><title>OAuth2.0网页授权</title><meta name="viewport" content="width=device-width,user-scalable=0"><style type="text/css">*{margin:0; padding:0}table{border:1px dashed #B9B9DD;font-size:12pt}td{border:1px dashed #B9B9DD;word-break:break-all; word-wrap:break-word;}</style>
</head>
<body><% // 获取由OAuthServlet中传入的参数SNSUserInfo user = (SNSUserInfo)request.getAttribute("snsUserInfo"); String state=request.getAttribute("state").toString();if(null != user) {%><table width="100%" cellspacing="0" cellpadding="0"><tr><td width="20%">属性</td><td width="80%">值</td></tr><tr><td>OpenID</td><td><%=user.getOpenId()%></td></tr><tr><td>昵称</td><td><%=user.getNickname()%></td></tr><tr><td>性别</td><td><%=user.getSex()%></td></tr><tr><td>国家</td><td><%=user.getCountry()%></td></tr><tr><td>省份</td><td><%=user.getProvince()%></td></tr><tr><td>城市</td><td><%=user.getCity()%></td></tr><tr><td>头像</td><td><%=user.getHeadImgUrl()%></td></tr><tr><td>特权</td><td><%=user.getPrivilegeList()%></td></tr><tr><td>state:</td><td><%=state%></td></tr></table><%}else out.print("用户不同意授权,未获取到用户信息!");%>
</body>
</html>

View Code

四、写请求的路径

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"><!--<servlet><servlet-name>coreServlet</servlet-name><servlet-class>com.souvc.weixin.servlet.CoreServlet</servlet-class></servlet>-->
<!-- /coreServlet用于指定该Servlet的访问路径 <servlet-mapping> <servlet-name>coreServlet</servlet-name> <url-pattern>/coreServlet</url-pattern> </servlet-mapping>--><servlet><servlet-name>oauthServlet</servlet-name><servlet-class>com.souvc.weixin.servlet.OAuthServlet</servlet-class></servlet><servlet-mapping><servlet-name>oauthServlet</servlet-name><url-pattern>/oauthServlet</url-pattern></servlet-mapping><welcome-file-list><welcome-file>index.jsp</welcome-file></welcome-file-list>
</web-app>

View Code

五、替换官方的链接成我们的方法路径:

官方的请求链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
 
 

需要修改的地方:

(1)替换自己的AppID

(2)将redirect_url换成自己的授权请求链接URL。注意这个连接需要经过UTF-8编码。

(3)需要修改scope。需要弹出页面则要修改为snsapi_userinfo 。

scope参数的解释:

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。

 

/*** URL编码(utf-8)* * @param source* @return*/public static String urlEncodeUTF8(String source) {String result = source;try {result = java.net.URLEncoder.encode(source, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return result;}

View Code

package com.souvc.weixin.util;public class TestURL {/**     * 方法名:main</br>* 详述:生成URL编码 </br>* 开发人员:souvc </br>* 创建时间:2016-1-4  </br>* @param args 说明返回值含义* @throws 说明发生此异常的条件*/public static void main(String[] args) {String source="http://chiyan.duapp.com/oauthServlet";System.out.println(CommonUtil.urlEncodeUTF8(source));}}

View Code

也可以直接在线url编码: http://tool.chinaz.com/Tools/URLEncode.aspx

六、复制上面替换好的链接,然后丢进浏览器,然后用微信来扫一扫。会出现以下的效果:

说明,恭喜你,我们获取到了用户的基本信息。

转载:https://www.cnblogs.com/liuhongfeng/p/5099149.html

官方开发文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

实现微信打开网页时,获取当前微信用户信息(Java)(基于snsapi_userinfo方式)相关推荐

  1. 微信小程序 - 登录获取openid和用户信息(适配getUserProfile)

    GitHub Demo 地址: jh-weapp-demo 实现一些常用效果.封装通用组件和工具类 小程序码 微信小程序中如果需要使用微信的用户信息建立自己的用户体系,需拿到唯一标识openid,然后 ...

  2. html微信打开网页 要求用sa,微信网页授权获取用户基本信息(示例代码)

    微信公众号可以通过微信网页授权机制,来获取用户基本信息,可以用于微信登录功能 关于网页授权的两种scope的区别说明 1.静默授权:以snsapi_base为scope发起的网页授权,是用来获取进入页 ...

  3. php微信小程序获取用户信息,微信小程序获取openid及用户信息的方法

    本文主要介绍微信小程序如何获取openid及用户信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家. 1. 获取openid 1.1 获取code 调用接口获取登录凭证(code ...

  4. 微信打开网页下载东西时如何调用其他浏览器下载

    很多朋友问我怎么解决微信内点击链接或扫描二维码打开网页时可以直接跳出微信在外部浏览器打开网页链接,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 功能目的 生成微信跳转链接,实现微 ...

  5. qq打开网页时提示用浏览器打开html,微信QQ打开网页时提示用浏览器打开

    微信QQ打开网页时提示用浏览器打开 一,需求分析 1.1,使用微信或QQ打开网址时,无法在微信或QQ内打开常用下载软件,手机APP等.故此需要在微信qq里提示 二,功能实现 2.1 html实现 请点 ...

  6. 微信内部浏览器打开网页时提示外部浏览器打开 升级版

    使用微信打开网址时,无法在微信内打开常用下载软件,手机APP等. 解决方案:弹出一个遮罩提示用户在新的浏览器窗口打开. 使用的是纯JS+HTML+CSS结合的方式,但不要一进入微信就弹出提示它在新浏览 ...

  7. android仿微信图片上传进度,Android开发之模仿微信打开网页的进度条效果(高仿)...

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果",你会看到有很多类似的文章,不过他们有个共同点,就是实 ...

  8. android仿微信 进度条,Android开发之模仿微信打开网页的进度条效果(高仿)

    一,为什么说是真正的高仿? 阐述这个问题前,先说下之前网上的,各位可以复制这段字,去百度一下  "仿微信打开网页的进度条效果" ,你会看到有很多类似的文章,不过他们有个共同点,就是 ...

  9. Iphonex微信打开网页输入框问题

    Iphonex微信打开网页输入框问题 最近做一个移动端项目,里面有一个输入框,拉起键盘后关闭键盘,原键盘区域还存在必须滑动下才可以,经不停的测试,只有Iphonex里面才会出现,坑啊! 最后实在没办法 ...

最新文章

  1. centos删除文件不释放_centos 磁盘空间不释放 各位有什么解决方案吗
  2. Chrome Elements 标签页 和 View Source 的显示为什么有差异
  3. SAP UI5 OData库的_getServiceSchemaVersion
  4. 【重难点】【RabbitMQ 02】如何避免消息重复投递和消息重复消费、如何防止消息丢失、如何保证消息的顺序性、如何保证消息队列的可用性
  5. 接口测试工具——postman
  6. Android零基础入门第56节:翻转视图ViewFlipper打造引导页和轮播图
  7. 关于nagios 邮件报警问题
  8. java框架是什么_Spring 是什么框架?
  9. unity开发罗技G29方向盘(制作操作汽车)
  10. 【大话传送网-学习笔记】传送网与GSM网络
  11. 浅谈压缩感知(八):两篇科普文章
  12. qt 飞扬青云_细数Qt开发的各种坑(欢迎围观)
  13. 面试题——红黑树,B树、B+树
  14. 应用排行榜第一名脸萌仅仅是刹那的烟火
  15. 比尔·盖茨的另一扇视窗
  16. Qt多线程http下载器之一:仿百度网盘的http下载器
  17. Gmail SMTP问题解决汇总
  18. 统信UOS提示系统磁盘空间不足,磁盘扩容
  19. Dell optiPlex麦克风显示未插入问题解决
  20. 李林计算机学院广西大学,李茹-广西大学·生命科学与技术学院

热门文章

  1. 计算机组成原理随堂作业,2019-华南理工-计算机组成原理-随堂作业
  2. Unity调用大华相机SDK采集图像及基本功能设定
  3. 数字统计-c语言-求特殊自然数
  4. VS code 使用技巧-设置鼠标滚轮翻页速度(Mac版本)
  5. Arduino安装与配置ESP8266开发板(超简单,亲测有效)
  6. vertica基本操作
  7. mysql判断产品是否过期_7个方法教你判断打开的产品是否已过期
  8. 伦敦 quant_伦敦统一用户组(LUUG)见面v2.0
  9. 数据库设计三大范式:
  10. docker 保存 环境持久化_Docker深入浅出系列 | 容器数据持久化