文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。
一、微信公众号授权步骤首先到微信公众平台注册账号,可以看到有四种类型(服务号,订阅号,小程序,企业微信),用到服务号,而且还需要认证,但注册服务号需要公司的资质,我是注册了一个订阅号(为了后续申请测试号)。 不同的公众号有不同级别的公众号接口权限,详情可以参见微信官公众平台方文档. 从上面文档里可以看到未认证的订阅号没有用户管理-网页授权获取用户openid/用户基本信息这一项的权限。
所以我们需要到这里申请一个测试号,接口测试号申请
申请测试号后进入测试好管理界面。里面有测试号信息(appID,appSectet)、体验接口权限表等信息。
然后到微信网页授权文档,有对微信网页授权过程的详细描述,这页文档非常重要(仔细查看,很多问题都是文档没有看清楚)。
我们用的是测试号,需要再到测试号管理界面修改网页授权域名,如下图。
然后就是微信网页授权的四个步骤,在这里有非常清楚地描述。这些步骤都是手工方式获取opendid,下面介绍如何使用SDK的方式获取。
我们这里用的是wixin-java-tools这个开源的SDK。
我们首先要到SDK文档的MP_Quick Start部分,查看如何配置WxMpInMemoryConfigStorage和WxMpService。
然后到文档的MP_OAuth2网页授权部分,找到如何去获取WxMpOAuth2AccessToken,这个对象对微信的返回数据作了封装,其中就包含opendi字段。
以上就是获取openid的两种方式,获取openid是我们下一步微信支付的基础。
二、springboot整合微信授权开发看了上面的文档和sdk后,我们应该知道大概的开发流程,如何整合到springboot呢,可能还是有点不太了解,接下来我们看看。
1.1构造网页授权url(官方文档)首先构造网页授权url,然后构成超链接让用户点击:
WxMpService wxMpService = ...; String url = ...; wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null) 1.2整合到springboot @GetMapping("/authorize") public String authorize(@RequestParam("returnUrl") String returnUrl){ //1. 配置 //2.调用方法 String url="http://localhost:8080/sell/wechat/userInfo"; String redirectUrl=wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_BASE, URLEncoder.encode(returnUrl)); log.info("【微信网页授权】获取code,redirectUrl={}",redirectUrl); return "redirect:"+redirectUrl; }第一步:我们需要配置一个回调的网址url。
第二步:调用sdk的方法
wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, null)
然后会返回我们的重定向url,例如:
第三步:重定向到:8080/sell/wechat/userInfo,为什么会重定向到这个网址呢?其实刚刚开始我也是很纳闷的,然后看了微信网页授权文档,发现,文档这样描述:
所以到我们的项目中,就是重定向到:8080/sell/wechat/userInfo,所以我们实现下面的这个方法。
2.1获得access token(官方文档)当用户同意授权后,会回调所设置的url并把authorization code传过来,然后用这个code获得access token,其中也包含用户的openid等信息
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code); 2.2整合springboot @GetMapping("/userInfo") public String userInfo(@RequestParam("code") String code, @RequestParam("state") String returnUrl){ WxMpOAuth2AccessToken wxMpOAuth2AccessToken=new WxMpOAuth2AccessToken(); try { wxMpOAuth2AccessToken=wxMpService.oauth2getAccessToken(code); }catch (WxErrorException e){ log.error("【微信网页授权】,{}",e); throw new SellException(ResultEnum.WECHAT_MP_ERROR.getCode(),e.getError().getErrorMsg()); } String openId=wxMpOAuth2AccessToken.getOpenId(); return "redirect:"+ returnUrl+"?openid="+openId; }在1.2中我们知道,用户授权之后会重定向到redirect_uri/?code=CODE&state=STATE因此会传过来code和state,所以我们接受这两个参数。
到现在我们获取到了WxMpOAuth2AccessToken 。