开发框架:struts2(零配置)

官方文档下载地址

https://mp.weixin.qq.com/paymch/readtemplate?t=mp/business/course3_tmpl&lang=zh_CN

PS:下列获取openid的代码可以在柳峰的《微信公众平台应用开发方法、技巧与案例》的第六章找到。但是书中关于授权域名以及redirect_uri的关联写的不是很详细,在此主要详细介绍了出现问题排错的方向。代码觉得有疑惑的,可以看柳大神的书,或者csdn搜索柳峰找相关博客查看。

1 首先,我们需要进入我们的服务号,点击左侧栏开发者中心--->修改网页授权获取用户基本信息的值,假设我们对外的ip为183.33.212.175,tomcat的端口号为8016,这个修改为183.33.212.175:8016。

2 创建WeiXinOauth2Token类。改类具有以下属性:(自行添加get,set方法)

private String accessToken;

private int expiresIn;

private String refeshToken;

private String openId;

private String scope;

3 调用微信的授权接口

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

其中要说明的是,redirect_uri一定是在我们设定网页授权获取用户基本信息的域名下的action,不然微信页面会提示redirect_uri错误(所以,出现该错误,各位应该知道如何排错了)

官方文档给了下面一段话解释:

比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html、http://www.qq.com/login.html都可以进行 OAuth2.0 鉴权。但http://pay.qq.com、http://music.qq.com、http://qq.com 无法进行 OAuth2.0 鉴权。

上面一段话是什么意思呢?

假设我的授权域名为183.33.212.175:8016,那么。我的redirect_uri需要为 http://183.33.212.175:8016/wxweb/config/oauth!execute.action 。 特别注意的是前面的 http:// 必须要有,

不然就提示找不到页面183.33.212.175:8016/wxweb/config /oauth!execute.action?code=XXXXXXXXXX。(这一点被坑了一天)

4 然后将redirect_uri进行encode,具体代码如下
public static String urlEncodeUTF8(String source){
                String result = source;
                try {
                        result = java.net.URLEncoder.encode(source,"utf-8");
                } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                }
                return result;
}
requestUrl= https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect中的REDIRECT_URI是我们的redirect_uri 进行encode后的值,APPID为你服务号的appid.
将上面的requestUrl设置为图文链接或者view按钮链接发送给用户。

5 获取用户openid

我的redirect_uri对应的action方法为

public String execute() throws ServletException, IOException{
                // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
                HttpServletRequest request = ServletActionContext.getRequest();
                HttpServletResponse response = ServletActionContext.getResponse();
                request.setCharacterEncoding("UTF-8");
                response.setCharacterEncoding("UTF-8");
                String code = request.getParameter("code");
                String openId ="";
                if (!"authdeny".equals(code)) {
                        WeiXinOauth2Token weiXinOauth2Token = AdvancedUtil
                                        .getOauth2AccessToken("wx0953bae287adfeee",
                                                        "8e81dbc44a84a3c290c0cc3759f85421", code);
                        openId = weiXinOauth2Token.getOpenId();
                }
                request.getSession().setAttribute("openId", openId);
                return "index";
}

AdvancedUtil的方法如下:
public static WeiXinOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {
                WeiXinOauth2Token wat = new WeiXinOauth2Token();
                String requestUrl = oauth2Url.replace("APPID", appId).replace("SECRET", appSecret).replace("CODE", code);
                JSONObject jsonObject = CommonUtil
                                .httpsRequest(requestUrl, "GET", null);
                if (null != jsonObject) {
                        try {
                                wat = new WeiXinOauth2Token();
                                wat.setAccessToken(jsonObject.getString("access_token"));
                                wat.setExpiresIn(jsonObject.getInt("expires_in"));
                                wat.setRefeshToken(jsonObject.getString("refresh_token"));
                                wat.setOpenId(jsonObject.getString("openid"));
                                wat.setScope(jsonObject.getString("scope"));
                        } catch (Exception e) {
                                wat = null;
                                String errorCode = jsonObject.getString("errcode");
                                String errorMsg = jsonObject.getString("errmsg");
                                log.error("获取网页授权凭证失败 errcode{},errMsg", errorCode, errorMsg);
                        }

}
                return wat;
}
CommmonUtil相关方法如下
/**
         * 发送https请求
         *
         * @param requestUrl 请求地址
         * @param requestMethod 请求方式(GET、POST)
         * @param outputStr 提交的数据
         * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
         */
public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
                JSONObject jsonObject = null;
                try {
                        // 创建SSLContext对象,并使用我们指定的信任管理器初始化
                        TrustManager[] tm = { new MyX509TrustManager() };
                        SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                        sslContext.init(null, tm, new java.security.SecureRandom());
                        // 从上述SSLContext对象中得到SSLSocketFactory对象
                        SSLSocketFactory ssf = sslContext.getSocketFactory();
                        URL url = new URL(requestUrl);
                        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                        conn.setSSLSocketFactory(ssf);
                        conn.setDoOutput(true);
                        conn.setDoInput(true);
                        conn.setUseCaches(false);
                        // 设置请求方式(GET/POST)
                        conn.setRequestMethod(requestMethod);
                        //conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
                        // 当outputStr不为null时向输出流写数据
                        if (null != outputStr) {
                                OutputStream outputStream = conn.getOutputStream();
                                // 注意编码格式
                                outputStream.write(outputStr.getBytes("UTF-8"));
                                outputStream.close();
                        }
                        // 从输入流读取返回内容
                        InputStream inputStream = conn.getInputStream();
                        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                        String str = null;
                        StringBuffer buffer = new StringBuffer();
                        while ((str = bufferedReader.readLine()) != null) {
                                buffer.append(str);
                        }
                        // 释放资源
                        bufferedReader.close();
                        inputStreamReader.close();
                        inputStream.close();
                        inputStream = null;
                        conn.disconnect();
                        jsonObject = JSONObject.fromObject(buffer.toString());
                } catch (ConnectException ce) {
                        log.error("连接超时:{}", ce);
                } catch (Exception e) {
                        log.error("https请求异常:{}", e);
                }
                return jsonObject;
}
测试OK后,会得到用户的openid并正确跳转到oauth_index.jsp页面。

假设用我们sae的应用,授权域名写为searchinfo.sinaapp.com,其中searchinfo是你的应用名称。那么没有encode前的redirect_uri为:http://searchinfo.sinaapp.com/config/oauth!execute.action。
需要注意的是,你部署的代码中config/oauth!execute.action方法所在版本必须为你应用的默认版本。检测是否可行,直接访问
searchinfo.sinaapp.com/config/oauth!execute.action,若报500空指针,说明填写正确。找不到方法请自行修改默认版本,找到对应的执行action即可。

