package com.doumee.core.wx; import com.alibaba.fastjson.JSONObject; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.HttpsUtil; import com.doumee.dao.business.model.Goodsorder; import com.doumee.dao.business.model.GoodsorderDetail; import com.doumee.dao.business.model.Member; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.error.WxErrorException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * Created by IntelliJ IDEA. * * @Author : Rk * @create 2022/12/7 17:27 */ @Slf4j public class SendWxMessage { public static final String APP_ACCESS_TOKEN_URL= "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxcd2b89fd2ff065f8&secret=1ceb7c9dff3c4330d653adc3ca55ea24"; private static AccessToken at; private static String programUrl = "pages/orderDetail/orderDetail?orderId="; private static String programUserUrl = "pages/balanceDetails/balanceDetails"; public static void createSendData(Constants.WxNotice wxNotice, Goodsorder goodsorder, List gdetailList, Member member){ Map m = new HashMap<>(); String jumpUrl = wxNotice.getJumpUrl(); if(Constants.equalsInteger(wxNotice.getType(),Constants.ZERO)){ //发货通知 m.put("character_string1}",new TemplateData(goodsorder.getCode().toString()));//订单编号 m.put("thing7}",new TemplateData(String.join(",", gdetailList.stream().map(i->i.getName()).collect(Collectors.toList()))));//商品名称 m.put("thing10}",new TemplateData(goodsorder.getKdName()));//快递公司 m.put("character_string3}",new TemplateData(goodsorder.getKdCode()));//快递单号 jumpUrl = jumpUrl+"?id="+goodsorder.getId(); }else if(Constants.equalsInteger(wxNotice.getType(),Constants.ONE)){ //订单核销 m.put("character_string3}",new TemplateData(goodsorder.getCode().toString()));//订单编号 m.put("time2}",new TemplateData(DateUtil.formatDate(goodsorder.getDoneDate(),"yyyy年MM月dd HH:mm")));//核销时间 m.put("phrase1}",new TemplateData("已核销"));//核销状态 jumpUrl = jumpUrl+"?id="+goodsorder.getId(); }else if(Constants.equalsInteger(wxNotice.getType(),Constants.TWO)){ //订单退款 m.put("character_string1}",new TemplateData(goodsorder.getCode().toString()));//订单编号 m.put("thing2}",new TemplateData(String.join(",", gdetailList.stream().map(i->i.getName()).collect(Collectors.toList()))));//商品名称 m.put("date9}",new TemplateData(DateUtil.formatDate(goodsorder.getRefundTime(),"yyyy年MM月dd HH:mm")));//退款时间 m.put("phrase1}",new TemplateData(goodsorder.getRefundMoney()+"元"));//退款金额 jumpUrl = jumpUrl+"?id="+goodsorder.getId(); } SendWxMessage.sendWxMessage(wxNotice.getTempId(),m,member.getOpenId(),jumpUrl); } /** * 发送消息 * @param tempId * @param m * @param openid * @param jumpUrl */ public static void sendWxMessage(String tempId,Map m,String openid,String jumpUrl){ try{ String accessToken = WxMiniConfig.wxMaService.getAccessToken(); RestTemplate restTemplate = new RestTemplate(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken; //拼接推送的模版 WxMsgVO wxMsgVo = new WxMsgVO(); //用户的openid(要发送给那个用户) wxMsgVo.setTouser(openid); wxMsgVo.setTemplate_id(tempId); wxMsgVo.setPage(jumpUrl); ResponseEntity responseEntity = restTemplate.postForEntity(url, wxMsgVo, String.class); log.info("微信小程序->发送订阅消息:{}",JSONObject.toJSONString(responseEntity)); }catch (WxErrorException wxErrorException){ } } /** * 取消订单 通知 * @param member 会员信息 * @param goodsName 商品名称 */ public static void orderCancel(Goodsorder goodsorder,Member member,String goodsName){ RestTemplate restTemplate = new RestTemplate(); String accessToken = getToken(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken; //拼接推送的模版 WxMsgVO wxMsgVo = new WxMsgVO(); //用户的openid(要发送给那个用户) wxMsgVo.setTouser(member.getOpenId()); //订阅消息模板id wxMsgVo.setTemplate_id("dz-O6n3r-N60q0M0vDUMDbc-vnX5p3VIPgGxkXn0_vE"); Map m = new HashMap<>(4); m.put("character_string1", new TemplateData(goodsorder.getCode().toString())); m.put("thing4", new TemplateData(goodsName + " 等")); m.put("time5", new TemplateData(DateUtil.getDate(new Date(),"yyyy-MM-dd"))); m.put("thing2", new TemplateData(goodsorder.getCancelInfo())); wxMsgVo.setPage(programUrl +goodsorder.getId()); wxMsgVo.setData(m); ResponseEntity responseEntity = restTemplate.postForEntity(url, wxMsgVo, String.class); log.info("微信小程序->报价订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity)); } /** * 订单发货通知 * @param goodsorder * @param godosName * @param member * @throws Exception */ public static void orderSendNotice(Goodsorder goodsorder, String godosName, Member member){ RestTemplate restTemplate = new RestTemplate(); String accessToken = getToken(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken; //拼接推送的模版 WxMsgVO wxMsgVo = new WxMsgVO(); //用户的openid(要发送给那个用户) wxMsgVo.setTouser(member.getOpenId()); //订阅消息模板id wxMsgVo.setTemplate_id("JngxRyDgYGzdZl1lA6Yo0GmqI_uBnerjQToFBXgVmlk"); Map m = new HashMap<>(5); m.put("thing1", new TemplateData(godosName+" 等")); m.put("character_string2", new TemplateData(goodsorder.getCode().toString())); m.put("date3", new TemplateData(DateUtil.getDate(goodsorder.getKdDate(),"yyyy-MM-dd"))); m.put("thing4", new TemplateData(goodsorder.getKdName())); m.put("character_string5", new TemplateData(goodsorder.getKdCode())); wxMsgVo.setPage(programUrl+goodsorder.getId()); wxMsgVo.setData(m); ResponseEntity responseEntity = restTemplate.postForEntity(url, wxMsgVo, String.class); log.info("微信小程序->报价订阅消息发送日志:{}",JSONObject.toJSONString(responseEntity)); } /** * 余额变动通知 * @param changeIntegral 变动余额 * @param member 会员信息 * @throws Exception */ public static void integralChangeNotice(Member member,BigDecimal changeIntegral){ RestTemplate restTemplate = new RestTemplate(); String accessToken = getToken(); //这里简单起见我们每次都获取最新的access_token(时间开发中,应该在access_token快过期时再重新获取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token="+accessToken; //拼接推送的模版 WxMsgVO wxMsgVo = new WxMsgVO(); //用户的openid(要发送给那个用户) wxMsgVo.setTouser(member.getOpenId()); //订阅消息模板id wxMsgVo.setTemplate_id("8933kvcfxKy3f0zrnlCQaPy2nPDwjk7S4KeqLjU7vVY"); Map m = new HashMap<>(3); m.put("name5", new TemplateData(member.getName())); m.put("amount6", new TemplateData(changeIntegral.toString())); m.put("amount1", new TemplateData((member.getIntegral().subtract(changeIntegral)).toString())); m.put("time8", new TemplateData(DateUtil.getDate(new Date(),"yyyy-MM-dd"))); wxMsgVo.setPage(programUserUrl); wxMsgVo.setData(m); ResponseEntity responseEntity = restTemplate.postForEntity(url, wxMsgVo, String.class); log.info("微信小程序->订单取消通知息发送日志:{}",JSONObject.toJSONString(responseEntity)); } public static String getToken(){ if (at == null || at.isExpired()){ getAccessToken(); } return at.getAccessToken(); } /** * 获取token */ private static void getAccessToken() { //发送请求获取token JSONObject token = null; try { token = JSONObject.parseObject(HttpsUtil.get(APP_ACCESS_TOKEN_URL,false)); } catch (Exception e) { e.printStackTrace(); } JSONObject jsonObject = token; String accessToken = (String) jsonObject.get("access_token"); Integer expiresIn = (Integer) jsonObject.get("expires_in"); //创建token对象,并存储 at = new AccessToken(accessToken,String.valueOf(expiresIn)); } }