php可以抓取网页数据吗(这是微信官方文档官方流程网页授权流程:1)
优采云 发布时间: 2021-11-14 20:05php可以抓取网页数据吗(这是微信官方文档官方流程网页授权流程:1)
最近的一个项目是微信公众号的二次开发,涉及到微信公众号的支付。根据文档要求,如果要付费,必须获取用户的openid。
这是官方微信文档
官方流程 web授权流程分为四步:1、引导用户进入授权页面同意授权并获取code2、使用code兑换web授权access_token (与基础支持中的access_token不同)3、 如有需要,开发者可以刷新网页授权access_token避免过期4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)
我的想法1、首先是在公众号后台进行配置,设置回调路径,具体要求参考官方文档。
将这里的txt文件放在项目根路径下,否则上面的回调域名无法保存。
2、 当用户访问第三方页面时,首先去请求一个api,获取code和state
代码说明:该代码用作票证,以换取access_token。用户授权码每次都会不同。代码只能使用一次,5分钟内未使用将自动失效。
请求API参数拼接
这里的作用域分为两种:一种是静默方法(snsapi_base);另一种是非静默方式(snsapi_userinfo),需要用户手动点击同意获取用户信息。
这是一个非静默授权
静默模式下直接获取openid
3、 根据1中配置的回调方法中获取的代码和状态,请求如下接口获取access_token和openid。
获取code后,请求如下链接获取access_token:
代码片段
@SuppressWarnings("null")
@RequestMapping("/getOAuth")
public String getOAuth(){
String code = request.getParameter("code");//获取微信服务器授权返回的code值
String state = request.getParameter("state");//验证是否来自微信重定向的请求
PrintWriter pw = null;
try {
pw = response.getWriter();
if(Constant.STATE.equals(state)){
/**
* 构造请求链接
* https://api.weixin.qq.com/sns/oauth2/access_token?
* appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
*/
String url = Constant.ACCESS_TOKEN_URL+Constant.APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code";
String jsonStr = HttpUtil.httpRequest(url);
String openid = JSONObject.parseObject(jsonStr).getString("openid");
System.out.println(openid+"==========================");
session = request.getSession();
session.setAttribute("openid", openid);
return "login/wx_login";//登录页面
}else{
response.setContentType("text/html;charset=utf-8");
pw.write("alert('授权失败!');");
pw.flush();
pw.close();
}
} catch (IOException e) {
e.printStackTrace();
response.setContentType("text/html;charset=utf-8");
pw.write("alert('发生后台异常!');");
pw.flush();
pw.close();
}
return null;
}
总结:目前已经获取到用户的openid,因为只涉及支付服务,不再获取用户的个人信息。感觉微信官方的文档逻辑还是比较清晰的。按照流程走一般是没有问题的。具体如何获取openid代码请参考我之前文章中的一段,已经在实际项目中实践过。