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