最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必需要获取到用户的openid。html
这是微信官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842java
官方流程
网页受权流程分为四步:
一、引导用户进入受权页面赞成受权,获取code
二、经过code换取网页受权access_token(与基础支持中的access_token不一样)
三、若是须要,开发者能够刷新网页受权access_token,避免过时
四、经过网页受权access_token和openid获取用户基本信息(支持UnionID机制)json
个人思路
一、首先是要在公众号后台进行配置,设置回调路径,具体要求参照官方文档。api
要将这里的txt文件放在项目根路径下,不然上面的回调域名是没法保存的。服务器
二、用户访问第三方页面时,先去请求一个api,获取code和state微信
code说明 : code做为换取access_token的票据,每次用户受权带上的code将不同,code只能使用一次,5分钟未被使用自动过时。session
这里的scope分为两种:一种是静默方式(snsapi_base);一种是非静默方式(snsapi_userinfo),须要用户去手动点击赞成才能获取用户的信息。url
这是非静默方式受权spa
静默方式直接就获取到了openid
三、在1中配置的回调方法中根据获取到的code和state再去请求以下接口,获取access_token 和openid。
获取code后,请求如下连接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
@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("<script>alert('受权失败!');</script>"); pw.flush(); pw.close(); } } catch (IOException e) { e.printStackTrace(); response.setContentType("text/html;charset=utf-8"); pw.write("<script>alert('发生后台异常!');</script>"); pw.flush(); pw.close(); } return null; }
总结:到此就已经获取到了用户的openid,由于只涉及支付业务所用就再也不往下获取用户的我的信息。感受微信这里的官方文档逻辑还都比较清楚,照着流程走下来通常都没什么问题,具体如何获取到openid的代码能够参考我前文里的那段,已经在实际项目中实践过。