网页手机号抓取程序(通过手机端微信访问第三方H5页面获取用户的身份信息 )
优采云 发布时间: 2022-01-13 07:19网页手机号抓取程序(通过手机端微信访问第三方H5页面获取用户的身份信息
)
功能:主要用于用户在手机上通过微信访问第三方H5页面时获取用户的身份信息(openId、昵称、头像、位置等)。可用于实现微信登录、微信账号绑定、用户身份认证等功能。开发前准备:
1、需要有公众号才能获取AppID和AppSecret;
2、进入公众号开发者中心页面配置授权回调域名。具体位置:接口权限-Web服务-Web账号-Web授权获取基本用户信息-修改
注意只需要填写完整的域名(如 , ),不要添加其他协议头和具体地址字段;
该域名需要是注册域名。这种情况很难处理。幸运的是,热心网友qydev无私地为我们提供了一个注册域名。我们可以使用 Ngrok 虚拟化一个域名,并将其映射到本地开发环境。它是一个 Web 开发神器。.
Ngrok for qydev的使用说明及下载地址:
本文以域名为例:
3、如果你觉得在手机上测试比较麻烦,可以使用微信官方提供的web开发者工具直接在浏览器中调试。
前提是你需要在微信公众号中绑定开发者账号:登录公众号-开发者工具-进入网页开发者工具-绑定网页开发者微信账号
使用说明及下载地址:#6
授权步骤:
1、引导用户进入授权页面同意授权并获取code
2、用代码交换网页授权access_token(与基础支持中的access_token不同)
3、通过网页授权access_token和openid获取用户基本信息
Java实现:
1、引导用户进入授权页面同意授权并获取code
这一步其实就是将需要授权的页面的url拼接到微信的认证请求接口中。比如用户在访问页面/auth时需要进行授权认证,拼接后的授权验证地址为:
:///auth&response_type=code&scope=snsapi_base&state=xxxx_state#wechat_redirect
这里需要将 appid 和 redirect_uri 替换为实际信息。scope 参数有两个值:
snsapi_base:只能获取用户openid。好处是不需要用户手动点击认证按钮,感觉就像直接输入网站。
snsapi_userinfo:可以获取openid、昵称、头像、位置等信息。要求用户手动单击“身份验证”按钮。
相关代码:
/**
* 生成用于获取access_token的Code的Url
*
* @param redirectUrl
* @return
*/
public String getRequestCodeUrl(String redirectUrl) {
return String.format("https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect",
APPID, redirectUrl, "snsapi_userinfo", "xxxx_state");
}
2、将网页授权access_token与第一步得到的code交换(与基础支持中的access_token不同)
在这一步中,我们需要在控制器中获取微信返回给我们的代码,并通过该代码请求access_token。
/**
* 路由控制
*
* @param request
* @param code
* @return
*/
@GET
@Path("auth")
public Response auth(@Context HttpServletRequest request,
@QueryParam("code") String code) {
Map data = new HashMap();
Map result = wechatUtils.getUserInfoAccessToken(code);//通过这个code获取access_token
String openId = result.get("openid");
if (StringUtils.isNotEmpty(openId)) {
logger.info("try getting user info. [openid={}]", openId);
Map userInfo = wechatUtils.getUserInfo(result.get("access_token"), openId);//使用access_token获取用户信息
logger.info("received user info. [result={}]", userInfo);
return forward("auth", userInfo);
}
return Response.ok("openid为空").build();
}
/**
* 获取请求用户信息的access_token
*
* @param code
* @return
*/
public Map getUserInfoAccessToken(String code) {
JsonObject object = null;
Map data = new HashMap();
try {
String url = String.format("https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code",
APPID, APPSECRET, code);
logger.info("request accessToken from url: {}", url);
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String tokens = EntityUtils.toString(httpEntity, "utf-8");
Gson token_gson = new Gson();
object = token_gson.fromJson(tokens, JsonObject.class);
logger.info("request accessToken success. [result={}]", object);
data.put("openid", object.get("openid").toString().replaceAll("\"", ""));
data.put("access_token", object.get("access_token").toString().replaceAll("\"", ""));
} catch (Exception ex) {
logger.error("fail to request wechat access token. [error={}]", ex);
}
return data;
}
请求 access_token 返回样本:
[result={
"access_token":"OezXcEiiBSKSxW0eoylIeK6mXnzDdGmembMkERL1o1PtpJBEFDaCSwseSTzvZhiKK7Q35O-YctaOFfyJYSPMMEsMq62zw8T6VDljgKJY6g-tCMdTr3Yoeaz1noL6gpJeshMPwEXL5Pj3YBkw",
"expires_in":7200,
"refresh_token":"OezXcEiiBSKSxW0eoylIeK6mXnzDdGmembMkERL1o1PtpJBEFDaCSwseSTOIGqz3ySJRe-lv124wxxtrBdXGd3X1YGysFJnCxjtIE-jaMkvT7aN-12nBa4YtDvr5VSKCU-_UeFFnfW0K3JmZGRA",
"openid":"oN9UryuC0Y01aQt0jKxZXbfe658w",
"scope":"snsapi_userinfo"}]
通过access_token和openid获取用户基本信息:
/**
* 获取用户信息
*
* @param accessToken
* @param openId
* @return
*/
public Map getUserInfo(String accessToken, String openId) {
Map data = new HashMap();
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId + "&lang=zh_CN";
logger.info("request user info from url: {}", url);
JsonObject userInfo = null;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
String response = EntityUtils.toString(httpEntity, "utf-8");
Gson token_gson = new Gson();
userInfo = token_gson.fromJson(response, JsonObject.class);
logger.info("get userinfo success. [result={}]", userInfo);
data.put("openid", userInfo.get("openid").toString().replaceAll("\"", ""));
data.put("nickname", userInfo.get("nickname").toString().replaceAll("\"", ""));
data.put("city", userInfo.get("city").toString().replaceAll("\"", ""));
data.put("province", userInfo.get("province").toString().replaceAll("\"", ""));
data.put("country", userInfo.get("country").toString().replaceAll("\"", ""));
data.put("headimgurl", userInfo.get("headimgurl").toString().replaceAll("\"", ""));
} catch (Exception ex) {
logger.error("fail to request wechat user info. [error={}]", ex);
}
return data;
}
获取用户信息返回示例:
[result={
"openid":"oN9UryuC0Y01aQt0jKxZXbfe658w",
"nickname":"lovebread",
"sex":1,
"language":"zh_CN",
"city":"",
"province":"",
"country":"中国",
"headimgurl":"http://wx.qlogo.cn/mmopen/bRLXzTf2f6HNfBTd72heAA7vNKsGKvK3dfreewrewsPff9OaMWib0GibbA8daQmNQvQhagtiaicf4vNC5nYU3ia821QQ/0",
"privilege":[]}]