我们就以Blade-Boot版本为例,添加功能,包我们使用 WxJava, cloud版本一样的方法,就是多了一个Feign调用。
WxJava 仓库地址:WxJava
添加Maven依赖,pom文件的
3.3.8.B
com.github.binarywang weixin-java-mp ${wxjava.version}
2. pull WxJava的官方spring boot 版本的 demo,地址:weixin-java-mp-demo-springboot
我们只需要如下几个包:
在Blade项目源码的 modules下新建 wecaht 包,然后 在idea中右键点击wechat,选择 Paste,这样可以自动重构包名,省去手动重构的麻烦,当然如果想省事直接新包名命名为 wx 会省掉下面重新修改方法名称的步骤
3.修改 复制过来这些文件的 import 包的名称,
把 :
com.github.binarywang.demo.wx.mp
替换成:
org.springblade.modules.wechat修改类中44行代码为如下,Blade-tool中包含JsonUtil类:
return JsonUtil.toJson(this);
logHandler.java 第21行修改为:
this.logger.info("\n接收到请求消息,内容:{}", JsonUtil.toJson(wxMessage));
本人强迫症,看见wx 就觉得不顺眼,所以全部重构成了 wechat,包括Controller里面的
@RequestMapping("/wechat/menu/{appid}")
修改 WechatProperties.java 原(WxProperties.java)中的 :
@ConfigurationProperties(prefix = "wechat.mp")
在application.yml中添加如下相关参数,要替换成你自己的,列表,支持多公众号:
wechat: mp: configs: - appid: wx10ac526bf4 secret: b36f27d22b5b4de token: 054819748a414f1d85 aesKey: xNADShX1me2Wh7WV - appid: wxb20f0ef44 secret: 174b22769fd7 token: 2B6511C72D2 aesKey: xNADShX1me2Wh7W
4.修改blade-tool源码,
/bladex-tool/blade-core-tool/src/main/java/org/springblade/core/tool/support/xss/XssFilter.java
排除weichat路径的xss过滤,全部关键源码如下:
public class XssFilter implements Filter {
/**
* 排除路径列表
*/
public static final String EXCLUDE_URL_SET = "/wechat";
/** {@inheritDoc} */
@Override
public void init(FilterConfig config) throws ServletException {
}
/** {@inheritDoc} */
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String path = ((HttpServletRequest) request).getServletPath();
if (path.contains(EXCLUDE_URL_SET)) {
//排除URL则不转换成xxs
chain.doFilter(request, response);
} else {
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
(HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}
}
/** {@inheritDoc} */
@Override
public void destroy() {
}
}
5. 修改 common.config包下的 BladeConfiguration.java 放行 /wechat/**,添加:
secureRegistry.excludePathPatterns("/wechat/**");
按照以上配置,基本上你的公众号就成功对接了,到公众号设置界面设置好Appid、secret、token、aeskey,
消息加密方式选择“安全模式”,因为支持多公众号,URL 填写你的域名+wechat/portal/{appid}, appid 就是你当前设置的公众号的appid,关于内网穿透请百度或google解决。
最后再添加一个前端常用获取js sdk签名的类,直接贴代码:
/**
* @Author 858695266@qq.com
*/
@Slf4j
@RestController
@RequestMapping("/wechat/api/{appid}")
public class ApiController {
/**
* 获取signature
* * @param request
*
* @param url
* @return Map
*/
@ResponseBody
@GetMapping(value = "jssignature")
public Map getJsSignature(HttpServletRequest request, @PathVariable String appid, String url) {
Map map = new HashMap<>(1);
try {
final WxMpService wxService = WeChatMpConfiguration.getMpServices().get(appid);
// 获取signature
WxJsapiSignature sin = wxService.createJsapiSignature(url);
map.put("appId", appid);
map.put("timestamp", sin.getTimestamp());
map.put("nonceStr", sin.getNonceStr());
map.put("signature", sin.getSignature());
log.info("request.getRequestURL()=====createJsapiSignature===============>"+ request.getRequestURL());
log.info("request.getQueryString()=======createJsapiSignature=============>"+ request.getQueryString());
log.info("signature-------------->" + map.get("signature"));
} catch (Exception e) {
log.error(e.getMessage());
}
return map;
}
/**
* 获取signature
* @param request
*
* @param url
* @return
*/
@ResponseBody
@RequestMapping(value = "/getJsTicket")
public String getJsTicket(HttpServletRequest request, @PathVariable String appid, String url) throws WxErrorException {
final WxMpService wxService = WeChatMpConfiguration.getMpServices().get(appid);
String jsTicket= wxService.getTicket(TicketType.JSAPI);
log.info("jsTicket=================>" + jsTicket);
return jsTicket;
}
}
可以postman请求下接口,看是否成功。