php登录抓取网页指定内容(snsapi_userinfo方式授权的特别注意授权回调这件事情是什么 )

优采云 发布时间: 2021-12-30 19:05

  php登录抓取网页指定内容(snsapi_userinfo方式授权的特别注意授权回调这件事情是什么

)

  建议通过共享页面使用这种授权

  其中snsapi_userinfo授权方式有一个很特别的特点:如果用户已经关注公众号,在授权时使用该方式也是一种静默授权方式,不会出现提示。然后,事情开始变得有趣。留心就沉默,不留心就会提示。所以我们可以直接使用snsapi_userinfo方法进行授权,兼容没有关注或者关注的用户。

  二、开始授权

  当所有的注意事项都了解并正确配置后,您就可以开始编写代码了。我们只需要将用户定向到这个地址:

  

https://open.weixin.qq.com/connect/oauth2/authorize

appid: 公众号的appid

redirect_uri: 授权完成后要跳转的地址,此地址必须是第一节里面配置的域名下的

response_type: 一直填写 "code"

state: 自定义值,此值只能是128个字长度以内,否则将会报错。

"#wechat_redirect": 所有参数拼接完成后,将此字符串追加在后面。

https://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

  1、接待跳转授权

  在javascript中,经常使用下面的代码跳转到页面开始授权:

  window.location.href = "https://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";

  2、后台重定向授权

  有时候你会觉得把这么长的一串链接交给上一段拼接然后跳转,有点太*敏*感*词*观了。你希望前端只需要跳转到一个短链接地址就可以实现网页授权。可以自己写url接口,然后在后端实现重定向:

  // 封装了微信网页授权的接口

@RequestMapping("/webAuth.html")

public void getUserInfoByCode(HttpServletRequest request, HttpServletResponse response) throws Exception {

// 逻辑代码

// ...

// 后端进行重定向

response.sendRedirect(

"https://open.weixin.qq.com/connect/oauth2/authorize" +

"?appid=wx********0" +

"&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php" +

"&response_type=code" +

"&scope=snsapi_userinfo" +

"&state=STATE" +

"#wechat_redirect"

);

}

  无论哪种方式,重定向都是不可避免的。使用后端会增加重定向次数,但对用户影响不大(如果网络足够好)。只要能完成功能,开发者就需要衡量采取什么方法。

  当上面列出的授权URL成功时,会跳转到:页面,并在授权成功后向地址传递一些必要的参数,这些参数是:

  参数说明

  代码

  用于交换凭据,凭据用于获取用户信息。代码值有效期为5分钟,每个代码只能使用一次

  状态

  提交授权时传递了什么状态内容,这里是什么状态内容。

  3、特别注意

  授权回调是没有问题的,但是通常如果你的网页是单页应用,并且你的页面路由方式是HASH路由方式(通常你不指定默认是hash方式),那么你可能有需要注意的几件事。最常见的情况可能是无法通过页面中路由提供的api正常获取网页上的参数值。

  我们来看一下案例:

  // 现在已有一个正式环境页面,地址:http://www.demo.com/webapp/#/home

// 看吧,这通常是一个单页面应用的hash路由模式的url地址。

// 此时遇到页面需要授权获取openid了,你准确无误的进行了重定向授权:

// 啪啪啪啪~~

// 授权完成。

// 又回到了你的回调地址,如果你的回调地址就是这个页面本身,那么你此时的地址应该不出意外变成了:

// http://www.demo.com/webapp/?code=ewfiojxwf23r43cmg3&state=xxxx#/home

// 我知道你发现了什么,授权结果参数为啥跑到中间那一截去了?

// 而通常单页面应用提供的路由api能获取的参数是:

// http://www.demo.com/webapp/#/home?name=xxx&age=10

// 是的,能获取的参数在最后面。

// 而授权过后参数在中间,为啥会出现这样的事情?

// 因为:hash路由的url中包含#符号,而一个合法的url解析规则只会认为 # 号的前面部分有效,因此

// 授权回调时会把#号前面识别为有效url,后面的不处理,参数拼接到#号前面的url的后面。

  所以当你明白了这一点,你可能知道如何在页面中获取这些回调授权后获取的参数。以下是获得解决方案的示例:

  /**

* 获取指定url里的参数。如果不指定,将使用当前页面的url。

* @param url

*/

function url2query (url) {

url = url || window.location.href;

var paths = url.split('#'); // 考虑到单页面应用支持,先按#号分割。

var query = {};

// 然后进行处理

for (var i = 0; i < paths.length; i++) {

var url_s = paths[i];

var ff = url_s.split('?');

if (ff.length >= 2) {

var msearch = ff[ff.length - 1];

if (msearch) {

var kvs = msearch.split('&');

for (var index = 0; index < kvs.length; index++) {

var kv = kvs[index].split('=');

query[kv[0]] = kv[1];

}

}

}

}

return query;

}

