‘壹’ java基于微信开发,用oauth2静默授权是,回调的url总是执行两次,怎么回事呀
用户关注微信公众账号;
微信公众账号提供用户请求授权页面URL;
用户点击授权页面URL,将向服务器发起请求;
服务器询问用户是否同意授权给微信公众账号;
用户同意(scope为snsapi_base时无此步骤);
服务器将CODE通过回调传给微信公众账号;
微信公众账号获得CODE;
微信公众账号通过CODE向服务器请求Access Token;
服务器返回Access Token和OpenID给微信公众账号;
微信公众账号通过Access Token向服务器请求用户信息;
服务器将用户信息回送给微信公众账号。
‘贰’ 紧急求助,微信设置“开发者中心”的 OAuth2.0网页授权设置
1.OAuth 2.0网页授权有两种模式:
(1)
Base(基本型),用户可直接通过链接访问,相应的微信公众账号只能获取用户的openid,无法获取到其它信息。
(2) Userinfo(用户信息型),访问时会弹出授权页面,同意后微信公众账号可以获取用户其它信息,比如昵称、头像、性别、省份等等。
具体的设置方法,你可以按照韩顺平的PHP微信开发课程来设置
‘叁’ java中微信分享链接获取openid,
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 调用微信的授权接口
4 然后将redirect_uri进行encode
5 获取用户openid
‘肆’ java怎么获取微信的openid
java获取微信的openid的方法是根据授权code来获取的,方法如下:
一个Servlet请求 获取code:
/**
* 根据code取得openId
*
* @param appid 公众号的唯一标识
* @param secret 公众号的appsecret密钥
* @param code code为换取access_token的票据
* @return
*/
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//参数
String code = request.getParameter("code");
if(null != code && !"".equals(code)){
log.info("==============[OAuthServlet]获取网页授权code不为空,code="+code);
//根据code换取openId
OAuthInfo oa = WeixinUtil.getOAuthOpenId(Constants.appId,Constants.appSecret,code);
UserInfo info = WeixinUtil.getUserInfo(oa.getAccessToken(), oa.getOpenId());
if(!"".equals(oa) && null != oa){
request.setAttribute("openid", oa.getOpenId());
request.setAttribute("nickname", info.getNickname());
request.getRequestDispatcher("/index.jsp").forward(request, response);
}else{
log.info("==============[OAuthServlet]获取网页授权openId失败!");
}
}else{
log.info("==============[OAuthServlet]获取网页授权code失败!");
}
}
替换相应的APPID APPSECRET SCOPE。
过code换取网页授权access_token 这里的access_token与基础获取的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"
}
‘伍’ 微信web开发者工具如何进行调试微信网页授权
具体操作步骤为:
开发者可以在调试器中点击“登录”,使用手机微信扫码登录,从而使用真实的用户身份来开发和调试微信网页授权。请确认手机登录页,绑定的公众号为“微信 web 开发者工具”,如下图所示:
为了保证开发者身份信息的安全,对于希望调试的公众号,我们要求开发者微信号与之建立绑定关系。具体操作为:公众号登录管理后台,启用开发者中心,在开发者工具——web 开发者工具页面,向开发者微信号发送绑定邀请。
开发者在手机微信上接受邀请,即可完成绑定。每个公众号最多可同时绑定10个开发者微信号。
完成登录和绑定后,开发者就可以开始调试微信网页授权了:
非静默授权的 URL: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_userinfo&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
点击“确认登录”即可带着用户信息跳转到第三方页面,很方便的进行后续的开发和调试。
静默授权的 URL: https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx841a97238d9e17b2&redirect_uri=http://cps.dianping.com/weiXinRedirect&response_type=code&scope=snsapi_base&state=type%3Dquan%2Curl%3Dhttp%3A%2F%2Fmm.dianping.com%2Fweixin%2Faccount%2Fhome
在微信 web 开发者工具中打开该 URL 则会自动跳转到第三方页面。
‘陆’ oauth2.0网页授权微信怎么用java获取code
@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.isEmpty(appId)||mapWxAppInfo.get(appId)==null){
view.setViewName("fail");
return view;
}
//scope=snsapi_base 获取用户openId,无需授权
//scope=snsapi_userinfo 获取用户基本信息,需授权
String oauthUrl="https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s#wechat_redirect";
//处理授权回调地址
String callback="http://wx.lrlz.com/wx/callback/"+appId;
if(!StringUtils.isEmpty(openId)){
callback += "/"+openId;
}
oauthUrl=String.format(oauthUrl, appId,callback,scope,type);
log.info("微信授权认证地址="+oauthUrl);
view.setViewName("redirect:" + oauthUrl);
return view;
}
/**
* 处理网页授权回调
* */
@RequestMapping(value="callback/{appId}")
public ModelAndView callback(@PathVariable String appId,String code,String state,String redirectUri,HttpServletRequest req,HttpServletResponse response){
return getCallback(appId,code,state,null);
}
这样就行了