微信Java SDK开发文档(2.0.0)地址:https://github.com/wechat-group/weixin-java-tools/wiki
微信Java SDK使用说明:
https://github.com/wechat-group/weixin-java-tools/
SDK作用:他已经把微信大部分功能都做好了,我们只需要进行配置,再调用其方法就可以完成微信的一些功能开发。
目前开源的微信公众号SDK有:jfinal-weixin,weixin-java-tools,fastweixin,weixin-popular
本次使用weixin-java-tools。
1.在maven中添加依赖
<!-- 微信公众号 -->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>3.0.0</version>
</dependency>
2.在项目中进行配置,
一般配置信息不会在项目代码中进行配置,会统一做一个全局配置
package com.wechat.order.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/*微信公众号账号设置*/
@Data//使用了lombok依赖,相当于在代码中getter和setter的作用
@Component
@ConfigurationProperties(prefix = "wechat")//账号信息写在了application.yml中。
public class WeChatAccountConfig {
private String mpAppId;
private String mpAppSecret;
}
package com.wechat.order.config;
import me.chanjar.weixin.mp.api.WxMpConfigStorage;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
/*微信公众号配置*/
@Component
public class WeChatMpConfig {
@Autowired
private WeChatAccountConfig weChatAccountConfig;
//把你要实例化的对象转化成一个Bean,放在IoC容器中
@Bean
public WxMpService wxMpService() {
WxMpService wxService = new WxMpServiceImpl();// 实际项目中请注意要保持单例,不要在每次请求时构造实例,具体可以参考demo项目
wxService.setWxMpConfigStorage(wxMpConfigStorage());
return wxService;
}
@Bean
private WxMpConfigStorage wxMpConfigStorage() {
WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage();
config.setAppId(weChatAccountConfig.getMpAppId()); // 设置微信公众号的appid
config.setSecret(weChatAccountConfig.getMpAppSecret()); // 设置微信公众号的app corpSecret
return config;
}
}
3.调用方法
package com.wechat.order.controller;
import com.wechat.order.enums.ResultEnum;
import com.wechat.order.exception.SellException;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.net.URLEncoder;
@Controller
@RequestMapping("/wechat")
@Slf4j//日志注解
public class WeChatController {
@Autowired
private WxMpService wxMpService;
/**
* 换取微信用户openId
* @param returnUrl
* @return
*/
@GetMapping("/authorize")
public String authorize(@RequestParam("returnUrl")String returnUrl) {
//1.配置(在上步已配置完毕)
//2.调用方法
String url = "http://e724bad2.ngrok.io/sell/wechat/userInfo";//实际项目中,网站根目录应该做一个全局配置,此处为了方便,直接写
String redirectUri = wxMpService.oauth2buildAuthorizationUrl(url, WxConsts.OAuth2Scope.SNSAPI_USERINFO, URLEncoder.encode(returnUrl));
log.info("redirectUri={}", redirectUri);//日志
return "redirect:" + redirectUri;//跳转
}
/*获得用户信息*/
@GetMapping("/userInfo")
public String userInfo(@RequestParam("code") String code,
@RequestParam("state") String returnUrl) {
//获得access token
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = new WxMpOAuth2AccessToken();
try {
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(code);
}catch (WxErrorException e){
log.error("【微信网页授权】{}",e);
throw new SellException(ResultEnum.WECHAT_MP_ERROR);//授权失败抛出异常,此方法同学们自行编写,若不会可删除此行。
}
//获取openId
String openId = wxMpOAuth2AccessToken.getOpenId();
log.info("openId={}",openId);
return "redirect:" + returnUrl+"?openid="+openId;
}
}