浅析微信支付:微信公众号网页授权 (2)

第二部分:获取用户授权的基础信息:

// 这里的appid就是咋们测试号的appid $appid="xxx"; // 这里的地址需要且必须encodeURI,此地址为获取用户信息后,微信自动转发的服务器端接口,用来接收微信的授权code,在后端处理而得到用户基本信息 $redirect_uri=encodeURI("http://127.0.0.1:8888/weixin/auth/authorize.do"); // 微信官方的授权接口 $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid="+$appid+"&redirect_uri="+$redirect_uri+"&response_type=code&scope=snsapi_userinfo&state=" + state + "#wechat_redirect"; // state可以用来区分特殊参数和配置

具体可见微信官方文档,文档如下:微信网页授权接口

以上为js页面处理,下面我们来具体讲解 redirect_uri 这个接口中需要处理的逻辑;

WXAuthController:

/** * 微信网页授权 * https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842 * 第一步:用户同意授权,获取code * 第二步:通过code换取网页授权access_token * @return str * * @author yclimb * @date 2018/7/30 */ @ApiOperation(value = "微信用户|网页授权", httpMethod = "GET", notes = "获取前端微信用户的网页授权,得到用户基础信息") @GetMapping("/authorize") public AppMessage authorize(HttpServletRequest request) { // 跳转页面标识 String state = request.getParameter("state"); // 通过code获取access_token String code = request.getParameter("code"); log.info("authorize:code:{}", code); String appid; String secret; // 根据不同的state得到不同的微信公众号网页授权 switch (state) { case STATE_ASYD: appid = WXPayConstants.APP_ID_ASYD; secret = WXPayConstants.SECRET_ASYD; break; default: appid = WXPayConstants.APP_ID_CHUNBO; secret = WXPayConstants.SECRET_CHUNBO; break; } // 获取access_token和openid JSONObject jsonToken = wxUtils.getJsapiAccessTokenByCode(code, appid, secret); if (null == jsonToken) { return AppMessage.error(-2); } return AppMessage.success(jsonToken); }

WXUtils:

/** * 网页授权获取用户信息时用于获取access_token以及openid * 请求路径:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code(最后一个参数不变) * * @param code c * @return access_token json obj * @author yclimb * @date 2018/7/30 */ public JSONObject getJsapiAccessTokenByCode(String code, String appid, String secret) { if (StringUtils.isBlank(code)) { return null; } try { // 获取access_token String access_token_json = restTemplate.getForObject(WeChatURL.OAUTH_ACCESS_TOKEN_URL, String.class, appid, secret, code); logger.info("getJsapiAccessTokenByCode:access_token_json:{}", access_token_json); if (StringUtils.isBlank(access_token_json)) { return null; } JSONObject jsonObject = JSON.parseObject(access_token_json); if (StringUtils.isBlank(jsonObject.getString("access_token"))) { return null; } return jsonObject; } catch (Exception e) { logger.error(e.getMessage(), e); } return null; }

使用以上方法就可以得到微信用户的基础咯~,上面是作者已经封装好的sdk方法,具体的源码请见文末源码地址。

如果用户已经授权,第二次进入网页,这时候不需要再次授权,作者也提供了另一种获取用户信息的方法,通过access_token和openid请求获取用户信息,代码如下:

/** * 通过access_token和openid请求获取用户信息 * @return str * * @author yclimb * @date 2018/9/17 */ @ApiOperation(value = "微信用户|通过access_token和openid请求获取用户信息", httpMethod = "POST", notes = "通过access_token和openid请求获取用户信息") @PostMapping("/getXxxUser/{access_token}/{openid}") public AppMessage getXxxUser(@PathVariable String access_token, @PathVariable String openid) { // 通过access_token和openid请求获取用户信息 JSONObject jsonUserinfo = wxUtils.getJsapiUserinfo(access_token, openid); if (null == jsonUserinfo) { return AppMessage.error(-2); } // 判断用户是否在悦店系统中是一个用户 String unionid = jsonUserinfo.getString("unionid"); if (StringUtils.isBlank(unionid)) { return AppMessage.error(61008); } // 存储用户信息到数据库 // 用户名称解码 user.setNickName(UserNickUtil.decodeNickName(user.getNickName())); return AppMessage.success(user); } 结语

根据以上步骤实现,就可以完成微信授权-用户信息获取等操作,如果有问题,欢迎小伙伴随时交流~

预告:下一篇文章,作者将讲 统一下单接口,敬请期待!!!

​如果想要提前一览源码的小伙伴,可以先看看我的 github,地址如下: https://github.com/YClimb/wxpay-sdk/blob/master/README.md

加作者私人微信,作者微信号如下 yclimb,标明 微信支付 可拉入微信支付讨论群与小伙伴一起探讨哦,一定要标明 微信支付 哦~

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsxjps.html