-
Notifications
You must be signed in to change notification settings - Fork 626
微信网页授权
下面对到公众号微信网页授权学习过程总结。
首先到微信公众平台注册账号,可以看到有四种类型(服务号,订阅号,小程序,企业微信),本次实战课程用到服务号,而且还需要认证,但注册服务号需要公司的资质,我是注册了一个订阅号(为了后续申请测试号)。
不同的公众号有不同级别的公众号接口权限,详情可以参见微信官公众平台方文档.
从上面文档里可以看到未认证的订阅号没有**[用户管理-网页授权获取用户openid/用户基本信息]**这一项的权限。
所以我们需要到这里申请一个测试号,接口测试号申请
申请测试号后进入测试好管理界面。里面有测试号信息(appID,appSectet)、体验接口权限表等信息。
然后到微信网页授权文档,有对微信网页授权过程的详细描述,这页文档非常重要。
我们用的是测试号,需要再到测试号管理界面修改网页授权域名,如下图。
然后就是微信网页授权的四个步骤,在这里有非常清楚地描述。
首先,在微信客户端访问这个接口,
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
上面有3个要修改的参数信息appId,redirect_uri,scope,appId就填申请的测试号的appId,scope可填snsapi_base,然后这个redirect_uri就是我们访问这个接口后,自动回掉的uri。
如何构造这个uri呢,我们在本地调试运行程序时,肯定是http://127.0.0.1:8080
,但是微信那边是访问不到我们的电脑的,所以我们需要另一个工具:内网穿透
通过它,我们的电脑可以当作一个服务器被访问。我们首先购买一个VIP_1型隧道的隧道,我购买的隧道是http://sqmax.s1.natapp.cc
,然后启动我们的程序,比如访问:http://127.0.0.1:8080/sell/seller/order/list
这个地址,可以替换成:http://sqmax.s1.natapp.cc/sell/seller/order/list
,而且手机也可以去访问这个运行的程序。
上面的隧道是一个3级域名,但是目前临时三级域名已被微信屏蔽无法用于微信开发,所以我们还需要在该网站购买一个一个二级域名,在隧道配置处绑定二级域名,我购买的二级域名是sqmax.natapp1.cc
,然后就可以用这个域名替换http://127.0.0.1:8080
。启动我们的程序,我们的电脑就可以充当一个服务器被访问。
所以我们可以构造这样一个uri:http://sqmax.natapp1.cc/sell/weixin/auth
,(其中sell是我们项目的路径)下面是对应的controller:
@RestController
@RequestMapping("/weixin")
@Slf4j
public class WeixinController {
@GetMapping("/auth")
public void auth(@RequestParam("code") String code){
log.info("进入auth方法.......");
log.info("code={}",code);
//注意下面url里面的url参数的appid和secret就是要替换成自己的,这里我使用的是测试号,就用测试号的
String url="https://api.weixin.qq.com/sns/oauth2/access_token?"
+"appid=wxdcf91e9f784bfad0&secret=c467c06d98a2447f5ddef6ca8f47f268&code="+ code +"&grant_type=authorization_code";
RestTemplate restTemplate=new RestTemplate();
String response=restTemplate.getForObject(url,String.class);
log.info("response={}",response);
}
}
上面的接口就可以是这样:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxdcf91e9f784bfad0&redirect_uri=http://sqmax.natapp1.cc/sell/weixin/auth&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
在微信客户端访问这个接口,然后就会自动回掉访问上面的那个controller,这样控制台就会打印下面的内容:
response={"access_token":"13_Y7UCRFNjPqGQq6XziVnmRqZDnqJZ-BztdR0m3h_-30-PejDX2xSPn1Wm6Kcpd8VhdWGDazSuNDuzW8jVY2VsaBVSxBVUduX44tDnjO7bfTM","expires_in":7200,"refresh_token":"13_5lFyGKRKet4M0iQAlw_u6t1N2ZfU6yBeO5s0bB9QnP0iofS3CrFugb-wrGMXL072W_A9CAjoNaRTs87HMFSUDIcVZLl5NJ1dEMfN2FYir_Y","openid":"ozswp1Ojl2rA57ZK97ntGw2WQ2CA","scope":"snsapi_base"}
这里面包含的openid就是我们进行微信网页授权需要获取到的东西。
详见微信官方文档:微信网页授权
另一种方式就是使用第三方的开源SDK来获取,我们只需要配置好相关关的bean,填写好参数,就可以使用以上原理获取。
我们这里用的是wixin-java-tools这个开源的SDK。
我们首先要到SDK文档的MP_Quick Start部分,查看如何配置WxMpInMemoryConfigStorage
和WxMpService
。
然后到文档的MP_OAuth2网页授权部分,找到如何去获取WxMpOAuth2AccessToken
,这个对象对微信的返回数据作了封装,其中就包含openid字段。
具体过程如下:
@GetMapping("/authorize")
public String authorize(@RequestParam("returnUrl") String returnUrl){
// WxMpService wxMpService=new WxMpServiceImpl();
//1. 配置
//2.调用方法
String url=projectUrlConfig.getWechatMpAuthorize()+"/sell/wechat/userInfo";
String redirectUrl=wxMpService.oauth2buildAuthorizationUrl(url,WxConsts.OAUTH2_SCOPE_BASE, URLEncoder.encode(returnUrl));
log.info("【微信网页授权】获取code,redirectUrl={}",redirectUrl);
return "redirect:"+redirectUrl;//重定向到下面一个方法
}
@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();
log.info("【微信网页授权】获取openid,returnUrl={}",returnUrl);
return "redirect:"+ returnUrl+"?openid="+openId;
}//以上两个方法是SDK方式微信网页授权的过程,
// 访问http://sqmax.natapp1.cc/sell/wechat/authorize?returnUrl=http://www.imooc.com,
//最终将会跳转到这个链接:http://www.imooc.com?openid={openid}
openid是微信用户在公众号appid下的唯一用户标识(appid不同,则获取到的openid就不同),可用于永久标记一个用户,同时也是微信公众号支付的必传参数。
目录