2

java实现 微信公众号推送消息 ,cv 就可运行!!! - 古渡蓝按

 11 months ago
source link: https://www.cnblogs.com/blbl-blog/p/17746168.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

一,注册公众号

1,官网地址:申请测试公众号

地址: 微信公众平台 (qq.com)

文档地址:微信开放文档 (qq.com)

2,注册后可以查看自己的appId 和 appsecret

2719585-20231007140249416-725672527.png

3,创建模板

  • 1、测试模板的模板ID仅用于测试,不能用来给正式帐号发送模板消息
  • 2、为方便测试,测试模板可任意指定内容,但实际上正式帐号的模板消息,只能从模板库中获得
  • 3、需为正式帐号申请新增符合要求的模板,需使用正式号登录公众平台,按指引申请
  • 4、模板内容可设置参数(模板标题不可),供接口调用时使用,参数需以{{开头,以.DATA}}结尾

我创建的模板

早安!:{{name.DATA}} 
天气:{{weather.DATA}} 
距离破壳日:{{birthday.DATA}}
2719585-20231007140416959-2110853685.png

二,代码部分

​ 发送消息和推送消息都是需要 token 的,所以第一步就可以获取token,再拿获取的token 进行发送消息,每天获取token的是有次数限制的(2000次)

使用微信公众号需要的依赖

        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>3.3.0</version>
        </dependency>

我这里把 也添上,等下可以在swagger测试

        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

<!--        knife4j 依赖-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>2.0.7</version>
        </dependency>

controller 层

这里就两个部分,getToken() 方法 是获取token, pushMessage() 是推送消息(这里代码中没有模板id,需要修改成上面自己创建的模板id)

@Api(tags = "各项测试")
@RestController
@RequestMapping("/loginInfo")
public class SendWeChatMessageController {

//    /*
//     * 功能: 公众号:appid,这里也可以配置到yaml 文件里面
//     */
//
//    @Value("${wx.appId}")
//    private String appId;
//
//    /*
//     * 功能: 公众号:appsecret
//     */
//
//    @Value("${wx.appsecret}")
//    private String appsecret;
    private final Logger logger = LoggerFactory.getLogger(SendWeChatMessageController.class);




    @ApiOperation("获取token")
    @GetMapping("/getToken")
    public Object getToken(@PathParam("grantType") String grantType,@PathParam("appId") String appId,@PathParam("secret") String secret) throws Exception {
        String tokenUrl = WeChatUrlEnum.TOKEN.getUrl();
        String params = "grant_type=" + grantType + "&appid=" + appId + "&secret=" + secret;
        logger.info("请求地址为:" + tokenUrl + params);
        String tokenResponse = HttpUtils.sendGet(tokenUrl, params);
        JSON parse = JSONUtil.parseObj(tokenResponse);
        System.out.println(parse);
        return parse;
    }


    @ApiOperation("发送消息")
    @PostMapping("/testPushMessage")
    public String pushMessage(@RequestBody PushMessageToUserVo pushMessageToUserVo) {
        // 组装要发送的数据
        JSONObject body = new JSONObject();
        // 要推给谁
        body.put("touser", pushMessageToUserVo.getTouser());
        // 模板ID
        body.put("template_id", "这里填写自己的模板id");

        String accessToken = pushMessageToUserVo.getAccessToken();

        // 创建消息和内容,这里可以自己定义,对应好模板就行
        JSONObject data = new JSONObject();
        data.put("name", new JSONObject().put("value", "做一个身体和心灵都勇敢的人,趁着身体未老,心灵还透明。晚安!"));
        data.put("weather", new JSONObject().put("value", "阴天  19°c"));
        data.put("birthday", new JSONObject().put("value", "53   天"));
        body.put("data", data);

        logger.info("body---->{}", body.toString());

        String post = HttpUtil.post("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken, body.toString());
        logger.info("通知到用户--->{}", post);
        return body.toString();
    }
}

config

这里使用 knife4j,等下好测试接口

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean(value = "defaultApi2")
    public Docket defaultApi2() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(new ApiInfoBuilder()
                        //.title("swagger-bootstrap-ui-demo RESTful APIs")
                        .description("# swagger-bootstrap-ui-demo RESTful APIs")
                        .termsOfServiceUrl("http://www.xx.com/")
                        .contact("[email protected]")
                        .version("1.0")
                        .build())
                //分组名称
                .groupName("2.X版本")
                .select()
                //这里指定Controller扫描包路径,自行记得修改!!!!
                .apis(RequestHandlerSelectors.basePackage("com.example.springbootwechat.controller"))
                .paths(PathSelectors.any())
                .build();
    }
}

entity

这个是推送消息vo,给那个用户推送消息,并带上token

@Data
@ApiModel(description = "用户推送vo")
public class PushMessageToUserVo {

    @ApiModelProperty(value = "用户微信关注号", required = true)
    private String touser;

    @ApiModelProperty(value = "用户Token", required = true)
    private String accessToken;

}

我这里是把地址都变成枚举,因为后面地址会比较多,便于维护,当然也可以配置在yaml ,或者定义在使用处。

public enum WeChatUrlEnum {

    /**
     * 获取token
     */
    TOKEN("获取微信 token的地址","https://api.weixin.qq.com/cgi-bin/token");

    private String info;
    private String url;

    WeChatUrlEnum(String info,String url) {
        this.info =info;
        this.url = url;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }
}

utils

工具类:发送http get,post 请求

public class HttpUtils {

   public static String sendGet(String url, String query) throws Exception {
       String fullUrl = url + "?" + query;
       HttpURLConnection connection = (HttpURLConnection) new URL(fullUrl).openConnection();
       connection.setRequestMethod("GET");
       connection.setRequestProperty("Accept", "application/json");

       if (connection.getResponseCode()!= 200) {
           throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode());
       }

       BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));

       StringBuilder sb = new StringBuilder();
       String output;
       while ((output = br.readLine())!= null) {
           sb.append(output);
       }
       connection.disconnect();
       return sb.toString();
   }


   public static String sendPost(String url, String data) throws Exception {
       URL fullUrl = new URL(url);
       HttpURLConnection connection = (HttpURLConnection) fullUrl.openConnection();
       connection.setRequestMethod("POST");
       connection.setRequestProperty("Content-Type", "application/json");
       connection.setRequestProperty("Accept", "application/json");

       connection.setDoOutput(true);
       DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
       wr.writeBytes(data);
       wr.flush();
       wr.close();

       if (connection.getResponseCode()!= 200) {
           throw new RuntimeException("Failed : HTTP error code : " + connection.getResponseCode());
       }

       BufferedReader br = new BufferedReader(new InputStreamReader((connection.getInputStream())));

       StringBuilder sb = new StringBuilder();
       String output;
       while ((output = br.readLine())!= null) {
           sb.append(output);
       }

       connection.disconnect();

       return sb.toString();
   }
}

接口swagger地址:http://127.0.0.1:1955/doc.html 自己注意端口

1,获取token

2719585-20231007140458715-2090545586.png

2,发送消息

2719585-20231007140520461-852027728.png

手机端:接收到的消息

2719585-20231007140538751-291698268.png

谢谢看到这!!!有不对地方,可以留言评论讨论哦!!!

希望可以动动小手,点个关注!!!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK