小程序消息订阅(java版)

1、小程序管理后台->微信公众平台,登录后在消息订阅模块创建模板。模板的内容是根据小程序所选类目显示不同的模板内容的。

2、取模板id,及设置相应需要展示的字段内容。

3、代码如下。



import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 发送订阅消息
 * @author zmd
 */
@Slf4j
@Component
public class SendMessageService {
    private static final String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
    private static final String getAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token";
    @Autowired
    private WxProperties properties;
    @Autowired
    private IAccessTokenService accessTokenService;

    public void sendMsg(AppletUser appletUser, RepairOrder repairOrder){
       String accessToken = getAccessToken();
       Map<String,Object> params = new HashMap<>();
       params.put("template_id",properties.getTemplateId());
       params.put("page","pages/maintenance/maintenance");//消息列表页
       params.put("touser",appletUser.getOpenId());//接收者(用户)的 openid
        /**
         * 模板内容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }的object
         */
        JSONObject data = new JSONObject();

        //车牌号码
        JSONObject licensePlate = new JSONObject();
//        licensePlate.put("value",repairOrder.getLicensePlate());
        licensePlate.put("value","浙AP9E60");
        data.put("car_number1",licensePlate);

        //车型
        JSONObject motorcycleType = new JSONObject();
//        motorcycleType.put("value",repairOrder.getMotorcycleType());
        motorcycleType.put("value","宝马宝马5系2011款520Li典雅型");
        data.put("thing3",motorcycleType);
        //日期
        JSONObject dateOfArrival = new JSONObject();
//        dateOfArrival.put("value",DateUtil.format(repairOrder.getDateOfArrival(),"yyyy-MM-dd HH:mm:ss"));
        dateOfArrival.put("value","2023-12-23 12:12:12");
        data.put("time4",dateOfArrival);

        JSONObject frameNumber = new JSONObject();
//        frameNumber.put("value",repairOrder.getFrameNumber());
        frameNumber.put("value","LBVFP1903BSE16890");
        data.put("character_string8",frameNumber);

        JSONObject valueThing = new JSONObject();
//        if (repairOrder.getDateOfArrival() != null){
//            String timeStr = DateUtil.format(repairOrder.getDateOfArrival(),"yyyy-MM-dd HH:mm:ss");
//            valueThing.put("value","你在"+timeStr+"时间有一条保养记录,请注意查看");
//        }
        String timeStr = "2023-12-23";
        valueThing.put("value","你在"+timeStr+"时间有条保养记录");
        data.put("thing7",valueThing);

       params.put("data",data);
       params.put("miniprogram_state","formal");
       params.put("lang","zh_CN");
       log.info("发送订阅结果入参:"+JSONObject.toJSONString(params));
       String result = HttpUtil.post(url+accessToken,JSONObject.toJSONString(params));
       log.info("发送订阅结果:"+result);
       JSONObject object = JSONObject.parseObject(result);
       String errcode = object.getString("errcode");
       if ("0".equals(errcode)){
           log.info("发送成功");
       }
   }

    /**
     * 从url获取数据库获取access_token
     * @return
     */
   public String getAccessToken(){
        List<AccessToken> accessTokenList = accessTokenService.selectAccessTokenList(new AccessToken());
        if (accessTokenList.size() > 0){
            //过期的话刷新 ,保持时间是2个小时,7200秒
            if ((System.currentTimeMillis() - accessTokenList.get(0).getLastAccessTime().getTime())/1000 >= 7200){
                JSONObject jsonObject = getAccessTokenByUrl();
                String token = jsonObject.getString("access_token");
                Long expiresIn = jsonObject.getLong("expires_in");
                AccessToken accessToken = new AccessToken();
                accessToken.setAccessToken(token);
                accessToken.setExpiresIn(expiresIn);
                accessToken.setLastAccessTime(new Date());
                accessToken.setId(accessTokenList.get(0).getId());
                accessTokenService.updateAccessToken(accessToken);
                return token;
            }
            return accessTokenList.get(0).getAccessToken();
        }else{
            //没有获取过的话,重新获取
            JSONObject jsonObject = getAccessTokenByUrl();
            String token = jsonObject.getString("access_token");
            Long expiresIn = jsonObject.getLong("expires_in");
            AccessToken accessToken = new AccessToken();
            accessToken.setAccessToken(token);
            accessToken.setExpiresIn(expiresIn);
            accessToken.setId(IdLongUtil.getId());
            accessToken.setLastAccessTime(new Date());
            accessTokenService.insertAccessToken(accessToken);
            return token;
        }
   }
   public JSONObject getAccessTokenByUrl(){
       String result = HttpUtils.sendGet(getAccessTokenUrl+"?grant_type=client_credential&appid="+properties.getAppId()+"&secret="+properties.getAppSecret());
       return JSONObject.parseObject(result);
   }
}

注释:

如果获取accesstoken的时候出现如下错误,请使用文档版本:

{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 65b3294e-6993fa45-745b3def"}
结果:{"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 65b3294e-6993fa45-745b3def"}
 

获取稳定版接口调用凭据 | 微信开放文档

POST https://api.weixin.qq.com/cgi-bin/stable_token
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飞流银河

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值