一、首先想要对接,先要一个再就是开发文档了:

https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

!!请注意红色标记住,这一点

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_模板消息

二、接下来完成公众号的基本配置:

1、服务器地址(URL):必须以http://或https://开头,分别支持80端口和443端口。这个URL是很重要的,需要响应微信发送的token验证

2、令牌(Token):必须为英文或数字,长度为3-32字符。上面说过做验证的

3、消息加解密密钥:可以直接随机生成

4、消息加解密方式:明文、兼容、安全 看业务需求选择:我觉得明文省事点(个人见解)

5、详解微信开发文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

三、如果一直用微信的接口调用,会有点麻烦

所以这边我就引用了 —》WxJava《—

github:https://github.com/Wechat-Group/WxJava

gitee:https://gitee.com/binary/weixin-java-tools

四、参数说明

先来看看官方文档对于推送模板消息参数说明:https://mp.weixin.qq.com/advanced/tmplmsg?action=faq&token=438084880&lang=zh_CN

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_微信_02

五、openId怎么拿? 不知道!那好吧,度娘一下、google一下,疑惑不就解决了!

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_微信_03

六、template_id:模板Id;对于这个可以自己申请 or 选用已有的

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_模板消息_04

任意选择一个进去添加模板就行了:

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_模板消息_05


java获取获取发布文章接口有乱码 javalibrary网址公众号口令_模板消息_06

七、现在就开始,请大家详细的看看 WxJava 的文档

—先建立 SpringBoot 项目—

1、导入wxjava公众号 对应的pom

<!-- WxJava公众号 -->
<dependency>
   <groupId>com.github.binarywang</groupId>
   <artifactId>weixin-java-mp</artifactId>
   <version>3.6.0</version>
</dependency>

2、配置公众号相关的信息了,在 .yml或者 .properties里面配置

wx:
  appid: 11111
  secret: 22222
  token: 33333
  aeskey: 44444

或者

wx.appid=123456789
wx.secret=123456789
wx.token=123456789
wx.aeskey=123456789

3、配置了这个就需要对应这个配置的Component了(实体类)

/**
 * @ClassName WXProperties
 * @Author 晓航仔
 * @Date 2021/1/20 04:26
 **/
@Data
@Component
@ConfigurationProperties(prefix = "wx")
public class WxMpProperties {

    /**
     * 公众号appId
     */
    private String appId;

    /**
     * 公众号appSecret
     */
    private String secret;

    /**
     * 公众号token
     */
    private String token;

    /**
     * 公众号aesKey
     */
    private String aesKey;
}

4、关于注解详情,看官方文档

SpringBoot:

https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-yaml

Lombok:

https://projectlombok.org/features/all

-----------------------------JAVA源码 ---------Start-----------------------------

5、模板数据详情以及分析

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_微信_07

刚刚选择的模板,这些key都一个一个参数,文档上面说的很明白,赋值替换就ok了。

6、继续查看 WxJava文档

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_微信_08

根据上面的示例代码,写了个自测源码Demo