// 使用方法:

var query = url2query();

var code = query.code;

var state = query.state;

var name = query.name;

  三、获取用户的OpenId和微信信息1、获取凭证和openid

  授权完成并获得code后,现在可以使用code的参数值获取用户的微信信息了。但如上表所述,代码是用来交换凭证的,用户信息只能通过凭证获取。然后首先获取凭据:

  使用微信提供的地址和参数:

  

https://api.weixin.qq.com/sns/oauth2/access_token

appid: 公众号的appid

secret: 公众号的appsecret

code: 通过授权获取到的code,既上一步拿到的code

grant_type: 一直填值"authorization_code"

  使用 Java 执行 Get 请求以换取凭据:

  Map param = new HashMap();

param.put("appid", "自己公众号的appid");

param.put("secret", "自己公众号的appsecret");

param.put("code", "通过授权获取到的code");

param.put("grant_type", "authorization_code");

String result = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/access_token", param);

// 得到返回的凭据

// {

// "access_token":"ACCESS_TOKEN", // 网页授权接口调用凭证,也就是获取用户信息的凭据

// "expires_in":7200, // access_token 的过期时间

// "refresh_token":"REFRESH_TOKEN",// access_token 过期后可通过此值获取新的

// "openid":"OPENID", // 用户的 openId,这个id是此用户再公众号里的唯一标示

// "scope":"SCOPE" // 用户授权的作用域

// }

  既然已经获取到了用户的openid,就足以判断用户在这个公众号中的唯一性了。每个微信账号对应一个公众号中唯一的openid。如果您想进一步了解微信用户的信息(例如注册时需要一些基本信息),可以继续往下阅读。

  需要注意的是,返回的凭证名称也叫access_token,与请求微信API接口的access_token是一样的,但用途却大不相同。这里的access_token用于获取用户信息,另一个用于调用微信接口进行验证,不要混淆。

  该access_token的有效期为2小时,在2小时内,您可以使用该access_token获取用户信息。当你发现它已经过期时,你应该使用refresh_token来获取一个新的access_token。

  2、刷新access_token

  下面的代码展示了如何通过refresh_token刷新凭证access_token:

  Map param = new HashMap();

param.put("appid", "自己公众号的appid");

param.put("grant_type", "refresh_token");

param.put("refresh_token", "还未过期的refresh_token");

String result = HttpUtil.get("https://api.weixin.qq.com/sns/oauth2/refresh_token", param);

// 得到新的凭据

// {

// "access_token":"ACCESS_TOKEN", // 网页授权接口调用凭证,也就是获取用户信息的凭据

// "expires_in":7200, // access_token 的过期时间

// "refresh_token":"REFRESH_TOKEN", // access_token 过期后可通过此值获取新的

// "openid":"OPENID", // 用户的 openId,这个id是此用户再公众号里的唯一标示

// "scope":"SCOPE" // 用户授权的作用域

// }

  然后使用新获取的access_token获取用户信息。refresh_token 不是永久有效的。其有效期为 30 天。当 refresh_token 也过期时,用户必须再次进行授权操作。

  3、获取基本用户信息

  最后一步是获取用户的基本信息。微信提供了一个接口,允许开发者获取用户的一些基本信息。界面:

  

https://api.weixin.qq.com/sns/userinfo

access_token: 使用code获取到的凭据

openid: 用户在公众号里的唯一标示

lang: 国内就填写:"zh_CN"。zh_CN 简体,zh_TW 繁体,en 英语

  使用java发出Get请求获取用户基本信息:

  Map param = new HashMap();

param.put("access_token", "code换取到的凭据");

param.put("openid", "用户在公众号里的唯一标示");

param.put("lang", "zh_CN");

String result = HttpUtil.get("https://api.weixin.qq.com/sns/userinfo", param);

// 得到用户的基本信息

// {

// "openid":" OPENID",

// "nickname": NICKNAME, // 微信昵称

// "sex":"1", // 性别,值为1时是男性,值为2时是女性,值为0时是未知

// "province":"PROVINCE" // 用户*敏*感*词*填写的省份

// "city":"CITY", // 用户*敏*感*词*填写的城市

// "country":"COUNTRY", // 国家,如中国为CN

// "headimgurl": "http://t****e/64", // 微信头像,最后一个数值代表正方形头像大小(有0、46、64、

// 96、132数值可选,0代表640*640正方形头像),用户没有头像时

// 该项为空。若用户更换头像,原有头像URL将失效。

// "privilege":["PRIVILEGE1"], // 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

// "unionid": "o******" // 只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

// }

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线