知识点

相关文章

更多

最近更新

更多

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

2019-03-02 00:05|来源: 网路

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

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    


转自:http://my.oschina.net/xshuai/blog/293458

相关问答

更多
  • 没有办法的,微信把用户信息控制的很严,只会给开发者一个openId,这是用户的微信号加密后的一串唯一标识
  • openid是腾讯接口提供的用户唯一标识,在servlet中直接用request.getParamter("openid");就可以拿到了
  • @RequestMapping(value="oauth2/{type}/{appId}/{scope}", method=RequestMethod.GET) public ModelAndView index(@PathVariable String type,@PathVariable String appId,@PathVariable String scope,String openId){ ModelAndView view=new ModelAndView(); if(StringUtils. ...
  • 关于网页授权的两种scope的区别说明 1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面) 2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。 3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才 ...
  • 获取用户openid的操作是关于微信网页开发-微信网页授权部分的,你还是仔细看一下微信开发文档把: https://mp.weixin.qq.com/wiki
  • 微信分享的url本身就有openid,伪造Request Headers然后拿到返回的信息就行了
  • 在用户没有关注的情况下,还是会产生一个与公众号对应的openid,可以根据这个openid和基础支持的access_token(不是用code换取的access_token)获取到用户的基本信息 用户信息中的subscribe 是为0的,表示没有关注。
  • 1)在“获取用户基本信息”接口里得到的客户信息比“OAuth2.0网页授权”接口还多,那么为何还要用“OAuth2.0网页授权”接口呢? 2)如果只要获取OpenID的话,是不是只用“接收普通信息”接口就够呢? 3)在用户没有重新关注的情况之下,用户每次发送消息里的OpenID是否不变?
  • 不,这是不可能的。 Google只会发布用户的电子邮件地址。 他们的服务器设置为永不再提供任何更多的信息: 请访问OpenID页面以供开发人员了解更多信息: http : //code.google.com/apis/accounts/docs/OpenID.html No, it isn't possible. Google only releases the user's email address. Their server is set up to never give out any more i ...
  • 请阅读手册: http : //code.google.com/p/lightopenid/wiki/GettingMoreInformation $openid->required = array('namePerson/friendly', 'contact/email'); $openid->optional = array('namePerson/first'); 在调用$ openid-> authUrl()之前! 然后 $openid->validate(); $userinfo = $ope ...