栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java > SpringBoot

微信Java开发工具包的使用

SpringBoot 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

微信Java开发工具包的使用

前言:

之前我在《Java调用微信登录以及eclipse远程调试》一文中说到了Java程序怎么调用微信登录,不过那篇文章中使用的是手工方式,本文将介绍如何使用第三方SDK(binarywang)进行微信网页授权以及获取微信用户信息。

一、weixin-java-tools介绍:

weixin-java-tools是大神binarywang写的一个全能微信Java开发工具包,支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的开发,使用起来十分方便。具体的大家可以去GitHub上搜索binarywang。

二、使用方法:

1、后台配置:
本人使用的是微信测试号,因此访问http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login,登录你的测试号。然后找到如下配置项:

image.png


点击修改,改成你的域名即可。比如我修改的就是wx.natappvip.cc。
2、添加依赖:



      com.github.binarywang
      weixin-java-mp
      3.0.0

3、配置:
本项目是springmvc项目,所以在spring的配置文件中进行如下配置:


      
      
      

若是springboot项目,那就得新建配置类了。配置了之后就可以开始使用了。

4、开始使用:

  • 首先新建一个授权的controller:

@GetMapping("/authorize")
public String authorize(@RequestParam("state") String state,
                        @RequestParam("url") String url){        //这个方法的三个参数分别是授权后的重定向url、获取用户信息类型和state
       String redirectUrl = wxMpService .oauth2buildAuthorizationUrl(
                            url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, URLEncoder.encode(state));
       log.info("【微信网页授权】获取code,redirectUrl={}",redirectUrl);       return "redirect:" + redirectUrl;
}

解释一下这个方法:这个方法需要两个参数,
state:就是微信定义的一个参数,用户可以传入自定义的参数,等下会讲解怎么用state传值;
url:就是用户微信授权登录后重定向的页面路由。
比如现在访问该方法并传入如下参数:
http://wx.natappvip.cc/authorize?url=http://wx.natappvip.cc/index&state=null
因为传入的url是http://wx.natappvip.cc/index,state是null,那么在微信中访问上面的链接,就会重定向到http://wx.natappvip.cc/index,并且会把code以及state携带到重定向后的url中。

  • 获取微信用户的公开信息:

@GetMapping("/userInfo")public String userInfo(@RequestParam("code") String code,@RequestParam("state") String state){
        WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();        try {
            wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
        }catch (WxErrorException e){
            log.error("【微信网页授权】{}",e);
        }        //获取openId
        //String openId = wxMpOAuth2AccessToken.getOpenId();
        //获取accessToken
        //String accessToken = wxMpOAuth2AccessToken.getAccessToken();
        // 获取微信用户的公开信息
        WxMpUser user = null;        try {
            user = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken,null);
        }catch (Exception e){
            log.info("【获取微信用户信息】获取微信用户信息失败,user={}",user);
        }
}

解释一下这个方法:这个方法需要搭配第一个授权的方法一起使用,构成如下链接:
http://wx.natappvip.cc/authorize?url=http://wx.natappvip.cc/userInfo&state=null,
用户通过访问该链接后,在上面这个userInfo方法中就可以通过@RequestParam获取到code和state,不过这里我们并没有state并没有传值,所以获取到也没用。获取到了code,就可以获取到wxMpOAuth2AccessToken,获取到了wxMpOAuth2AccessToken就可以获取到openId、accessToken、wxMpUser等信息了。

5、微信扫码:
需求:用户使用微信扫描二维码后,就会跳转到指定的url中,且能获取到扫码用户的信息。
其实这个很好实现,只需要将
http://wx.natappvip.cc/authorize?url=指定的url&state=需要传递的参数
这个链接变成二维码即可。

举个栗子


  • 生成二维码:

@GetMapping("/generateqrcode4shopauth")@ResponseBodypublic void generateORCode4ShopAuth(HttpServletRequest request,HttpServletResponse response) {        //从session中获取当前店铺信息
        Shop shop = (Shop) request.getSession().getAttribute("currentShop");
        String content = "{aaashopIdaaa:" + shop.getShopId() +  ",aaacreateTimeaaa:" + System.currentTimeMillis + "}";        if(shop != null && shop.getShopId() != null) {            try {
                String longUrl = "http://wx.natappvip.cc/wechat/authorize" +                        "?url=http://wx.natappvip.cc/shopadmin/addshopauthmap" +                        "&state=" + URLEncoder.encode(content,"UTF-8");                //将目标url转成短url
                String shortUrl = ShortNetAddressUtil.generateShortUrl(longUrl);                //生成二维码
                BitMatrix qRcodeImg = QRCodeUtil.generateQRCodeStream(shortUrl, response);                //将二维码以图片流形式输出到前端
                MatrixToImageWriter.writeToStream(qRcodeImg, "png", response.getOutputStream());
            }catch(Exception e) {
                e.printStackTrace();
            }
        }
}

这个就是生成二维码的方法,在前端页面中直接通过标签,src指向这个生成二维码方法的路由即可。注意。state要携带多个参数的话就用上面的方式,先将多个参数拼接成一个字符串content,但是不能直接让state=content,一定要先用encode方法编码一下。另外在附上缩短网址的工具类:

public class ShortNetAddressUtil {    public static CloseableHttpClient httpclient;    static {
        httpclient = HttpClients.createDefault();
    }    
    public static String generateShortUrl(String url) {        try {
            HttpPost httpost = new HttpPost("http://suo.im/api.php");            List params = new ArrayList();
            params.add(new BasicNamevaluePair("format", "utf-8")); // 编码
            params.add(new BasicNamevaluePair("url", url)); // 用户名称
            httpost.setEntity(new UrlEncodedFormEntity(params, "utf-8"));
            HttpResponse response = httpclient.execute(httpost);
            String jsonStr = EntityUtils.toString(response.getEntity(), "utf-8");            return jsonStr;
        } catch (Exception e) {
            e.printStackTrace();            return "Error";
        }
    }
}
  • 扫描二维码后发生的事情:
    在上面的生成二维码方法中,因为重定向的url是http://wx.natappvip.cc/shopadmin/addshopauthmap,所以用户使用微信扫描二维码后,就会携带code、state等参数跳到这个路由指向的方法中。该方法如下:

@GetMapping("/exchangeaward")
private String exchangeAward(@RequestParam("code") String code,
                             @RequestParam("state") String state) {        // 在这里可以通过code获取到openId、微信用户公开信息等
        // 解析state中携带的参数
        String qrCodeinfo = new String(URLDecoder.decode(state, "UTF-8"));
        ObjectMapper mapper = new ObjectMapper();        //wechatInfo类用来接收state携带的参数
        WechatInfo wechatInfo = null;            try {                // 将解码后的内容用aaa去替换之前生成二维码时加入的aaa
                wechatInfo = mapper.readValue(qrCodeinfo.replace("aaa", """), WechatInfo.class);
            } catch (Exception e) {                return "fail";
            }       return "success";
}

该方法中可以通过code获取到微信用户相关信息,可以通过state获取到刚才生成自定义的参数,就可以为所欲为了。



作者:贪挽懒月
链接:https://www.jianshu.com/p/9f02936b132a


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/235616.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号