Browse Source

feat:“添加订单微信推送功能“

soobin 1 year ago
parent
commit
aedb0d0f13

+ 4 - 0
pom.xml

@@ -98,6 +98,10 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
         <!--		<dependency>-->
         <!--			<groupId>org.springframework.boot</groupId>-->
         <!--			<artifactId>spring-boot-starter-jdbc</artifactId>-->

+ 10 - 0
src/main/java/com/szwl/constant/HuifuConstant.java

@@ -73,6 +73,16 @@ public class HuifuConstant {
     public static final String SC_DIV_HUIFU_ID = "6666000139220493";
 
     /**
+     * 申泽订单通知模版ID
+     */
+    public static final String SZ_TEMPLATE_ID = "Kn37QCyj-JsvKhP9CtNwsYoZe7liMq2uuTO1MbZdbEk";
+
+    /**
+     * 七云订单通知模版ID
+     */
+    public static final String SC_TEMPLATE_ID = "NNvPtOznN2nSV2g57y7B0tUZ77-bf0XxG4OaUvk5EZA";
+
+    /**
      * >>>>>>>>>>>>> 币种 >>>>>>>>>>>>>
      *
      */

+ 178 - 134
src/main/java/com/szwl/controller/TOrderController.java

@@ -2884,151 +2884,184 @@ public class TOrderController {
      */
     @RequestMapping(value = "/huifuNotify", method = RequestMethod.POST)
     @ResponseBody
-    public ResponseModel<?> huifuNotify(HttpServletRequest request) {
+    public String huifuNotify(HttpServletRequest request) {
         String respData = request.getParameter("resp_data");
-        JSONObject data = JSONObject.parseObject(respData);
-        String transStat = data.getString("trans_stat");
-        // 订单号
-        String sn = data.getString("req_seq_id");
-        if(StrUtil.hasEmpty(sn)) {
-            return R.fail(ResponseCodesEnum.A0001,"订单号为空!");
-        }
-        // 查到指定订单
-        LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
-        wrapper.eq(TOrder::getSn,sn);
-        TOrder order = orderService.getOne(wrapper);
-        if(HuifuConstant.TRANS_STAT_S.equals(transStat)) {
-            // 查到对应订单明细表
-            LambdaQueryWrapper<TOrderDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
-            lambdaQueryWrapper.eq(TOrderDetails::getOrderSn,sn);
-            List<TOrderDetails> orderDetails = orderDetailsService.list(lambdaQueryWrapper);
-            for (TOrderDetails orderDetail : orderDetails) {
-                // 修改状态订单明细状态
-                orderDetail.setRefundStatus("1");
-                orderDetailsService.updateById(orderDetail);
-            }
-            // 已支付
-            order.setStatus(1);
-            // 支付平台产生的全局流水号:hf_seq_id
+        try{
+            // 验签请参sign
+            String sign = request.getParameter("sign");
+            // 使用汇付公钥验签
+            if (!RSAUtil.verify(respData, HuifuConstant.HUIFU_PUBLIC_KEY, sign)) {
+                // 验签失败处理
+                log.info("验签失败");
+                return "";
+            }
+            JSONObject data = JSONObject.parseObject(respData);
+            String transStat = data.getString("trans_stat");
+            // 订单号
+            String sn = data.getString("req_seq_id");
+            if(StrUtil.hasEmpty(sn)) {
+//            return "R.fail(ResponseCodesEnum.A0001,"订单号为空!")";
+                log.info("返回参数订单编号为空");
+                return "";
+            }
+            // 查到指定订单
+            LambdaQueryWrapper<TOrder> wrapper = new LambdaQueryWrapper<>();
+            wrapper.eq(TOrder::getSn,sn);
+            wrapper.eq(TOrder::getStatus, 0);
+            TOrder order = orderService.getOne(wrapper);
+            if(order == null) {
+                log.info("找不到订单");
+                return "";
+            }
+            if(HuifuConstant.TRANS_STAT_S.equals(transStat)) {
+                // 查到对应订单明细表
+                LambdaQueryWrapper<TOrderDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+                lambdaQueryWrapper.eq(TOrderDetails::getOrderSn,sn);
+                List<TOrderDetails> orderDetails = orderDetailsService.list(lambdaQueryWrapper);
+                for (TOrderDetails orderDetail : orderDetails) {
+                    // 修改状态订单明细状态
+                    orderDetail.setRefundStatus("1");
+                    orderDetailsService.updateById(orderDetail);
+                }
+                // 已支付
+                order.setStatus(1);
+                // 支付平台产生的全局流水号:hf_seq_id
 //            String hfSeqId = data.getString("hf_seq_id");
-            // 支付平台产生的全局流水号:party_order_id
-            String partyOrderId = data.getString("party_order_id");
-            order.setTrxNo(partyOrderId);
-            // 支付时间,格式:YYYY-MM-DD HH:mm:ss
-            String payTime = data.getString("end_time");
-            SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmmss");
-            SimpleDateFormat outputFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-            // 临时表修改支付状态
-            String id = data.getString("remark");
-            if(StrUtil.isNotEmpty(id)) {
-                LambdaQueryWrapper<THuifuTempOrder> queryWrapper = new LambdaQueryWrapper<>();
-                queryWrapper.eq(THuifuTempOrder::getId,id);
-                THuifuTempOrder huifuTempOrder = huifuTempOrderService.getOne(queryWrapper);
-                huifuTempOrder.setStatus(1);
-                huifuTempOrderService.updateById(huifuTempOrder);
-            }
-            try {
-                Date date = inputFormat.parse(URLDecoder.decode(payTime, "UTF-8"));
-                String formattedDate = outputFormat.format(date);
-                Date payDate = outputFormat.parse(URLDecoder.decode(formattedDate, "UTF-8"));
-                order.setPayDate(payDate);
-            } catch (ParseException e) {
-                e.printStackTrace();
-            } catch (UnsupportedEncodingException e) {
-                e.printStackTrace();
-            }
-            // 修改订单信息
-            orderService.updateById(order);
-            //
-            JSONObject kindData = new JSONObject();
-            kindData.put("sn", order.getSn());
-            kindData.put("productName", order.getProductName());
-
-            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
-            if(order.getFrpCode().equals("WEIXIN_XCX")){
-                JSONObject kindData1 = new JSONObject();
-                kindData1.put("sn", order.getSn());
-                kindData1.put("productDesc", order.getProductDesc());
-                String s = order.getId().toString();
-                if(s.length()>6){
-                    s = s.substring(s.length()-6,s.length());
+                // 支付平台产生的全局流水号:party_order_id
+                String partyOrderId = data.getString("party_order_id");
+                order.setTrxNo(partyOrderId);
+                // 支付时间,格式:YYYY-MM-DD HH:mm:ss
+                String payTime = data.getString("end_time");
+                SimpleDateFormat inputFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+                SimpleDateFormat outputFormat  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                // 临时表修改支付状态
+                String id = data.getString("remark");
+                if(StrUtil.isNotEmpty(id)) {
+                    LambdaQueryWrapper<THuifuTempOrder> queryWrapper = new LambdaQueryWrapper<>();
+                    queryWrapper.eq(THuifuTempOrder::getId,id);
+                    THuifuTempOrder huifuTempOrder = huifuTempOrderService.getOne(queryWrapper);
+                    huifuTempOrder.setStatus(1);
+                    huifuTempOrderService.updateById(huifuTempOrder);
                 }
-                kindData1.put("mealCode", s);
-                order.setOrderStatus("-1");
-                equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("cardPayXCX", kindData1.toString()).toString());
-                if(StringUtils.isNotEmpty(equipment.getApkVersion())){
-                    //发送两次mq
-                    if(equipment.getApkVersion().equals("1.0.131-jz11")||equipment.getApkVersion().equals("1.0.131-jz12")||equipment.getApkVersion().equals("1.0.131-jz13")||equipment.getApkVersion().equals("1.0.131-jz14")||equipment.getApkVersion().equals("1.0.131-jz15")){
-                        sendMqTwo(equipment.getClientId(),kindData1.toString());
-                    }
+                try {
+                    Date date = inputFormat.parse(URLDecoder.decode(payTime, "UTF-8"));
+                    String formattedDate = outputFormat.format(date);
+                    Date payDate = outputFormat.parse(URLDecoder.decode(formattedDate, "UTF-8"));
+                    order.setPayDate(payDate);
+                } catch (ParseException e) {
+                    e.printStackTrace();
+                } catch (UnsupportedEncodingException e) {
+                    e.printStackTrace();
                 }
-                TSzsmWx szsmWx = szsmWxService.getById(order.getWxId());
-                BigDecimal integral = szsmWx.getIntegral();
-                if(integral!=null){
-                    integral = order.getPrice().add(integral);
+                // 修改订单信息
+                orderService.updateById(order);
+                //
+                JSONObject kindData = new JSONObject();
+                kindData.put("sn", order.getSn());
+                kindData.put("productName", order.getProductName());
+
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
+                if(order.getFrpCode().equals("WEIXIN_XCX")){
+                    JSONObject kindData1 = new JSONObject();
+                    kindData1.put("sn", order.getSn());
+                    kindData1.put("productDesc", order.getProductDesc());
+                    String s = order.getId().toString();
+                    if(s.length()>6){
+                        s = s.substring(s.length()-6,s.length());
+                    }
+                    kindData1.put("mealCode", s);
+                    order.setOrderStatus("-1");
+                    equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("cardPayXCX", kindData1.toString()).toString());
+                    if(StringUtils.isNotEmpty(equipment.getApkVersion())){
+                        //发送两次mq
+                        if(equipment.getApkVersion().equals("1.0.131-jz11")||equipment.getApkVersion().equals("1.0.131-jz12")||equipment.getApkVersion().equals("1.0.131-jz13")||equipment.getApkVersion().equals("1.0.131-jz14")||equipment.getApkVersion().equals("1.0.131-jz15")){
+                            sendMqTwo(equipment.getClientId(),kindData1.toString());
+                        }
+                    }
+                    TSzsmWx szsmWx = szsmWxService.getById(order.getWxId());
+                    BigDecimal integral = szsmWx.getIntegral();
+                    if(integral!=null){
+                        integral = order.getPrice().add(integral);
+                    }else {
+                        integral = order.getPrice();
+                    }
+                    szsmWx.setIntegral(integral);
+                    szsmWxService.updateById(szsmWx);
+                    if(StringUtils.isNotEmpty(order.getCoupons())){
+                        String coupons = order.getCoupons();
+                        coupons= coupons.substring(1,coupons.length()-1);
+                        List<String> list1 = Arrays.asList(coupons);
+                        if(list1.size()>0){
+                            for(String code:list1){
+                                szwlFeign.useYHJ(code, String.valueOf(order.getAdminId()),order.getClientId());
+                            }
+                        }
+                    }
                 }else {
-                    integral = order.getPrice();
-                }
-                szsmWx.setIntegral(integral);
-                szsmWxService.updateById(szsmWx);
-                if(StringUtils.isNotEmpty(order.getCoupons())){
-                    String coupons = order.getCoupons();
-                    coupons= coupons.substring(1,coupons.length()-1);
-                    List<String> list1 = Arrays.asList(coupons);
-                    if(list1.size()>0){
-                        for(String code:list1){
-                            szwlFeign.useYHJ(code, String.valueOf(order.getAdminId()),order.getClientId());
+                    if (!order.getIsNotified().equals("1")) {
+                        String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
+                        if (paySuccess.equals("success")) {
+                            order.setIsNotified("1");
+                            // 推送微信订单
+                            TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
+                            // 判断是否开启订单推送功能
+                            if(admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
+                                String openId = R.getDataIfSuccess(szwlFeign.getOpenId(order.getAdminId()));
+                                // 获取openId
+                                if(StringUtils.isNotEmpty(openId)) {
+                                    orderService.sendWechatMessage(openId, equipment, order, admin.getCompanyType());
+                                }
+                            }
                         }
                     }
                 }
-            }else {
-                if (!order.getIsNotified().equals("1")) {
-                    String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
-                    if (paySuccess.equals("success")) {
-                        order.setIsNotified("1");
+                orderService.updateById(order);
+//            equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
+                try {
+                    if(order.getProductNumber()==null||order.getProductNumber()==0){
+                        order.setProductNumber(1);
                     }
+                    orderFeign.saveToEs(order);
+                }catch (Exception e) {
+                    e.printStackTrace();
                 }
-            }
-            orderService.updateById(order);
-//            equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
             try {
-                if(order.getProductNumber()==null||order.getProductNumber()==0){
-                    order.setProductNumber(1);
+                LambdaQueryWrapper<TOrderTask> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(TOrderTask::getSn, sn);
+                TOrderTask oldOrderTask = orderTaskService.getOne(queryWrapper);
+                if (oldOrderTask == null) {
+                    TOrderTask orderTask = new TOrderTask();
+                    BeanUtils.copyPropertiesIgnoreNull(order, orderTask, true);
+                    orderTask.setAgencyId(order.getId());
+                    orderTaskService.save(orderTask);
                 }
-                orderFeign.saveToEs(order);
             }catch (Exception e) {
                 e.printStackTrace();
             }
-            //            try {
-            LambdaQueryWrapper<TOrderTask> queryWrapper = new LambdaQueryWrapper<>();
-            queryWrapper.eq(TOrderTask::getSn, sn);
-            TOrderTask oldOrderTask = orderTaskService.getOne(queryWrapper);
-            if (oldOrderTask == null) {
-                TOrderTask orderTask = new TOrderTask();
-                BeanUtils.copyPropertiesIgnoreNull(order, orderTask, true);
-                orderTask.setAgencyId(order.getId());
-                orderTaskService.save(orderTask);
-            }
-//            }catch (Exception e) {
-//                e.printStackTrace();
-//            }
-            //传送数据
-            sentJingZhun(order);
-            return R.ok("支付成功");
-        } else {
-            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
-            String gtClientId = equipment.getGtClientId();
-            JSONObject kindData = new JSONObject();
-            kindData.put("sn", order.getSn());
-            if (!order.getIsNotified().equals("2")) {
-                String payFail = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_faile", kindData.toString()).toString());
-                if (payFail.equals("success")) {
-                    order.setIsNotified("2");
+                //传送数据
+                sentJingZhun(order);
+//                return R.ok("支付成功");
+                log.info("支付成功");
+            } else {
+                TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
+                String gtClientId = equipment.getGtClientId();
+                JSONObject kindData = new JSONObject();
+                kindData.put("sn", order.getSn());
+                if (!order.getIsNotified().equals("2")) {
+                    String payFail = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_faile", kindData.toString()).toString());
+                    if (payFail.equals("success")) {
+                        order.setIsNotified("2");
+                    }
                 }
-            }            order.setNote(gtClientId + "支付失败");
-            orderService.updateById(order);
-            return R.fail(ResponseCodesEnum.A0001,"支付失败");
+                order.setNote(gtClientId + "支付失败");
+                orderService.updateById(order);
+                log.info("支付失败");
+            }
+            return "RECV_ORD_ID_" + sn;
+        } catch (Exception e){
+            log.info("异步回调开始,参数,request={}", respData, e);
         }
+        return "";
     }
 
     /**
@@ -3046,6 +3079,7 @@ public class TOrderController {
         String sn = request.getParameter("r2_OrderNo");
         LambdaQueryWrapper<TOrder> query = Wrappers.lambdaQuery();
         query.eq(TOrder::getSn,sn);
+        query.eq(TOrder::getStatus, 0);
         if(StringUtils.isEmpty(sn)){
             return "error";
         }
@@ -3089,7 +3123,7 @@ public class TOrderController {
             kindData.put("sn", order.getSn());
             kindData.put("productName", order.getProductName());
 
-            TEquipment byClientId = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
+            TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(order.getClientId()));
             if(order.getFrpCode().equals("WEIXIN_XCX")){
                 JSONObject kindData1 = new JSONObject();
                 kindData1.put("sn", order.getSn());
@@ -3100,11 +3134,11 @@ public class TOrderController {
                 }
                 kindData1.put("mealCode", s);
                 order.setOrderStatus("-1");
-                equipmentService.sentMessage(byClientId.getClientId(), PushUtils.buildJson("cardPayXCX", kindData1.toString()).toString());
-                if(StringUtils.isNotEmpty(byClientId.getApkVersion())){
+                equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("cardPayXCX", kindData1.toString()).toString());
+                if(StringUtils.isNotEmpty(equipment.getApkVersion())){
                     //发送两次mq
-                    if(byClientId.getApkVersion().equals("1.0.131-jz11")||byClientId.getApkVersion().equals("1.0.131-jz12")||byClientId.getApkVersion().equals("1.0.131-jz13")||byClientId.getApkVersion().equals("1.0.131-jz14")||byClientId.getApkVersion().equals("1.0.131-jz15")){
-                        sendMqTwo(byClientId.getClientId(),kindData1.toString());
+                    if(equipment.getApkVersion().equals("1.0.131-jz11")||equipment.getApkVersion().equals("1.0.131-jz12")||equipment.getApkVersion().equals("1.0.131-jz13")||equipment.getApkVersion().equals("1.0.131-jz14")||equipment.getApkVersion().equals("1.0.131-jz15")){
+                        sendMqTwo(equipment.getClientId(),kindData1.toString());
                     }
                 }
                 TSzsmWx szsmWx = szsmWxService.getById(order.getWxId());
@@ -3128,10 +3162,20 @@ public class TOrderController {
                 }
             }else {
                 if (!order.getIsNotified().equals("1")) {
-                    String paySuccess = equipmentService.sentMessage(byClientId.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
+                    String paySuccess = equipmentService.sentMessage(equipment.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
                     if (paySuccess.equals("success")) {
                         order.setIsNotified("1");
                     }
+                    // 推送微信订单
+                    TAdmin admin = R.getDataIfSuccess(szwlFeign.getAdmin(String.valueOf(order.getAdminId())));
+                    // 判断是否开启订单推送功能
+                    if(admin != null && StringUtils.isNotEmpty(admin.getOrderNotice()) && admin.getOrderNotice().equals("1")) {
+                        String openId = R.getDataIfSuccess(szwlFeign.getOpenId(order.getAdminId()));
+                        // 获取openId
+                        if(StringUtils.isNotEmpty(openId)) {
+                            orderService.sendWechatMessage(openId, equipment, order, admin.getCompanyType());
+                        }
+                    }
                 }
             }
             orderService.updateById(order);

+ 9 - 0
src/main/java/com/szwl/feign/bean/SzwlFeign.java

@@ -95,4 +95,13 @@ public interface SzwlFeign {
     @GetMapping("/tHuifuMch/getHuifuId")
     ResponseModel<THuifuMch> getHuifuId(@RequestParam Long adminId);
 
+
+    /**
+     * 获取openId
+     * @param adminId
+     * @return
+     */
+    @GetMapping("/tWechat/getOpenId")
+    ResponseModel<String> getOpenId(@RequestParam Long adminId);
+
 }

+ 2 - 1
src/main/java/com/szwl/mapper/xml/TAdminMapper.xml

@@ -35,6 +35,7 @@
         <result column="relation_admin_id" property="relationAdminId" />
         <result column="company_type" property="companyType" />
         <result column="wechat_pay_id" property="wechatPayId" />
+        <result column="order_notice" property="orderNotice" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -43,7 +44,7 @@
         locked_date, login_date, login_failure_count, login_ip, trade_merchant_no, name,
         parent_id, password, notice_id, type, username, phone, is_refund, if_foreign, open,
         promo_code_open, apply_start_time, apply_end_time, code, pay_platform, relation_admin_id,
-        company_type, wechat_pay_id
+        company_type, wechat_pay_id, order_notice
     </sql>
 
 </mapper>

+ 28 - 0
src/main/java/com/szwl/model/bean/WeChatTemplateMsg.java

@@ -0,0 +1,28 @@
+package com.szwl.model.bean;
+
+import lombok.Data;
+import lombok.ToString;
+
+@Data
+@ToString
+public class WeChatTemplateMsg {
+    /**
+     * 消息
+     */
+    private String value;
+    /**
+     * 消息颜色
+     */
+    private String color;
+
+
+    public WeChatTemplateMsg(String value) {
+        this.value = value;
+        this.color = "#173177";
+    }
+
+    public WeChatTemplateMsg(String value, String color) {
+        this.value = value;
+        this.color = color;
+    }
+}

+ 3 - 0
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -118,6 +118,9 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "支付宝支付配置ID")
     private Long alipayId;
 
+    @ApiModelProperty(value = "微信公众号订单通知,0:关闭,1:开启,默认关闭")
+    private String orderNotice;
+
     @Transient
     public String getManagerId() {
 

+ 30 - 0
src/main/java/com/szwl/model/utils/RSAUtil.java

@@ -4,12 +4,14 @@ package com.szwl.model.utils;
 import com.szwl.model.utils.constants.Algorithm;
 import com.szwl.model.utils.constants.CommonConst;
 import com.szwl.model.utils.exceptions.JPException;
+import lombok.extern.slf4j.Slf4j;
 
 import javax.crypto.Cipher;
 import java.io.ByteArrayOutputStream;
 import java.security.*;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -18,6 +20,7 @@ import java.util.Map;
  * @author chenyf
  * @date 2018-12-15
  */
+@Slf4j
 public class RSAUtil {
     public static final String DEFAULT_ENCRYPT_ALGORITHM = "RSA/ECB/PKCS1Padding";
     public static final String SIGNATURE_ALGORITHM_SHA1 = "SHA1withRSA";
@@ -184,4 +187,31 @@ public class RSAUtil {
         KeyFactory keyFactory = KeyFactory.getInstance(Algorithm.RSA);
         return keyFactory.generatePublic(x509KeySpec);
     }
+
+    /**
+     * 使用汇付RSA公钥验签
+     * @param data 待签名字符串
+     * @param publicKeyBase64 公钥(Base64编码)
+     * @return 验签结果
+     * @throws Exception
+     */
+    public static boolean verify(String data, String publicKeyBase64, String sign) {
+        // Base64 --> Key
+        try {
+            byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+            KeyFactory keyFactory;
+            keyFactory = KeyFactory.getInstance("RSA");
+            PublicKey publicKey = keyFactory.generatePublic(keySpec);
+            // verify
+            Signature signature = Signature.getInstance("SHA256WithRSA");
+            signature.initVerify(publicKey);
+            signature.update(data.getBytes("UTF-8"));
+            return signature.verify(Base64.getDecoder().decode(sign));
+        } catch (Exception e) {
+            log.error("Exception", e);
+            return false;
+        }
+
+    }
 }

+ 15 - 0
src/main/java/com/szwl/service/TOrderService.java

@@ -2,6 +2,7 @@ package com.szwl.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
+import com.szwl.model.entity.TEquipment;
 import com.szwl.model.entity.TOrder;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.wechat.pay.java.service.refund.model.CreateRequest;
@@ -47,6 +48,11 @@ public interface TOrderService extends IService<TOrder> {
      */
     Refund weixinRefundApi(CreateRequest createRequest, Long adminId);
 
+    /**
+     * 汇聚查询退款状态
+     * @param refundTrxNo
+     * @return
+     */
     JSONObject queryRefund(String refundTrxNo);
 
     /**
@@ -83,4 +89,13 @@ public interface TOrderService extends IService<TOrder> {
      * @param order
      */
     void processAlipayOrder(Map<String, String> params, TOrder order);
+
+    /**
+     * 推送微信订单通知
+     * @param openId
+     * @param equipment
+     * @param order
+     * @param companyType
+     */
+    void sendWechatMessage(String openId, TEquipment equipment, TOrder order, String companyType);
 }

+ 137 - 2
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -13,11 +13,12 @@ import com.alipay.api.response.AlipayTradePrecreateResponse;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.google.gson.Gson;
+import com.szwl.constant.ConfigConsts;
 import com.szwl.constant.HuifuConstant;
 import com.szwl.constant.JoinpayConstant;
-import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.feign.bean.OrderFeign;
 import com.szwl.feign.bean.SzwlFeign;
+import com.szwl.model.bean.WeChatTemplateMsg;
 import com.szwl.model.bo.R;
 import com.szwl.model.entity.*;
 import com.szwl.mapper.TOrderMapper;
@@ -39,18 +40,24 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.http.HttpStatus;
 import org.apache.http.message.BasicNameValuePair;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.UnsupportedEncodingException;
+import java.io.*;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URL;
+import java.net.URLConnection;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
 import static com.szwl.service.impl.TJoinpayMchServiceImpl.createHmacSign;
 
@@ -88,8 +95,19 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
     TAlipayConfigService alipayConfigService;
 
     @Autowired
+    private StringRedisTemplate redisTemplate;
+
+    @Autowired
     private TOrderDetailsService orderDetailsService;
 
+    private static final String SZ_ACCESS_TOKEN_KEY = "sz_wechat_access_token";
+    private static final String SC_ACCESS_TOKEN_KEY = "sc_wechat_access_token";
+
+    /**
+     * 缓存1个半小时(90分钟)
+     */
+    private static final long EXPIRATION_TIME = 90 * 60;
+
     @Override
     public synchronized String initSn(Long equipmentId) {
         StringBuilder number = new StringBuilder();
@@ -498,6 +516,123 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         }
     }
 
+    @Override
+    public void sendWechatMessage(String openId, TEquipment equipment, TOrder order, String companyType) {
+        String url = "";
+        String accessToken = "";
+        try {
+            if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+                accessToken = redisTemplate.opsForValue().get(SZ_ACCESS_TOKEN_KEY);
+            } else {
+                accessToken = redisTemplate.opsForValue().get(SC_ACCESS_TOKEN_KEY);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        if(StringUtils.isEmpty(accessToken)) {
+            if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+                url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+                        + HuifuConstant.SZ_WX_SUB_APP_ID + "&secret=" + HuifuConstant.SZ_WX_APP_SECRET;
+            } else {
+                url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+                        + HuifuConstant.SC_WX_SUB_APP_ID + "&secret=" + HuifuConstant.SC_WX_APP_SECRET;
+            }
+            PrintWriter out = null;
+            BufferedReader in = null;
+            String line;
+            StringBuffer stringBuffer = new StringBuffer();
+            try {
+                URL realUrl = new URL(url);
+                // 打开和URL之间的连接
+                URLConnection conn = realUrl.openConnection();
+
+                // 设置通用的请求属性 设置请求格式
+                //设置返回类型
+                conn.setRequestProperty("contentType", "text/plain");
+                //设置请求类型
+                conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
+                //设置超时时间
+                conn.setConnectTimeout(1000);
+                conn.setReadTimeout(1000);
+                conn.setDoOutput(true);
+                conn.connect();
+                // 获取URLConnection对象对应的输出流
+                out = new PrintWriter(conn.getOutputStream());
+                // flush输出流的缓冲
+                out.flush();
+                // 定义BufferedReader输入流来读取URL的响应    设置接收格式
+                in = new BufferedReader(
+                        new InputStreamReader(conn.getInputStream(), "UTF-8"));
+                while ((line = in.readLine()) != null) {
+                    stringBuffer.append(line);
+                }
+                JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString());
+                log.info("获取token:{}",jsonObject.toString());
+                accessToken = jsonObject.getString("access_token");
+                if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+                    redisTemplate.opsForValue().set(SZ_ACCESS_TOKEN_KEY, accessToken, EXPIRATION_TIME, TimeUnit.SECONDS);
+                } else {
+                    redisTemplate.opsForValue().set(SZ_ACCESS_TOKEN_KEY, accessToken, EXPIRATION_TIME, TimeUnit.SECONDS);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                //使用finally块来关闭输出流、输入流
+                try {
+                    if (out != null) {
+                        out.close();
+                    }
+                    if (in != null) {
+                        in.close();
+                    }
+                } catch (IOException ex) {
+                    ex.printStackTrace();
+                }
+            }
+        }
+        // 推送消息
+        // 模板参数
+        Map<String, WeChatTemplateMsg> sendMag = new HashMap();
+        // 转换时间为String类型
+        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String payTime = format.format(order.getPayDate());
+        // 模版参数
+        if(StringUtils.isNotEmpty(equipment.getName())) {
+            if(equipment.getName().length() > 20) {
+                sendMag.put("thing15", new WeChatTemplateMsg(equipment.getName().substring(0, 15) + "..."));
+            } else {
+                sendMag.put("thing15", new WeChatTemplateMsg(equipment.getName()));
+            }
+        } else {
+            sendMag.put("thing15", new WeChatTemplateMsg(equipment.getClientId().substring(-6)));
+        }
+        if(order.getProductName().length() > 20) {
+            sendMag.put("thing37", new WeChatTemplateMsg(order.getProductName().substring(0, 15) + "..."));
+        } else {
+            sendMag.put("thing37", new WeChatTemplateMsg(order.getProductName()));
+        }
+        sendMag.put("character_string8", new WeChatTemplateMsg(order.getSn()));
+        sendMag.put("amount34", new WeChatTemplateMsg(order.getPrice().toString()));
+        sendMag.put("time36", new WeChatTemplateMsg(payTime));
+        RestTemplate restTemplate = new RestTemplate();
+        Map<String, Object> sendBody = new HashMap<>();
+        sendBody.put("touser", openId);
+        sendBody.put("topcolor", "#FF0000");
+        sendBody.put("data", sendMag);
+        if(StringUtils.isEmpty(companyType) || companyType.equals("0")) {
+            sendBody.put("template_id", HuifuConstant.SZ_TEMPLATE_ID);
+        } else {
+            sendBody.put("template_id", HuifuConstant.SC_TEMPLATE_ID);
+        }
+        String sendUrl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken;
+        ResponseEntity<String> forEntity = restTemplate.postForEntity(sendUrl, sendBody, String.class);
+        JSONObject jsonObject = JSONObject.parseObject(forEntity.getBody());
+        String messageCode = jsonObject.getString("errcode");
+        String msgId = jsonObject.getString("msgid");
+        System.out.println("messageCode : " + messageCode + ", msgId: " +msgId);
+        log.info("微信推送结果:{}","messageCode : " + messageCode + ", msgId: " +msgId);
+    }
+
     public void processRefund(Map<String, Object> bodyMap) {
         String decrypt = wechatPayConfigService.decryptFromResource(bodyMap);
         Gson gson = new Gson();