package com.java110.job.msgNotify; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.core.factory.WechatFactory; import com.java110.core.log.LoggerFactory; import com.java110.dto.wechat.SmallWeChatDto; import com.java110.intf.store.ISmallWeChatInnerServiceSMO; import com.java110.utils.cache.CommonCache; import com.java110.utils.cache.MappingCache; import com.java110.utils.constant.MappingConstant; import com.java110.utils.constant.WechatConstant; import com.java110.utils.util.ListUtil; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import java.util.List; import java.util.Map; @Service public class WechatTemplateImpl implements IWechatTemplate { public static final String industry_id1 = "30"; // 房地产物业 public static final String industry_id2 = "2"; // IT 科技 IT软件与服务 private static Logger logger = LoggerFactory.getLogger(WechatTemplateImpl.class); /** * 获取 行业 */ public static final String GET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/get_industry?access_token=ACCESS_TOKEN"; /** * 设置 行业 */ public static final String SET_INDUSTRY = "https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN"; /** * 获取模板列表 */ public static final String GET_ALL_PRIVATE_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN"; /** * 添加模板 */ public static final String ADD_TEMPLATE = "https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN"; public static final String WECHAT_TEMPLATE = "WECHAT_TEMPLATE_"; @Autowired private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl; @Autowired private RestTemplate outRestTemplate; /** * 设置行业为 物业 * * @param communityId 小区ID */ private void setIndustry(String communityId) { //todo 查询公众号设置的行业 String url = GET_INDUSTRY.replace("ACCESS_TOKEN", getAccessToken(communityId)); ResponseEntity responseEntity = outRestTemplate.getForEntity(url, String.class); logger.debug("查询行业返回参数:{}", responseEntity); if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new IllegalArgumentException("获取公众号行业失败"); } JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody()); // String industryName = paramOut.getJSONObject("primary_industry").getString("second_class"); JSONObject primaryIndustry = paramOut.getJSONObject("primary_industry"); if (primaryIndustry != null && "物业".equals(primaryIndustry.getString("second_class"))) { //如果是物业 直接 返回 无需设置 return; } //todo 设置公众号设置的行业 url = SET_INDUSTRY.replace("ACCESS_TOKEN", getAccessToken(communityId)); JSONObject paramIn = new JSONObject(); paramIn.put("industry_id1", industry_id1); paramIn.put("industry_id2", industry_id2); responseEntity = outRestTemplate.postForEntity(url, paramIn.toJSONString(), String.class); logger.debug("设置行业返回参数:{}", responseEntity); if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new IllegalArgumentException("设置公众号行业失败"); } } /** * 获取模板列表 * * @param communityId * @return */ private String getAllPrivateTemplate(String communityId) { String url = GET_ALL_PRIVATE_TEMPLATE.replace("ACCESS_TOKEN", getAccessToken(communityId)); ResponseEntity responseEntity = outRestTemplate.getForEntity(url, String.class); logger.debug("查询行业返回参数:{}", responseEntity); if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new IllegalArgumentException("获取模板列表失败"); } String templateList = responseEntity.getBody(); CommonCache.setValue(WECHAT_TEMPLATE + communityId, templateList, CommonCache.TOKEN_EXPIRE_TIME); return templateList; } /** * 添加模板 * * @param communityId * @param templateIdShort * @param keys */ private void addTemplate(String communityId, String templateIdShort, String[] keys) { //todo 设置行业 setIndustry(communityId); //todo 设置公众号设置的行业 String url = ADD_TEMPLATE.replace("ACCESS_TOKEN", getAccessToken(communityId)); JSONObject paramIn = new JSONObject(); paramIn.put("template_id_short", templateIdShort); paramIn.put("keyword_name_list", keys); ResponseEntity responseEntity = outRestTemplate.postForEntity(url, paramIn.toJSONString(), String.class); logger.debug("添加模板返回参数:{}", responseEntity); if (responseEntity.getStatusCode() != HttpStatus.OK) { throw new IllegalArgumentException("添加模板失败"); } JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody()); if (paramOut.getIntValue("errcode") != 0) { throw new IllegalArgumentException(paramOut.getString("errmsg")); } } private void deletePrivateTemplate(String communityId, String templateId) { } /** * 获取模板ID * * @param communityId 小区ID * @param templateIdShort 模板库中模板的编号 * @param title 模板标题 * @return */ @Override public String getTemplateId(String communityId, String templateIdShort, String title, String[] keys) { String templateList = CommonCache.getValue(WECHAT_TEMPLATE + communityId); //todo 不存在 调用微信查询 if (StringUtil.isEmpty(templateList)) { templateList = getAllPrivateTemplate(communityId); } //todo 如果还是空 则直接 添加 if (StringUtil.isEmpty(templateList)) { addTemplate(communityId, templateIdShort, keys); templateList = getAllPrivateTemplate(communityId); } //todo 循环校验 JSONObject templateListObj = JSONObject.parseObject(templateList); if (templateListObj == null || !templateListObj.containsKey("template_list") || templateListObj.getJSONArray("template_list").size() < 1) { addTemplate(communityId, templateIdShort, keys); templateList = getAllPrivateTemplate(communityId); templateListObj = JSONObject.parseObject(templateList); } //todo 寻找 templateId JSONArray templateLists = templateListObj.getJSONArray("template_list"); JSONObject template = null; for (int templateIndex = 0; templateIndex < templateLists.size(); templateIndex++) { template = templateLists.getJSONObject(templateIndex); if (title.equals(template.getString("title")) && templateHasKey(template.getString("content"), keys)) { return template.getString("template_id"); } } //todo 说明没有寻找到 addTemplate(communityId, templateIdShort, keys); templateList = getAllPrivateTemplate(communityId); templateListObj = JSONObject.parseObject(templateList); templateLists = templateListObj.getJSONArray("template_list"); for (int templateIndex = 0; templateIndex < templateLists.size(); templateIndex++) { template = templateLists.getJSONObject(templateIndex); if (title.equals(template.getString("title")) && templateHasKey(template.getString("content"), keys)) { return template.getString("template_id"); } } return "-1"; } /** * 关键字是否都包含 * @param content * @param keys * @return */ private boolean templateHasKey(String content, String[] keys) { for (String key : keys) { if (!content.contains(key)) { return false; } } return true; } public String getAccessToken(String communityId) { SmallWeChatDto smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setWeChatType(SmallWeChatDto.WECHAT_TYPE_PUBLIC); smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY); smallWeChatDto.setObjId(communityId); List smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto); if (ListUtil.isNull(smallWeChatDtos)) { String appIdCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"); String appSecretCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"); String mchIdCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"); String keyCache = MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key"); smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setAppId(appIdCache); smallWeChatDto.setAppSecret(appSecretCache); smallWeChatDto.setMchId(mchIdCache); smallWeChatDto.setPayPassword(keyCache); } else { smallWeChatDto = smallWeChatDtos.get(0); } String accessToken = WechatFactory.getAccessToken(smallWeChatDto.getAppId(), smallWeChatDto.getAppSecret()); return accessToken; } @Override public String getAppId(String communityId) { SmallWeChatDto smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setWeChatType(SmallWeChatDto.WECHAT_TYPE_PUBLIC); smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY); smallWeChatDto.setObjId(communityId); List smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto); if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) { String appIdCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appId"); String appSecretCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "appSecret"); String mchIdCache = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, "mchId"); String keyCache = MappingCache.getValue(MappingConstant.WECHAT_STORE_DOMAIN, "key"); smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setAppId(appIdCache); smallWeChatDto.setAppSecret(appSecretCache); smallWeChatDto.setMchId(mchIdCache); smallWeChatDto.setPayPassword(keyCache); } else { smallWeChatDto = smallWeChatDtos.get(0); } return smallWeChatDto.getAppId(); } }