获取微信用户的openId相关推荐

  1. php微信获取openid_如何通过PHP获取微信用户的openid和基本信息

    本篇讲解通过PHP获取微信用户的openid和基本信息的操作. 基本配置public function getcode(){ //基本配置 $appid=''; $redirect_uri=urlen ...

  2. 微信公众号开发之获取微信用户的openID

    (注:openID同一用户同一应用唯一,UnionID同一用户不同应用唯一.不同应用指微信开放平台下的不同用户.) 1.  申请测试号(获得appID.appsecret) 2.  填写服务器配置并验 ...

  3. 如何获取微信用户的Openid详解(微信网页授权)

    如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域名的说明 1.在微信公众号请求用户网页授权之前,开发者需要先到公众平台官 ...

  4. 微信公众平台开发—利用OAuth2.0获取微信用户基本信息

    1.首先在某微信平台下配置OAuth2.0授权回调页面: 2.通过appid构造url获取微信回传code值(appid可在微信平台下找到) 1).微信不弹出授权页面url: A.code回传到页面w ...

  5. 获取微信用户openid

    最近在做一个从app分享链接到微信的工作.产品需要有一个点赞功能.每人只能点一次赞. 在网上搜了搜,发现微信的公众账号可以获取到用户的openid和其他的一些用户信息. 首先你的网站入口必须是微信服务 ...

  6. 微信公众号开发获取微信用户openid及访问url身份认证方式

    技术要点: 1.如何获取业务系统中用户身份标识. OPENID是微信公众号中用户的唯一标识,通过OPENID与业务系统中USRID建立一对一的对应关系,这样获取到了OPENID也就能知道所对应的USR ...

  7. 网页中获取微信用户是否关注订阅号的思路

    网页中要获取微信用户是否关注订阅号,请保证在同一个微信开放平台帐号下有一个服务号,否则可能很难实现. 在平时的业务工程中我们需要了解用户是否关注了微信公众号才能继续往下操作.这种操作对服务号来说是很容 ...

  8. java实现第三方网页获取微信用户授权后的微信用户基本信息

    本文内容基本按照官方文档,若想直接看官方文档,可直接点击查看:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_w ...

  9. SAP系统和微信集成的系列教程之六:如何通过OAuth2获取微信用户信息并显示在SAP UI5应用中

    这是Jerry 2020年的第87篇文章,也是汪子熙公众号总共第269篇原创文章. 本系列的英文版Jerry写作于2017年,这个教程总共包含十篇文章,发表在SAP社区上. 系列目录 (1) 微信开发 ...

  10. SpringBoot中获取微信用户信息竟然这么简单!

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要 ...

最新文章

  1. Java中对象引用的机制,及特点
  2. 为啥用redis解决会话呢?
  3. Git使用中关于rebase 、stash 、reflog、reset的一些注意点
  4. GNOME界面简单使用
  5. Hybrid App开发设计与实现
  6. 【必备干货】1000字讲清3大财务数据表
  7. ceq c matlab,求一个函数MATLAB的编程,求大神指教。
  8. VS 2017 RC到期的解决方法
  9. 关于水晶报表打包的一些注意的地方!
  10. (day 33 - 位运算 )剑指 Offer 56 - II. 数组中数字出现的次数 II
  11. python基于内置的SimpleHTTPServer来搭建简易的FTP服务器实现局域网内文件共享
  12. Verilog 语言2选1数据选择器
  13. C盘爆满,你的专属清道夫来啦
  14. 【论文精读】UV-SLAM: Unconstrained Line-based SLAM Using Vanishing Points for Structural Mapping
  15. Java经典三角形:杨辉三角
  16. Linux minerd木马清除(续)
  17. java.lang.IllegalArgumentException: Index for header ‘XXX‘ is 1 but CSVRecord only has 1 value
  18. 在招股书中编概念、讲故事,将通过内核审批的申报文件大幅删减后报送
  19. 艾永亮:老板必看!传统企业转型互联网的“门道”
  20. 欧拉法求解已知初值微分方程解

热门文章

  1. 再也不担心写出臃肿的Flink流处理程序啦,发现一款将Flink与Spring生态完美融合的脚手架工程-懒松鼠Flink-Boot
  2. Python 导出微信电子相册中的照片
  3. diy无感无刷电机霍尔安装_永磁无刷直流电机霍尔位置传感器的安装
  4. android 联系人 拼音,Android 2.1 (Eclair)的中文联系人拼音检索问题
  5. RL 笔记(3)PPO(Proximal Policy Optimization)近端策略优化
  6. 西瓜书k-means例子matlab实现
  7. JavaScript模块化功能使用总结
  8. matlab 离散频域分析,离散系统频域分析及matlab实现.doc
  9. edcoder数据结构第1关:基于BF算法的病毒感染监测
  10. 广义相对论与狭义相对论的区别