当前访客身份:游客 [ 登录  | 注册加入尚学堂]
直播

小帅丶

拥有积分:65
没什么用

博客分类

笔记中心

课题中心

提问中心

答题中心

解答题中心

微信OAuth授权获取用户OpenId-JAVA(个人经验)

小帅丶 发表于 2年前 (2014-07-23 11:43:42)  |  评论(0)  |  阅读次数(22282)| 1 人收藏此文章,   我要收藏   
摘要 微信OAuth授权获取用户OpenId-JAVA(个人经验)

http://mp.weixin.qq.com/wiki这个是官网的接口文档

微信授权获取用户openid-JAVA

第一步:用户同意授权,获取code

在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认带有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:

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


我的代码如下:GetWeiXinCode

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package cn.elve.jxt.weixin.weixin.util;
 
import java.net.URLEncoder;
import cn.elve.jxt.weixin.util.Constants;
/**
 * 获取微信的code
 * @author 宗潇帅
 * @修改日期 2014-7-21下午1:01:45
 */
public class GetWeiXinCode {
    public static String  GetCodeRequest = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
    public static String getCodeRequest(){
        String result = null;
        GetCodeRequest  = GetCodeRequest.replace("APPID", urlEnodeUTF8(Constants.appId));
        GetCodeRequest  = GetCodeRequest.replace("REDIRECT_URI",urlEnodeUTF8(Constants.REDIRECT_URI));
        GetCodeRequest = GetCodeRequest.replace("SCOPE", Constants.SCOPE);
        result = GetCodeRequest;
        return result;
    }
    public static String urlEnodeUTF8(String str){
        String result = str;
        try {
            result = URLEncoder.encode(str,"UTF-8");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
    public static void main(String[] args) {
        System.out.println(getCodeRequest());
    }
}


替换相应的APPID APPSECRET SCOPE

第二步:通过code换取网页授权access_token

获取code后,请求以下链接获取access_token: 
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code


具体做法与上面基本一致。更换相对应的值。需要注意的是code可以写一个Servlet获取。String code = request.getParameter("code");get/post都可以。

这样子就会返回一下json格式数据

{
   "access_token":"ACCESS_TOKEN",
   "expires_in":7200,
   "refresh_token":"REFRESH_TOKEN",
   "openid":"OPENID",
   "scope":"SCOPE"
}


我们需要对这个json格式数据进行转换。大写自己都是用自己账号获取的数据。所有做了替换。

                oAuthInfo = new OAuthInfo();网页授权接口调用凭证5个参数

                 oAuthInfo.setAccessToken(jsonObject.getString("access_token"));
                oAuthInfo.setExpiresIn(jsonObject.getInt("expires_in"));
                oAuthInfo.setRefreshToken(jsonObject.getString("refresh_token"));
                oAuthInfo.setOpenId(jsonObject.getString("openid"));
                oAuthInfo.setScope(jsonObject.getString("scope"));

根据json。获取key,就能得到value。
这就获取到用户的openid。应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)我自己用的作用域为snsapi_userinfo。用户点击跳转页面为

写一个Servlet专门接收传递过来的code。进行相应的操作。

1.OAuthServlet 对code进行access——token的验证

2.GetWeiXinCode的方法调用接口地址。得到相应code。

3.OAuthInfo 返回数据相应的参数的PO类。set/get方法

4.WeiXinUtil添加一个方法 publicOAuth  getOAuthInfo(String appid, String secret, String code)得到json格式。并使用JSONObject读取出自己想要的数据。

个人微博 http://weibo.com/u/2205636212 

个人博客 http://my.oschina.net/xshuai/blog 

公开QQ  783021975

个人联盟 http://www.bengbeng.com/?sid=687095    

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183