zoukankan      html  css  js  c++  java
  • 微信公众号网页授权获取用户openid

    最近一个项目是在微信公众号内二次开发,涉及到微信公众号支付,根据文档要求想要支付就必须要获取到用户的openid。

    这是微信官方文档https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

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

    我的思路 
    1、首先是要在公众号后台进行配置,设置回调路径,具体要求参照官方文档。

    这里写图片描述

    要将这里的txt文件放在项目根路径下,否则上面的回调域名是无法保存的。

    这里写图片描述

    这里写图片描述 
    2、用户访问第三方页面时,先去请求一个api,获取code和state

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

    请求API参数拼接 
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=http://XXXXXXXXXXX/ydx-business/payWeiXin/getOpenId&response_type=code&scope=snsapi_userinfo&state=1&connect_redirect=1#wechat_redirect

    这里的scope分为两种:一种是静默方式(snsapi_base);一种是非静默方式(snsapi_userinfo),需要用户去手动点击同意才能获取用户的信息。

    这是非静默方式授权

    非静默方式

    静默方式直接就获取到了openid

    这里写图片描述

    3、在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的代码可以参考我前文里的那段,已经在实际项目中实践过。

  • 相关阅读:
    Keep at Most 100 Characters
    Larry and Inversions
    计算指数
    简单题
    重要的话说三遍
    I Love GPLT
    猜数字
    打印沙漏
    多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)的基本概念
    Hibernate面试题
  • 原文地址:https://www.cnblogs.com/pangguoming/p/9520610.html
Copyright © 2011-2022 走看看