/**
 * 微信消息推送
 *
 * @ClassName WxMsgPush
 * @Author 晓航仔
 * @Date 2021/1/20 05:29
 **/
    @Slf4j
    @Component
    public class WxMsgPush {

    /**
     * 微信公众号API的Service
     */
    private final WxMpService wxMpService;

    /**
     * 构造注入
     */
    WxMsgPush(WxMpService wxMpService) {
        this.wxMpService = wxMpService;
    }

    /**
     * 发送微信模板信息
     *
     * @param openId 接受者openId
     * @return 是否推送成功
     */
    public Boolean SendWxMsg(String openId) {
        // 发送模板消息接口
        WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
                // 接收者openid
                .toUser(openId)
                // 模板id
                .templateId("xxxxxxxxxx模板IDxxxxxxxxxxxxxxxxx")
                // 模板跳转链接
                .url("http://www.baidu.com")
                .build();
        // 添加模板数据
        templateMessage.addData(new WxMpTemplateData("first", "您好", "#FF00FF"))
                .addData(new WxMpTemplateData("keyword1", "这是个测试", "#A9A9A9"))
                .addData(new WxMpTemplateData("keyword2", "这又是个测试", "#FF00FF"))
                .addData(new WxMpTemplateData("remark", "这还是个测试", "#000000"));
        String msgId = null;
        try {
            // 发送模板消息
            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        log.info("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失败");
        return msgId != null;
    }
}

Could not autowire. No beans of ‘WxMpService’ type found. -------> 无法自动接线。找不到“ WxMpService”类型的bean

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_模板消息_09

后来仔细研究了下,因为有多个实现类,我们需要自己写个config,把这个实现类@Bean注入

/**
 * @ClassName WxConfig
 * @Author 晓航仔
 * @Date 2021/1/20 09:26
 **/
@Configuration
public class WxConfig {

    /**
     * 声明实例
     *
     * @return
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        return wxMpService;
    }
}

7、接下来,继续分析代码

首先这个

java获取获取发布文章接口有乱码 javalibrary网址公众号口令_微信_10


点进去瞅一眼有四个属性:

/**
 * 接收者openid.
 */
private String toUser;

/**
 * 模板ID.
 */
private String templateId;

/**
   * 模板跳转链接.
   * <pre>
   * url和miniprogram都是非必填字段,若都不传则模板无跳转;若都传,会优先跳转至小程序。
   * 开发者可根据实际需要选择其中一种跳转方式即可。当用户的微信客户端版本不支持跳小程序时,将会跳转至url。
   * </pre>
   */
  private String url;

  /**
   * 跳小程序所需数据,不需跳小程序可不用传该数据.
   *
   * @see #url
   */
  private MiniProgram miniProgram;

8、注意一下这个方法:

//添加模板数据
 templateMessage.addData(new WxMpTemplateData("first", first, "#FF00FF"))
                    .addData(new WxMpTemplateData("keyword1", keyword1, "#173177"))
                    .addData(new WxMpTemplateData("keyword2", keyword2, "#173177"))
                    .addData(new WxMpTemplateData("keyword3", keyword3, "#173177"))
                    .addData(new WxMpTemplateData("keyword4", keyword4, "#173177"))
                    .addData(new WxMpTemplateData("remark", remark, "#000000"));

该填充的值,需要跟你之前申请的模板那些key对应上,正常赋值的内容,以及对应的颜色比例。

9、最后一步:推送

try {
            // 发送模板消息
            msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        log.warn("·==++--·推送微信模板信息:{" + openId + "}·--++==·", msgId != null ? "成功" : "失败");
        return msgId != null;

点进去

/**
     * 返回模板消息相关接口方法的是实现对象,以方便调用其他各个接口
     *
     * return WxMpTemplateMsgService
     */
    WxMpTemplateMsgService getTemplateMsgService();

再次点击进去

package me.chanjar.weixin.mp.api;

import java.util.List;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
 /**
   * @param var1 模板消息
   * @return 消息ID
   * @throws throws
   */
public interface WxMpTemplateMsgService {

    String sendTemplateMsg(WxMpTemplateMessage var1) throws WxErrorException;
    
}

10、读取配置文件里面的信息

/**
 * @ClassName WxConfig
 * @Author 晓航仔
 * @Date 2021/1/20 09:23
 **/
@Configuration
public class WxConfig {

    private final WxMpProperties wxMpProperties;

    /**
     * 构造注入
     *
     * @param wxMpProperties
     */
    WxConfig(WxMpProperties wxMpProperties) {
        this.wxMpProperties = wxMpProperties;
    }

    /**
     * 微信客户端配置存储
     *
     * @return
     */
    @Bean
    public WxMpConfigStorage wxMpConfigStorage() {
      es.getAesKey());
        return configStorage;
    }

    /**
     * 声明实例
     *
     * @return
     */
    @Bean
    public WxMpService wxMpService() {
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }
 }

11、开始测试吧。请自己建一个Controller

/**
 * 微信消息推送
 */
private final WxMsgPush wxMsgPush;

/**
 * 构造注入
 */
protected PushMsgApi(WxMsgPush wxMsgPush) {
    this.wxMsgPush = wxMsgPush;
}

/**
     * 发送微信模板消息
     */
    @ApiOperation("发送微信模板消息")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "openId", value = "接受者openId", dataType = "String", paramType = "query")
    })
    @PostMapping("/sendWxInfo")
    public void sendWxInfo(String openId) {
        // 执行发送
        Boolean aBoolean = wxMsgPush.SendWxMsg(openId);
        System.out.println(aBoolean);
    }

-----------------------------JAVA源码 ---------End-----------------------------

附:springboot+maven实现跨域问题

@Component
public class CorsInterceptor implements HandlerInterceptor
{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
    {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        response.setHeader("Access-Control-Allow-Origin", httpServletRequest.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "86400");
        response.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));

        // 如果是OPTIONS则结束请求
        if (HttpMethod.OPTIONS.toString().equals(request.getMethod()))
        {
            response.setStatus(HttpStatus.OK.value());
            return false;
        }

        return true;
    }
}

Add上下两段代码组合

@Configuration
public class WebConfig implements WebMvcConfigurer
{
    @Resource
    private CorsInterceptor corsInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry)
    {
        // 跨域拦截器需放在最上面
         registry.addInterceptor(corsInterceptor).addPathPatterns("/**");
    }
}