Blade 集成微信功能

96
亡羊补牛
2019-04-21 10:36 字数 6001 阅读 559评论 4



Blade 集成微信功能

我们就以Blade-Boot版本为例,添加微信功能,微信包我们使用 WxJava, cloud版本一样的方法,就是多了一个Feign调用。

WxJava 仓库地址:WxJava

 

  1. 添加Maven依赖,pom文件的 添加wxjava版本号,最新 3.3.8.B 版本,添加公众号依赖,可以根据需求添加企业号、小程序等,具体请关注WxJava Wiki:  

        

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请求下接口,看是否成功。

Blade
登录 后发表评论
4条评论
亡羊补牛
1楼 · 2019-04-21 10:40

src="https://sns.bladex.vip/static/images/pcload.jpg" style="max-width:100%" class="lazy" 这个东西怎么出来的?删除不掉,后面的空行编辑也删除不掉。。。

dkyi
2楼 · 2019-04-22 08:32

感谢牛哥

mymx2
4楼 · 2019-04-25 10:50

nice!感谢老哥分享。另外如果是cloud应用redis存储可参考W,xMpInRedisConfigStorage类实现。