微信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、添加依赖:

<dependency>
      <groupId>com.github.binarywang</groupId>
      <artifactId>weixin-java-mp</artifactId>
      <version>3.0.0</version>
</dependency>


3、配置:


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

<!-- 微信相关配置 -->
<bean id="wxMpConfigStorage" class="me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage">
      <property name="appId" value="你的appId"/>
      <property name="secret" value="你的secret"/>
</bean>
<bean id="wxMpService" class="me.chanjar.weixin.mp.api.impl.WxMpServiceImpl">
      <property name="wxMpConfigStorage" ref="wxMpConfigStorage"/>
</bean>


若是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获取到codestate,不过这里我们并没有state并没有传值,所以获取到也没用。获取到了code,就可以获取到wxMpOAuth2AccessToken,获取到了

wxMpOAuth2AccessToken就可以获取到openId、accessToken、wxMpUser等信息了。


5、微信扫码:


需求:用户使用微信扫描二维码后,就会跳转到指定的url中,且能获取到扫码用户的信息。


其实这个很好实现,只需要将


http://wx.natappvip.cc/authorize?url=指定的url&state=需要传递的参数

这个链接变成二维码即可。


  • 生成二维码:

/** 生成带url的二维码 */
@GetMapping("/generateqrcode4shopauth")
@ResponseBody
public 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();
            }
        }
}


这个就是生成二维码的方法,在前端页面中直接通过<img src="..."/>标签,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<NameValuePair> params = new ArrayList<NameValuePair>();
            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获取到刚才生成自定义的参数,就可以为所欲为了。


总结:


上面介绍了weixin-java-tools的少部分用法,这只是冰山一角,更多用法请参考在github上搜索binarywang。



相关文章
|
1月前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
131 10
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
21小时前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
23天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
45 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
11天前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
67 13
|
16天前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
49 10
|
9天前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
48 2
|
19天前
|
JavaScript 安全 Java
java版药品不良反应智能监测系统源码,采用SpringBoot、Vue、MySQL技术开发
基于B/S架构,采用Java、SpringBoot、Vue、MySQL等技术自主研发的ADR智能监测系统,适用于三甲医院,支持二次开发。该系统能自动监测全院患者药物不良反应,通过移动端和PC端实时反馈,提升用药安全。系统涵盖规则管理、监测报告、系统管理三大模块,确保精准、高效地处理ADR事件。
|
1月前
|
开发框架 Java 关系型数据库
Java哪个框架适合开发API接口?
在快速发展的软件开发领域,API接口连接了不同的系统和服务。Java作为成熟的编程语言,其生态系统中出现了许多API开发框架。Magic-API因其独特优势和强大功能,成为Java开发者优选的API开发框架。本文将从核心优势、实际应用价值及未来展望等方面,深入探讨Magic-API为何值得选择。
46 2
|
1月前
|
监控 前端开发 Java
【技术开发】接口管理平台要用什么技术栈?推荐:Java+Vue3+Docker+MySQL
该文档介绍了基于Java后端和Vue3前端构建的管理系统的技术栈及功能模块,涵盖管理后台的访问、登录、首页概览、API接口管理、接口权限设置、接口监控、计费管理、账号管理、应用管理、数据库配置、站点配置及管理员个人设置等内容,并提供了访问地址及操作指南。