一、weixin-java-tools介绍:
weixin-java-tools是大神binarywang写的一个全能微信Java开发工具包,支持包括微信支付、开放平台、小程序、企业微信/企业号和公众号等的开发,使用起来十分方便。具体的大家可以去GitHub上搜索binarywang。
二、使用方法:
1、后台配置:
本人使用的是微信测试号,因此访问http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
,登录你的测试号。然后找到如下配置项:
点击修改,改成你的域名即可。比如我修改的就是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
获取到code
和state
,不过这里我们并没有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。