微信公众号发送消息 Java

首先申请一个公众号订阅号(个人测试账号)企业可申请服务号

在开发者工具里面申请一个测试账号

  url 提供自己服务器地址+通信接口路由  或者在本人博客资源下载个natapp 内网穿透有工具 代理个http地址 我用的内网穿透

token 随便填一个主要用来跟微信服务器测试通信正常

//这个token要跟你填的一致

private static final String TOKEN = "1341321a2s1d23a1s454"

//下面方法就是上面url 里面的IP加路由

@GetMapping("check/token")
public String validate(String signature,String timestamp,String nonce,String echostr){
    // 1. 将token、timestamp、nonce三个参数进行字典序排序
    String[] arr = {timestamp, nonce, TOKEN};
    Arrays.sort(arr);
    // 2. 将三个参数字符串拼接成一个字符串进行sha1加密
    StringBuilder sb = new StringBuilder();
    for (String temp : arr) {
        sb.append(temp);
    }
    // 这里利用了hutool的加密工具类
    String sha1 = SecureUtil.sha1(sb.toString());
    // 3. 加密后的字符串与signature对比,如果相同则该请求来源于微信,原样返回echostr
    if (sha1.equals(signature)){
        return echostr;
    }
    // 接入失败
    return null;
}

连接成功后配置订阅用户及模板

扫描二维码会得到用户的openId  一会发送消息用到 模板分为固定内容跟模板内容 1为固定内容 23为动态参数内容

接下来代码接入

pom引入

<!--微信模版消息推送三方sdk-->
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>3.3.0</version>
</dependency>

//这个sdk比较方便方法 接口路由都封装更好的 用起来更方便

下面代码环节

1实体

授权实体 就是测试号的账号 跟key

@Data
public class WxAuthorization {

    private String appId;

    private String appSecret;
    
}

2参数实体 就是发送需要的参数

@Data
public class WxMsgData {
    // 接收人openId
    private String receiver;

    // 消息模板code
    private String templateCode;
    // 跳转url
    private String url;
    // 模板参数
    private Map<String, Object> param;

}

调用

private void sendMsg(WxAuthorization wxAuthorization, WxMsgData wxMsgData) {
    WxMpInMemoryConfigStorage wxStorage = new WxMpInMemoryConfigStorage();
    wxStorage.setAppId(wxAuthorization.getAppId());
    wxStorage.setSecret(wxAuthorization.getAppSecret());
    WxMpService wxMpService = new WxMpServiceImpl();
    wxMpService.setWxMpConfigStorage(wxStorage);
    WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
            .toUser(wxMsgData.getReceiver())
            .templateId(wxMsgData.getTemplateCode())
            .url(wxMsgData.getUrl())
            .build();
    if (wxMsgData.getParam()!=null) {
        for (Map.Entry<String, Object> entry : wxMsgData.getParam().entrySet()) {
            templateMessage.addData(new WxMpTemplateData(entry.getKey(), (String) entry.getValue(), "#173177"));
        }
    }
    try {
      String s =  wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
    } catch (WxErrorException e) {
        e.printStackTrace();
    }
}

测试调用

@PostMapping("sendMessage")
public String handleMessage(){

    WxAuthorization wxAuthorization = new WxAuthorization();
    wxAuthorization.setAppId("wxce11edb1b0c5e158");
    wxAuthorization.setAppSecret("62195d67ae1fa8b0b15aaaab47ce507c");
    WxMsgData wxMsgData = new WxMsgData();
    wxMsgData.setReceiver("oOM-e52ersdi7a4wZTOQHUQOwGuw");
    wxMsgData.setTemplateCode("AYZc280-hh7QeO5eM8Usl7SlD5wzQ_I8tQq1e9HlmhQ");
    wxMsgData.setUrl("https://www.baidu.com/");
    Map<String,Object> map = new HashMap<>();
    map.put("username","张三");
    map.put("projectName","世纪广场");
    map.put("deviceSN","10086");
    wxMsgData.setParam(map);
    sendMsg(wxAuthorization,wxMsgData);
    return "success";
}

这个url ip 加端口必须是代理过的 或者服务器的 本地的不行

效果示例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值