java微信小程序发送消息

首先参考文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html

如果要模板参数可配置化:可以让小程序端传入数组 服务端拿字符串转Map

例如小程序端:wx_data_parameter(自定义) 值请传入数组格式实现模板参数可配置,服务端解析放入map进行传参

[{"key":"amount1","value":"200"},{"key":"thing3","value":"赵"},{"key":"date4","value":"2021-01-07"},{"key":"thing5","value":"您的提现申请我们已发送给银行"},{"key":"thing6","value":"1235235"}]

// @OpenApi 项目中自己封装的校验,你们可以用@RequestBody
@RequestMapping(value = "/sendWeChatMsgByOpenid", method = RequestMethod.POST)
    public ResponseEntity<RestResponse> sendWeChatMsgByOpenid(@OpenApi WxSendParam wxSendParam) {
        try {
            if(StringUtils.isBlank(wxSendParam.getOpenId())){
                return RestResponse.createFailRes("微信标识ID为空");
            }else {
                System.out.printf(wxSendParam.getWx_data_parameter());
                Object parse = JSONObject.parse(wxSendParam.getWx_data_parameter());
                JSONArray jsonArray = JSON.parseArray(parse.toString());
                List<JSONObject> jsonObjectList = jsonArray.toJavaList(JSONObject.class);
                Map<String, String> mapParameter = jsonObjectList.stream().filter(Objects::nonNull).collect(Collectors.toMap(item -> item.getString("key"), item -> item.getString("value")));
                //不是创建模板了么,模板几个参数map.put你就放几个
                // touser; //接收者(用户)的 openid
                // template_id; //所需下发的模板消息的id
                // page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
                //Map<String,WeChatTemplateData> data; //模板内容,不填则下发空模板
                // String emphasis_keyword; //模板需要放大的关键词,不填则默认无放大
                RestTemplate restTemplate = new RestTemplate();
                //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取)
                String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken();
                //拼接推送的模版
                WeChatSendTemplateMessage wxMssVo = new WeChatSendTemplateMessage();
                wxMssVo.setTouser(wxSendParam.getOpenId());//用户的openid(要发送给那个用户,通常这里应该动态传进来的)
                wxMssVo.setTemplate_id(wxSendParam.getTemplate_id());//订阅消息模板id
                wxMssVo.setPage(wxSendParam.getWx_page());
                wxMssVo.setMiniprogram_state("developer");//跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版
                Map<String, WeChatTemplateData> map = new HashMap<>();
                for (String key : mapParameter.keySet()) {
                    System.out.println("key:" +key +" value:"+mapParameter.get(key));
                    map.put(key,new WeChatTemplateData(mapParameter.get(key)));
                }
                wxMssVo.setData(map);
                ResponseEntity<String> responseEntity =
                        restTemplate.postForEntity(url, wxMssVo, String.class);
                //System.out.println("responseEntity.getBody()"+responseEntity.getBody());
                String errcode = String.valueOf(JSONObject.parseObject(responseEntity.getBody()).get("errcode"));
                if(errcode.contains("43101")){
                    System.out.printf("用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系");
                    return RestResponse.createFailRes("用户拒绝接受消息,如果用户之前曾经订阅过,则表示用户取消了订阅关系");
                }else if(errcode.contains("40003")){
                    System.out.printf("touser字段openid为空或者不正确");
                    return RestResponse.createFailRes("touser字段openid为空或者不正确");
                }else if(errcode.contains("40037")){
                    System.out.printf("订阅模板id为空不正确");

                    return RestResponse.createFailRes("订阅模板id为空不正确");
                }else if(errcode.contains("47003")){
                    System.out.printf("模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错");

                    return RestResponse.createFailRes("模板参数不准确,可能为空或者不满足规则,errmsg会提示具体是哪个字段出错");
                }else if(errcode.contains("41030")){
                    System.out.printf("page路径不正确,需要保证在现网版本小程序中存在,与app.json保持一致");
                    return RestResponse.createFailRes("page路径不正确,需要保证在现网版本小程序中存在,与app.json保持一致");
                }
                System.out.println(responseEntity.getBody());
                return RestResponse.createSuccessRes(responseEntity.getBody());
            }
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            return RestResponse.createFailRes("失败:" + e.getMessage());
        }
    }
    private String getAccessToken() {
        RestTemplate restTemplate = new RestTemplate();
        Map<String, String> params = new HashMap<>();
        String  appid ="";
        String  secret ="";
        Properties properties=null;
        try {
            properties = PropertiesLoaderUtils.loadAllProperties("application.properties");
            appid = properties.getProperty("weixin.appid");
            secret = properties.getProperty("weixin.secret");
        } catch (IOException e) {
            e.printStackTrace();
        }
        params.put("APPID", appid);
        params.put("APPSECRET", secret);
        ResponseEntity<String> responseEntity = restTemplate.getForEntity(
                "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params);
        String body = responseEntity.getBody();
        JSONObject object = JSON.parseObject(body);
        String Access_Token = object.getString("access_token");
        String expires_in = object.getString("expires_in");
        System.out.println("微信发送消息有效时长expires_in:" + expires_in);
        return Access_Token;
    }

 

import lombok.Data;

/**
 * 微信发送通知
 */
@Data
public class WxSendParam {
    private String loginName;
    private String openId;
    private String id;
    private String template_id;
    private String wx_page;//微信通知跳转页面
    private String wx_data_parameter;//微信通知参数
}
public class WeChatTemplateData {
    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public WeChatTemplateData(String value) {
        this.value = value;
    }

    public WeChatTemplateData() {
    }
}


import java.util.Map;

/**
 * 发送模板消息
 * @Author: chufangbo
 * @CreateDate: 2021/01/06 16:21
 */
public class WeChatSendTemplateMessage {

    private String touser; //接收者(用户)的 openid
    private String template_id; //所需下发的订阅模板id
    private String page; //点击模板卡片后的跳转页面,仅限本小程序内的页面。支持带参数,(示例index?foo=bar)。该字段不填则模板无跳转。
    private Map<String,WeChatTemplateData> data; //模板内容,不填则下发空模板
    private String miniprogram_state; //跳转小程序类型:developer为开发版;trial为体验版;formal为正式版;默认为正式版

    public String getTouser() {
        return touser;
    }

    public void setTouser(String touser) {
        this.touser = touser;
    }

    public String getTemplate_id() {
        return template_id;
    }

    public void setTemplate_id(String template_id) {
        this.template_id = template_id;
    }

    public String getPage() {
        return page;
    }

    public void setPage(String page) {
        this.page = page;
    }

    public Map<String, WeChatTemplateData> getData() {
        return data;
    }

    public void setData(Map<String, WeChatTemplateData> data) {
        this.data = data;
    }

    public String getMiniprogram_state() {
        return miniprogram_state;
    }

    public void setMiniprogram_state(String miniprogram_state) {
        this.miniprogram_state = miniprogram_state;
    }
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值