Просмотр исходного кода

fixed: 提交扫码添加紧急联系人

orgycat 3 лет назад
Родитель
Сommit
851b084c7b

+ 18 - 0
src/main/java/com/care/client/controller/ContactApiController.java

@@ -111,6 +111,24 @@ public class ContactApiController {
         }
     }
 
+    @PostMapping("/my/addOrUpdate")
+    @ApiOperation(tags = {"我的紧急联系人,我的设备"},value = "紧急联系人新增 -- 三期新增")
+    public Result<Object> addOrUpdateMyContact(@RequestBody HouseContactVO vo){
+        try {
+            if (this.pinanbaoContactService.createOrUpdateMyContact(vo)) {
+                return Result.success("保存成功!");
+            } else {
+                return Result.error("保存失败!");
+            }
+        }catch (BDException e) {
+            log.error("保存紧急联系人-出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("保存联系人: 保存紧急联系人出现异常",e);
+            return Result.error("保存失败!");
+        }
+    }
+
     @DeleteMapping("/my/delete/{contactId}")
     @ApiOperation(tags = {"我的紧急联系人"},value = "删除紧急联系人 -- 二期新增")
     public Result<Object> deleteMyContact(HttpServletRequest request,@RequestHeader("token") String token,

+ 98 - 4
src/main/java/com/care/client/controller/WxMsgController.java

@@ -2,13 +2,21 @@ package com.care.client.controller;
 
 import cn.hutool.core.util.XmlUtil;
 import cn.hutool.json.JSONObject;
+import com.care.client.dto.TemplateDataDTO;
 import com.care.client.vo.WxAccessTokenVO;
+import com.care.common.cache.RedisKeyConstant;
+import com.care.common.cache.RedisUtil;
+import com.care.common.entity.CareDevice;
+import com.care.common.entity.CareHouseContact;
+import com.care.common.service.CareDeviceService;
+import com.care.common.service.CareHouseContactService;
 import com.care.common.service.WxTemplateService;
 import com.care.common.util.CheckoutUtil;
 import com.care.common.util.MessageUtil;
 import com.care.common.util.WxTemplateUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
@@ -21,7 +29,11 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 @Controller
 @RequestMapping("/wxmsg")
@@ -37,6 +49,18 @@ public class WxMsgController {
     @Resource
     private WxTemplateService wxService;
 
+    @Resource
+    private CareHouseContactService careHouseContactService;
+
+    @Resource
+    private WxTemplateService wxTemplateService;
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Resource
+    private CareDeviceService careDeviceService;
+
     /**
      * 微信消息接收和token验证
      * @param request
@@ -96,10 +120,46 @@ public class WxMsgController {
 //            String nickName = getUserNickName(fromUserName);
             if(MessageUtil.MSGTYPE_EVENT.equals(msgType)){//如果为事件类型
                 if(MessageUtil.SUBSCIBE_EVENT.equals(eventType)){//处理订阅事件
-                    JSONObject parseUnionObject = WxTemplateUtil.parseWxOpenIdBySubscribe(wxAccessTokenVO.getAccessToken(), fromUserName);
-                    System.out.println("parseUnionObject:"+parseUnionObject.toString());
+//                    JSONObject parseUnionObject = WxTemplateUtil.parseWxOpenIdBySubscribe(wxAccessTokenVO.getAccessToken(), fromUserName);
+//                    System.out.println("parseUnionObject:"+parseUnionObject.toString());
 //                    parseUnionObject.set("unionid", "oyVYT6Ox9b88n_33lgKWRj5uFbUY");
-                    if (parseUnionObject != null && parseUnionObject.containsKey("unionid")) {
+
+                    String eventKey = ObjectUtils.toString(map.get("EventKey"));
+                    if (StringUtils.isNotBlank(eventKey) && eventKey.indexOf("_") != -1) {
+                        eventKey = StringUtils.substring(eventKey, eventKey.indexOf("_") + 1);
+                    }
+                    Object obj = redisUtil.get(RedisKeyConstant.YUANSERVICE_QRCODE + ":" + eventKey);
+                    log.info("新用户关注: " + fromUserName + ": " + ObjectUtils.toString(map.get("EventKey")));
+                    if (obj == null) {
+                        return "failure";
+                    }
+
+                    String[] arrs = Objects.toString(obj).split(":");
+                    if (arrs == null || arrs.length != 2) {
+                        return "failure";
+                    }
+                    CareDevice careDevice = careDeviceService.getById(arrs[0]);
+                    if (careDevice == null) {
+                        log.info("设备不存在: " + arrs[0]);
+                        return "failure";
+                    }
+
+                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                    // 正式环境
+                    String templateId = "1M1kDRDW-kMSoOzmv9cP-SImD1kXWtezwyWe8euUJIc";
+                    // 测试环境
+//                    String templateId = "gvJ1g3JOThT5IuQc1In6D2cwKwmKz9MBIkGdkXtXOTI";
+
+                    Map<String, TemplateDataDTO> data = new HashMap<>();
+                    data.put("first", new TemplateDataDTO("您已关联该监护人", "#459ae9"));
+                    data.put("keyword1", new TemplateDataDTO(careDevice.getDevName(), "#459ae9"));
+                    data.put("keyword2", new TemplateDataDTO(simpleDateFormat.format(new Date()), "#459ae9"));
+                    data.put("remark", new TemplateDataDTO("请补全您的联系信息, 便于能及时收到事件通知", "#459ae9"));
+
+                    String openId = fromUserName;
+                    boolean flag = wxTemplateService.sendTemplateMsgOriginal(openId, templateId, "wxda02870032b8f928", "/pages/supplement/index?memberId=" + arrs[1], data);
+                    log.info("发送消息模板: openId: " + openId + ", templateId: " + templateId + " 状态: " + flag);
+//                    if (parseUnionObject != null && parseUnionObject.containsKey("unionid")) {
 //                        CareOfficialMemberInfo careOfficialMemberInfo = new CareOfficialMemberInfo();
 //                        careOfficialMemberInfo.setNickname(parseUnionObject.getStr("nickname"));
 //                        careOfficialMemberInfo.setOpenId(fromUserName);
@@ -113,8 +173,42 @@ public class WxMsgController {
 //                        } else {
 //                            return "failure";
 //                        }
+//                        CareHouseContact careHouseContact = new CareHouseContact();
+//                        careHouseContact.setContactName(parseUnionObject.getStr("nickname"));
+//                        careHouseContact.setCreateTime(new Date());
+//                        String gender = "";
+//                        if ("1".equalsIgnoreCase(parseUnionObject.getStr("sex"))) {
+//                            gender = "M";
+//                        } else if ("2".equalsIgnoreCase(parseUnionObject.getStr("sex"))) {
+//                            gender = "W";
+//                        }
+//                        careHouseContact.setGender(gender);
+
+//                        String eventKey = ObjectUtils.toString(map.get("EventKey"));
+//                        if (StringUtils.isNotBlank(eventKey) && eventKey.indexOf("_") != -1) {
+//                            eventKey = StringUtils.substring(eventKey, eventKey.indexOf("_") + 1);
+//                        }
+//                        Object obj = redisUtil.get(RedisKeyConstant.YUANSERVICE_QRCODE + ":" + eventKey);
+//                        if (obj == null) {
+//                            return "failure";
+//                        }
+
+//                        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+//                        String templateId = "OPENTM418029089";
+//
+//                        Map<String, TemplateDataDTO> data = new HashMap<>();
+//                        data.put("first", new TemplateDataDTO("您已成功关联该设备", "#ff5200"));
+//                        data.put("keyword1", new TemplateDataDTO("跌倒报警", "#000000"));
+//                        data.put("keyword2", new TemplateDataDTO(simpleDateFormat.format(new Date()), "#000000"));
+//                        data.put("remark", new TemplateDataDTO("请尽快补全您的联系信息, 便于能及时通知您", "#ff5200"));
+//
+//                        String openId = parseUnionObject.getStr("openid");
+//                        boolean flag = wxTemplateService.sendTemplateMsg(parseUnionObject.getStr("openid"), templateId, "wxda02870032b8f928", "/pages/supplement/index", data);
+//                        log.info("发送消息模板: openId: " + openId + ", templateId: " + templateId + " 状态: " + flag);
+
+//                        careHouseContactService.save();
                         return "success";
-                    }
+//                    }
                 } else if (MessageUtil.UNSUBSCIBE_EVENT.equals(eventType)) {//处理取消订阅事件
                     System.out.println("事件类型为:"+eventType);
                     JSONObject parseUnionObject = WxTemplateUtil.parseWxOpenIdBySubscribe(wxAccessTokenVO.getAccessToken(), fromUserName);

+ 37 - 0
src/main/java/com/care/client/controller/WxQrCodeController.java

@@ -0,0 +1,37 @@
+package com.care.client.controller;
+
+import com.care.common.service.WxQrCodeService;
+import com.care.common.util.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("/pinanbao/wx/qrcode")
+@Slf4j
+public class WxQrCodeController {
+
+    @Resource
+    private WxQrCodeService wxQrCodeService;
+
+//    @ApiOperation(tags = { "事件处理" },value = "某个事件的详细处理记录  -- 二期修改")
+    @GetMapping("/gen")
+    public Result weChat(HttpServletRequest request,
+//                       @RequestParam("orgId") Long orgId,
+//                       @RequestParam("stationId") Long stationId,
+                         @RequestParam("deviceId") Long deviceId,
+                         @RequestParam("memberId") Long memberId
+                       ) throws Exception {
+
+        String sceneId = deviceId + ":" + memberId;
+        String url = wxQrCodeService.genWxQrcodeUrl(sceneId);
+        return Result.success("查询成功!", url);
+    }
+
+
+}

+ 27 - 0
src/main/java/com/care/client/dto/MpTemplateMsgOriginalDTO.java

@@ -0,0 +1,27 @@
+package com.care.client.dto;
+
+import lombok.Data;
+
+import java.util.Map;
+
+@Data
+public class MpTemplateMsgOriginalDTO {
+
+    /** 公众号appid,要求与小程序有绑定且同主体 */
+    private String appid;
+
+    /** 公众号模板id */
+    private String template_id;
+
+    /** 公众号模板消息所要跳转的url */
+    private String url;
+
+    private String touser;
+
+    /** 公众号模板消息所要跳转的小程序,小程序的必须与公众号具有绑定关系 */
+    private Map<String, String> miniprogram;
+
+    /** 模板内容,不填则下发空模板(必填) */
+    private Map<String, TemplateDataDTO> data;
+
+}

+ 30 - 0
src/main/java/com/care/client/service/PinanbaoContactService.java

@@ -9,6 +9,7 @@ import com.care.common.enums.RelationTypeEnum;
 import com.care.common.service.*;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.compress.utils.Lists;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -70,6 +71,35 @@ public class PinanbaoContactService {
         return this.careHouseContactService.save(careContact);
     }
 
+    /**
+     * 新增修改紧急联系人
+     * @param vo
+     * @return
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean createOrUpdateMyContact(HouseContactVO vo) {
+        QueryWrapper<CareHouseContact> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(CareHouseContact::getMemberId, vo.getMemberId()).eq(CareHouseContact::getContactPhone, vo.getContactPhone());
+        List<CareHouseContact> contactList = careHouseContactService.list(queryWrapper);
+        if (CollectionUtils.isEmpty(contactList)) {
+            //保存被监护人
+            CareHouseContact careContact = new CareHouseContact();
+            BeanUtil.copyProperties(vo,careContact);
+            careContact.setMemberId(vo.getMemberId());
+            careContact.setCreateTime(new Date());
+            return this.careHouseContactService.save(careContact);
+        } else {
+            //修改被监护人
+            CareHouseContact careContact = contactList.get(0);
+            careContact.setContactName(vo.getContactName());
+            careContact.setAddr(vo.getAddr());
+            careContact.setLatitude(vo.getLatitude());
+            careContact.setLongitude(vo.getLongitude());
+            careContact.setRelationType(vo.getRelationType());
+            return this.careHouseContactService.updateById(careContact);
+        }
+    }
+
     /**
      * 查询紧急联系人详情
      * @param id

+ 3 - 0
src/main/java/com/care/common/cache/RedisKeyConstant.java

@@ -84,4 +84,7 @@ public class RedisKeyConstant {
     //活动信息 1天
     public static final String PEOPLEEVENT_ACTIVE_INFO = "PEOPLEEVENT:ACTIVE";
     public static final int PEOPLEEVENT_ACTIVE_INFO_TIME = 3600 * 24 * 1;
+
+    // 与安服务平台 -> 小程序, QRCODE
+    public static final String YUANSERVICE_QRCODE = "YUANSERVICE:QRCODE";
 }

+ 11 - 0
src/main/java/com/care/common/service/WxQrCodeService.java

@@ -0,0 +1,11 @@
+package com.care.common.service;
+
+import com.care.client.vo.WxAccessTokenVO;
+
+public interface WxQrCodeService {
+
+    String genWxQrcodeUrl(String contactSplicingStr);
+
+    WxAccessTokenVO processOfficialToken();
+
+}

+ 2 - 0
src/main/java/com/care/common/service/WxTemplateService.java

@@ -17,6 +17,8 @@ public interface WxTemplateService {
      */
     boolean sendTemplateMsg(String openId, String templateId, Map<String, TemplateDataDTO> dataMap);
 
+    boolean sendTemplateMsgOriginal(String openId, String templateId, String miniprogramAppid, String miniprogramPage, Map<String, TemplateDataDTO> dataMap);
+
     /**
      * 发送模板消息
      * @param openId 小程序OPENID

+ 89 - 0
src/main/java/com/care/common/service/impl/WxQrCodeServiceImpl.java

@@ -0,0 +1,89 @@
+package com.care.common.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.care.client.config.PlatformOfficialConfig;
+import com.care.client.config.WxConfig;
+import com.care.client.vo.WxAccessTokenVO;
+import com.care.common.cache.RedisKeyConstant;
+import com.care.common.cache.RedisUtil;
+import com.care.common.service.WxQrCodeService;
+import com.care.common.util.WxQrcodeUtil;
+import com.care.common.util.WxTemplateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.UUID;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
+
+@Service
+@Slf4j
+public class WxQrCodeServiceImpl implements WxQrCodeService {
+
+    @Resource
+    private RedisUtil redisUtil;
+
+    @Resource
+    private PlatformOfficialConfig platformOfficialConfig;
+
+    private Lock lock = new ReentrantLock();
+
+    public String genWxQrcodeUrl(String contactSplicingStr) {
+        WxAccessTokenVO wxAccessTokenVO = processOfficialToken();
+        WxConfig wxConfig = platformOfficialConfig.officialConfig();
+        if (StringUtils.isBlank(wxConfig.getAppId()) || StringUtils.isBlank(wxConfig.getSecret())) {
+            log.error("缺少必要参数");
+            return null;
+        }
+        try {
+            Integer nextId = NumberUtils.toInt(String.valueOf(System.currentTimeMillis()).substring(4));
+            String qrcodeKey = RedisKeyConstant.YUANSERVICE_QRCODE + ":" + nextId;
+            if (redisUtil.hasKey(qrcodeKey)) {
+                log.error("不能重复产生二维码");
+                return null;
+            } else {
+                redisUtil.set(qrcodeKey, contactSplicingStr,172800);
+            }
+            String tempTicketUrl = WxQrcodeUtil.createTempTicket(wxAccessTokenVO.getAccessToken(), "172800", nextId);
+            return StringUtils.isNotBlank(tempTicketUrl) ? tempTicketUrl : null;
+        } catch (Exception e) {
+            log.error("获取二维码出现错误", e);
+        }
+        return null;
+    }
+
+    public WxAccessTokenVO processOfficialToken() {
+        WxAccessTokenVO wxAccessTokenVO = new WxAccessTokenVO();
+        WxConfig wxConfig = platformOfficialConfig.officialConfig();
+        if (StringUtils.isBlank(wxConfig.getAppId()) || StringUtils.isBlank(wxConfig.getSecret())) {
+            log.error("缺少必要参数");
+            return null;
+        }
+        try {
+            //得到对象锁
+            lock.lock();
+            if (redisUtil.hasKey(RedisKeyConstant.YUANSERVICE_ACCESSTOKEN + "-official")) {
+                wxAccessTokenVO.setAccessToken(ObjectUtils.toString(redisUtil.get(RedisKeyConstant.YUANSERVICE_ACCESSTOKEN + "-official")));
+            } else {
+                wxAccessTokenVO = WxTemplateUtil.getAccessToken(wxConfig.getAppId(), wxConfig.getSecret());
+                if (wxAccessTokenVO == null || StringUtils.isBlank(wxAccessTokenVO.getAccessToken())) {
+                    log.error("未获取到AccessToekn");
+                    return null;
+                }
+                redisUtil.set(RedisKeyConstant.YUANSERVICE_ACCESSTOKEN + "-official", wxAccessTokenVO.getAccessToken(),60 * 100);
+            }
+            return wxAccessTokenVO;
+        } catch (Exception e) {
+            log.error("获取AccessToken出现错误", e);
+        } finally {
+            //释放锁
+            lock.unlock();
+        }
+        return null;
+    }
+
+}

+ 48 - 3
src/main/java/com/care/common/service/impl/WxTemplateServiceImpl.java

@@ -4,12 +4,11 @@ import cn.hutool.json.JSONObject;
 import com.care.client.config.PlatformOfficialConfig;
 import com.care.client.config.PlatformPinanbaoConfig;
 import com.care.client.config.WxConfig;
-import com.care.client.dto.MpTemplateMsgDTO;
-import com.care.client.dto.TemplateDataDTO;
-import com.care.client.dto.WxUniformTemplateDTO;
+import com.care.client.dto.*;
 import com.care.client.vo.WxAccessTokenVO;
 import com.care.common.cache.RedisKeyConstant;
 import com.care.common.cache.RedisUtil;
+import com.care.common.service.WxQrCodeService;
 import com.care.common.service.WxTemplateService;
 import com.care.common.util.*;
 import com.google.common.collect.Maps;
@@ -36,6 +35,9 @@ public class WxTemplateServiceImpl implements WxTemplateService {
     @Resource
     private PlatformOfficialConfig platformOfficialConfig;
 
+    @Resource
+    private WxQrCodeService wxQrCodeService;
+
 //    @Resource
 //    private CareOfficialMemberInfoService careOfficialMemberInfoService;
 
@@ -109,6 +111,49 @@ public class WxTemplateServiceImpl implements WxTemplateService {
         return Boolean.FALSE;
     }
 
+    @Override
+    public boolean sendTemplateMsgOriginal(String openId, String templateId, String miniprogramAppid, String miniprogramPage, Map<String, TemplateDataDTO> dataMap) {
+        if (StringUtils.isBlank(openId)) {
+            throw new IllegalArgumentException("参数 openId 为空");
+        }
+        if (StringUtils.isBlank(templateId)) {
+            throw new IllegalArgumentException("参数 templateId 为空");
+        }
+        if (StringUtils.isNotBlank(miniprogramAppid) && StringUtils.isBlank(miniprogramPage)) {
+            throw new IllegalArgumentException("参数 miniprogramPage 为空");
+        }
+        if (dataMap == null) {
+            dataMap = Maps.newHashMap();
+        }
+        WxAccessTokenVO wxAccessTokenVO = wxQrCodeService.processOfficialToken();
+        if (wxAccessTokenVO == null) {
+            throw new RuntimeException("获取AccessToken出错");
+        }
+
+        WxConfig wxConfig = platformOfficialConfig.officialConfig();
+        MpTemplateMsgOriginalDTO mpTemplateMsgOriginalDTO = new MpTemplateMsgOriginalDTO();
+        mpTemplateMsgOriginalDTO.setAppid(wxConfig.getAppId());
+        mpTemplateMsgOriginalDTO.setTemplate_id(templateId);
+        mpTemplateMsgOriginalDTO.setData(dataMap);
+        mpTemplateMsgOriginalDTO.setTouser(openId);
+
+        // TODO: 真实环境需要放开appid, 测试环境没法关联, 需取消 appid/page 参数
+        Map<String, String> miniprogramMap = Maps.newHashMap();
+        if (StringUtils.isNotBlank(miniprogramAppid)) {
+            miniprogramMap.put("appid", miniprogramAppid);
+            miniprogramMap.put("page", miniprogramPage);
+        }
+        mpTemplateMsgOriginalDTO.setMiniprogram(miniprogramMap);
+
+        // 发送消息模板
+        JSONObject jsonObject = WxTemplateUtil.sendTemplateMsg(mpTemplateMsgOriginalDTO, wxAccessTokenVO.getAccessToken());
+        if (jsonObject != null && "0".equals(jsonObject.getStr("errcode"))) {
+            return Boolean.TRUE;
+        }
+        log.error("发送订阅绑定设备联系人[" + openId + "] 出现错误: " + jsonObject.getStr("errmsg"));
+        return Boolean.FALSE;
+    }
+
     @Override
     public boolean sendTemplateMsg(String openId, String templateId, String miniprogramAppid, String miniprogramPage, Map<String, TemplateDataDTO> dataMap) {
         if (StringUtils.isBlank(openId)) {

+ 161 - 0
src/main/java/com/care/common/util/WxQrcodeUtil.java

@@ -0,0 +1,161 @@
+package com.care.common.util;
+
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+import com.care.client.dto.WxTemplateDTO;
+import com.care.client.dto.WxUniformTemplateDTO;
+import com.care.client.vo.WxAccessTokenVO;
+import com.care.common.cache.RedisKeyConstant;
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import java.io.*;
+import java.net.ConnectException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.security.SecureRandom;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+
+/**
+ * 微信接口访问工具封装
+ */
+public class WxQrcodeUtil {
+
+    // 临时二维码
+    private final static String QR_SCENE = "QR_SCENE";
+
+    /**
+     * 创建二维码
+     */
+    public final static String GEN_QRCODE_URL = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=ACCESS_TOKEN";
+
+    /**
+     * 创建二维码
+     */
+    public final static String SHOW_QRCODE_URL = "https://mp.weixin.qq.com/cgi-bin/showqrcode";
+
+    /**
+     * 创建临时带参数二维码
+     * @param accessToken
+     * @expireSeconds 该二维码有效时间,以秒为单位。 最大不超过2592000(即30天),此字段如果不填,则默认有效期为30秒。
+     * @param sceneId 场景Id
+     * @return
+     */
+    public static String createTempTicket(String accessToken, String expireSeconds, Integer sceneId) {
+        TreeMap<String,String> params = new TreeMap<>();
+        params.put("access_token", accessToken);
+        Map<String,Integer> intMap = new HashMap<>();
+        intMap.put("scene_id",sceneId);
+        Map<String,Map<String,Integer>> mapMap = new HashMap<>();
+        mapMap.put("scene", intMap);
+        //
+        Map<String,Object> paramsMap = new HashMap<>();
+        paramsMap.put("expire_seconds", expireSeconds);
+        paramsMap.put("action_name", QR_SCENE);
+        paramsMap.put("action_info", mapMap);
+
+        String url = GEN_QRCODE_URL.replace("ACCESS_TOKEN", accessToken);
+        JSONObject resultJsonObj = WxTemplateUtil.httpRequest(url, "POST", JSONUtil.toJsonStr(paramsMap));
+
+        return resultJsonObj == null ? null : showQrcode(resultJsonObj.getStr("ticket"));
+    }
+
+    /**
+     * 获取二维码ticket后,通过ticket换取二维码图片展示
+     * @param ticket
+     * @return
+     */
+    public static String showQrcode(String ticket) {
+        Map<String,String> params = new TreeMap<>();
+        try {
+            params.put("ticket", URLEncoder.encode(ticket, "utf-8"));
+            return setParmas(params, SHOW_QRCODE_URL,"utf-8");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+
+//    public static void main(String[] args) {
+//
+//        WxQrcodeUtil.createTempTicket("51_D55rGmfv71A8PjThis1K2V4ffC6xz1V-uE-VJiOvyA31P0zISnCsTrM319NDNLP5h-EEXIAZeVqCrpkA4VmglSRdUUNAKX2pdav7ayhwLHQh3BsdkDGF2MvcFRKIXdqCT1wla1R-3yYkKYqYXZJaAGABDN", "172800", 799);
+//    }
+
+    /**
+     * 设置参数
+     *
+     * @param map
+     *            参数map
+     * @param path
+     *            需要赋值的path
+     * @param charset
+     *            编码格式 默认编码为utf-8(取消默认)
+     * @return 已经赋值好的url 只需要访问即可
+     */
+    public static String setParmas(Map<String, String> map, String path, String charset) throws Exception {
+        String result = "";
+        boolean hasParams = false;
+        if (path != null && !"".equals(path)) {
+            if (map != null && map.size() > 0) {
+                StringBuilder builder = new StringBuilder();
+                Set<Map.Entry<String, String>> params = map.entrySet();
+                for (Map.Entry<String, String> entry : params) {
+                    String key = entry.getKey().trim();
+                    String value = entry.getValue().trim();
+                    if (hasParams) {
+                        builder.append("&");
+                    } else {
+                        hasParams = true;
+                    }
+                    if(charset != null && !"".equals(charset)){
+                        //builder.append(key).append("=").append(URLDecoder.(value, charset));
+                        builder.append(key).append("=").append(URLEncoder.encode(value, "utf-8"));
+                    }else{
+                        builder.append(key).append("=").append(value);
+                    }
+                }
+                result = builder.toString();
+            }
+        }
+        return doUrlPath(path, result).toString();
+    }
+
+    /**
+     * 设置连接参数
+     *
+     * @param path
+     *            路径
+     * @return
+     */
+    private static URL doUrlPath(String path, String query) throws Exception {
+        URL url = new URL(path);
+        if (StringUtils.isEmpty(path)) {
+            return url;
+        }
+        if (StringUtils.isEmpty(url.getQuery())) {
+            if (path.endsWith("?")) {
+                path += query;
+            } else {
+                path = path + "?" + query;
+            }
+        } else {
+            if (path.endsWith("&")) {
+                path += query;
+            } else {
+                path = path + "&" + query;
+            }
+        }
+        return new URL(path);
+    }
+
+}

+ 5 - 4
src/main/java/com/care/common/util/WxTemplateUtil.java

@@ -2,6 +2,7 @@ package com.care.common.util;
 
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.care.client.dto.MpTemplateMsgOriginalDTO;
 import com.care.client.dto.WxTemplateDTO;
 import com.care.client.dto.WxUniformTemplateDTO;
 import com.care.client.vo.WxAccessTokenVO;
@@ -33,7 +34,7 @@ public class WxTemplateUtil {
     /**
      * 发送模板消息(POST)
      */
-//    public final static String SEND_TEMPLATE_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
+    public final static String SEND_TEMPLATE_URL_OLD = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";
 
     /**
      * 发送模板消息(POST)
@@ -155,11 +156,11 @@ public class WxTemplateUtil {
      * @params [wxTemplateDTO, accessToken]
      * @return net.sf.json.JSONObject
      */
-    public static JSONObject sendTemplateMsg(WxTemplateDTO wxTemplateDTO, String accessToken) {
+    public static JSONObject sendTemplateMsg(MpTemplateMsgOriginalDTO mpTemplateMsgOriginalDTO, String accessToken) {
 
-        String url = SEND_TEMPLATE_URL.replace("ACCESS_TOKEN", accessToken);
+        String url = SEND_TEMPLATE_URL_OLD.replace("ACCESS_TOKEN", accessToken);
         // 将模板数据对象转换成json字符串
-        String wxTemplate = JSONUtil.toJsonStr(wxTemplateDTO);
+        String wxTemplate = JSONUtil.toJsonStr(mpTemplateMsgOriginalDTO);
         //发送请求
         JSONObject result = httpRequest(url, "POST", wxTemplate);
 

+ 3 - 0
src/main/resources/application.properties

@@ -66,6 +66,9 @@ wx.notic.toUrl=/page/index/index
 # 微信公众号配置
 wx.official.appid=wxf393853ab94c853f
 wx.official.secret=f3fc21fee8de01d79ded7f799a4d2d4d
+# 微信公众号配置 - 测试
+#wx.official.appid=wxd735a330f9387639
+#wx.official.secret=f0b4652c392b7cae457fe9d986115052
 
 #频安守护 小程序
 wx.pinanshouhu.codeUrl=https://api.weixin.qq.com/sns/jscode2session?appid={0}&secret={1}&js_code={2}&grant_type=authorization_code