调整mq消息, 处理支付问题

This commit is contained in:
andy 2025-09-06 16:16:59 +08:00
parent f51c0df5f7
commit c4271768e1
15 changed files with 401 additions and 198 deletions

View File

@ -46,7 +46,7 @@ public class MqttResponse<T> implements Serializable {
return this; return this;
} }
public MqttResponse<T> success(T data){ public MqttResponse<T> success(T dataBody){
this.code=SUCCESS; this.code=SUCCESS;
this.msg="成功"; this.msg="成功";
this.data=data; this.data=data;

View File

@ -18,7 +18,7 @@ public class OrderStatusData {
private Integer soc; private Integer soc;
@Schema(description = "租借电池包仓位") @Schema(description = "租借电池包仓位")
private Integer rentBatNo; private String rentBatNo;
@Schema(description = "租用电池包编码") @Schema(description = "租用电池包编码")
private String rentBatCode; private String rentBatCode;
@ -30,7 +30,7 @@ public class OrderStatusData {
private String returnBatCode; private String returnBatCode;
@Schema(description = "归还电池包仓位") @Schema(description = "归还电池包仓位")
private Integer returnBatNo; private String returnBatNo;
@Schema(description = "归还电池包SOC") @Schema(description = "归还电池包SOC")
private Integer returnBatSoc; private Integer returnBatSoc;

View File

@ -80,7 +80,19 @@ public class MessageUtilService {
public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) { public void publishRSAMessage(MessageTopic topic, String msg, String stationPublicKey) {
RSA rsa = SecureUtil.rsa(null, stationPublicKey); RSA rsa = SecureUtil.rsa(null, stationPublicKey);
String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey); String encrypt = rsa.encryptBase64(msg, KeyType.PublicKey);
publishMessage.publish(encrypt, topic.toString());
// 3. 发送MQTT消息
try {
MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString());
try {
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(msg));
} catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>记录mqtt消息 发送RSA加密消息 出现了错误{},topic:{}; data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg), JSONUtil.toJsonStr(mqttMessage));
throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage());
}
} catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>发送站端mqtt消息 发送RSA加密消息 出现异常{},topic:{}; data:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(msg));
}
} }
/** /**
@ -103,8 +115,8 @@ public class MessageUtilService {
try { try {
MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString()); MqttMessage mqttMessage = publishMessage.publish(encrypt, topic.toString());
try { try {
dataBody.set("header", JSONUtil.toJsonStr(header)); //dataBody.set("header", JSONUtil.toJsonStr(header));
addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), dataBody); addMqttMessage(topic, mqttMessage.getId()+"", mqttMessage.getQos(), JSONUtil.parseObj(message));
} catch (Exception e) { } catch (Exception e) {
log.error("MQTT->>>>>>>>>>>>>记录mqtt消息出现了错误{},topic:{}; header:{}, data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(header),JSONUtil.toJsonStr(dataBody), JSONUtil.toJsonStr(mqttMessage)); log.error("MQTT->>>>>>>>>>>>>记录mqtt消息出现了错误{},topic:{}; header:{}, data:{}; message:{}",e.getMessage(),JSONUtil.toJsonStr(topic),JSONUtil.toJsonStr(header),JSONUtil.toJsonStr(dataBody), JSONUtil.toJsonStr(mqttMessage));
throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage()); throw new RuntimeException("记录mqtt消息出现了错误"+e.getMessage());

View File

@ -52,6 +52,9 @@ public class MqttMessageHandleService {
// 3.1.2 保存MQTT消息 // 3.1.2 保存MQTT消息
MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo); MqttMessageHeader header = messageUtilService.addMqttMessage(topic, message.getId()+"", message.getQos(), jo);
JSONObject dataBody = jo.getJSONObject("dataBody"); JSONObject dataBody = jo.getJSONObject("dataBody");
if(dataBody == null){
dataBody = jo.getJSONObject("data");
}
// 3.2 分类处理 // 3.2 分类处理
// 3.2.1 state // 3.2.1 state
if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) { if (MqttMessageTypeEnum.STATE.getType().equals(topic.getMessageType())) {

View File

@ -2,8 +2,6 @@ package com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.EventFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
@ -11,26 +9,11 @@ import com.evotech.hd.cloud.mqtt.message.dto.newer.confirm.SwapCompleteConfirm;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete; import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.MqttResponse;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData; import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.service.*; import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.cloud.utils.ParamServiceUtils;
import com.evotech.hd.cloud.utils.components.SwapOrderBasicFeeComponent;
import com.evotech.hd.common.core.constant.HDConstant;
import com.evotech.hd.common.core.entity.cloud.BatteryStationDc;
import com.evotech.hd.common.core.entity.cloud.BatteryTrace;
import com.evotech.hd.common.core.entity.cloud.VehicleInfo;
import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.enums.SwapBatteryStepEnum;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
/** /**
* 换电完成事件数据 * 换电完成事件数据
* *
@ -46,18 +29,18 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE
@Resource @Resource
OrderService orderService; OrderService orderService;
@Resource // @Resource
OrderDetailService orderDetailService; // OrderDetailService orderDetailService;
@Resource // @Resource
private SwapOrderBasicFeeComponent orderBasicFeeComponent; // private SwapOrderBasicFeeComponent orderBasicFeeComponent;
@Resource // @Resource
private OrderSwapBatteryStepService orderSwapBatteryStepService; // private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Resource // @Resource
private VehicleService vehicleService; // private VehicleService vehicleService;
@Resource // @Resource
BatteryStationDcService batteryStationDcService; // BatteryStationDcService batteryStationDcService;
@Resource // @Resource
WechatService wechatService; // WechatService wechatService;
@Override @Override
public boolean accept(String functionName) { public boolean accept(String functionName) {
@ -73,7 +56,7 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE
SwapCompleteConfirm swapRecordConfirm = new SwapCompleteConfirm(); SwapCompleteConfirm swapRecordConfirm = new SwapCompleteConfirm();
try { try {
// 订单状态更新处理 // 订单状态更新处理
handleOrderStatus(orderStatus, statusData); orderService.handleOrderStatus(orderStatus, statusData);
response.setCode(MqttResponse.PUBLIC_SUCCESS); response.setCode(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_SUCCESS); swapRecordConfirm.setAckStatus(MqttResponse.PUBLIC_SUCCESS);
swapRecordConfirm.setOrderNo(orderStatus.getOrderNo()); swapRecordConfirm.setOrderNo(orderStatus.getOrderNo());
@ -87,145 +70,147 @@ public class MqttEventSwapCompleteExchangeProcessorImpl implements MqttStrategyE
swapRecordConfirm.setError(e.getMessage()); swapRecordConfirm.setError(e.getMessage());
} }
response.setData(swapRecordConfirm); response.setData(swapRecordConfirm);
sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response); if(header != null){
} sendAESMessage(topic, header, EventFunctionTypesEnum.FUN_ORDEREVENT, response);
/**
* 订单最终状态的更新
* @param orderStatus
* @param statusData
*/
private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
if(ObjectUtils.isEmpty(order)){
throw new RuntimeException("未找到订单信息");
}
//更新订单状态
order.setStatus(orderStatus.getStatus());
orderService.updateById(order);
//修改订单状态及金额
alterOrderStatus(order, statusData);
//记录电池信息 or 记录最后的换电步骤
alterSwapBatteryStep(orderStatus, statusData, order);
}
/**
* 修改订单状态方法
* @param order
* @param statusData
* @return
*/
private void alterOrderStatus(Order order, OrderStatusData statusData) {
if (order.getStatus() == 3 || order.getStatus() == 5) {
//如果订单是完成. 查询订单详情
OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
orderDetail.setOrderTimeEnd(new Date());
orderDetail.setServiceTimeEnd(new Date());
//copy属性
BeanUtils.copyProperties(statusData, orderDetail);
orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
switch (orderDetail.getFeeType()){
case HDConstant.OrderConstant.FEE_TYPE_DL:
orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_ODO:
// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_SOC:
default:
orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
break;
}
//计算费用方式
log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
//计算费用信息
orderBasicFeeComponent.orderBasicFee(order, orderDetail);
//发送换电完成推送
wechatService.sendGzhSwapOrderSuccessMessage(order);
orderService.calculateCost(order);
} }
} }
// /**
/** // * 订单最终状态的更新
* 修改订单费用 // * @param orderStatus
* @param order // * @param statusData
* @param statusData // */
* @return // private void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
*/ //
private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) { // Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){ // if(ObjectUtils.isEmpty(order)){
//生成步骤 // throw new RuntimeException("未找到订单信息");
orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime()); // }
// 修改车上电池编码 // //更新订单状态
vehicleService.update(new UpdateWrapper<VehicleInfo>() // order.setStatus(orderStatus.getStatus());
.set("bat_code", statusData.getRentBatCode()) // orderService.updateById(order);
.set("bat_soc", statusData.getRentBatSoc()) // //修改订单状态及金额
.eq("plate_num", order.getPlateNum())); // alterOrderStatus(order, statusData);
//出租电池信息维护 // //记录电池信息 or 记录最后的换电步骤
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>() // alterSwapBatteryStep(orderStatus, statusData, order);
.set("status", HDConstant.DcConstant.STATUS_CZ) // }
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION) //
.set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR) //
.set("point_code", order.getPlateNum()) // /**
.set("point_name", order.getPlateNum()) // * 修改订单状态方法
.set("dcc_no", 0) // * @param order
.eq("bat_code", statusData.getRentBatCode())); // * @param statusData
//归还电池信息维护 // * @return
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>() // */
.set("status", HDConstant.DcConstant.STATUS_CD) // private void alterOrderStatus(Order order, OrderStatusData statusData) {
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR) // if (order.getStatus() == 3 || order.getStatus() == 5) {
.set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION) // //如果订单是完成. 查询订单详情
.set("point_code", order.getPlateNum()) // OrderDetail orderDetail = orderDetailService.getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, order.getPkId()));
.set("point_name", order.getPlateNum()) // orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
.set("soc", statusData.getReturnBatSoc()) // orderDetail.setOrderTimeEnd(new Date());
.set("dcc_no", statusData.getReturnBatNo()) // orderDetail.setServiceTimeEnd(new Date());
.eq("bat_code", statusData.getReturnBatCode())); // //copy属性
// 添加2块电池的溯源记录 // BeanUtils.copyProperties(statusData, orderDetail);
addBatteryTrace(orderStatus, statusData, order); // orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
// orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
} // switch (orderDetail.getFeeType()){
} // case HDConstant.OrderConstant.FEE_TYPE_DL:
// orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
// break;
// case HDConstant.OrderConstant.FEE_TYPE_ODO:
//// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
// break;
// case HDConstant.OrderConstant.FEE_TYPE_SOC:
/** // default:
* 添加电池轨迹记录 // orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
* // break;
* @param orderStatus // }
* @param statusData // //计算费用方式
* @param osb // log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
*/ // //计算费用信息
private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) { // orderBasicFeeComponent.orderBasicFee(order, orderDetail);
BatteryTrace bt1 = new BatteryTrace(); // //发送换电完成推送
bt1.setOrderNo(orderStatus.getOrderNo()); // wechatService.sendGzhSwapOrderSuccessMessage(order);
bt1.setBatCode(statusData.getRentBatCode()); // orderService.calculateCost(order);
bt1.setSoc(statusData.getRentBatSoc()); // }
bt1.setBeginTime(orderStatus.getStatusTime()); // }
bt1.setPointType(2); //
bt1.setPointCode(osb.getPlateNum()); //
bt1.setPointName(osb.getPlateNum()); //
bt1.setCreater("SYS"); // /**
BatteryTrace bt2 = new BatteryTrace(); // * 修改订单费用
BeanUtils.copyProperties(bt1, bt2); // * @param order
bt2.setBatCode(statusData.getReturnBatCode()); // * @param statusData
bt2.setSoc(statusData.getRentBatSoc()); // * @return
bt2.setPointType(1); // */
bt2.setPointCode(osb.getStationCode()); // private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) {
bt2.setPointName(osb.getStationName()); // if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){
batteryStationDcService.addTrace(bt1); // //生成步骤
batteryStationDcService.addTrace(bt2); // orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime());
} // // 修改车上电池编码
// vehicleService.update(new UpdateWrapper<VehicleInfo>()
// .set("bat_code", statusData.getRentBatCode())
// .set("bat_soc", statusData.getRentBatSoc())
// .eq("plate_num", order.getPlateNum()));
// //出租电池信息维护
// batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
// .set("status", HDConstant.DcConstant.STATUS_CZ)
// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION)
// .set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR)
// .set("point_code", order.getPlateNum())
// .set("point_name", order.getPlateNum())
// .set("dcc_no", 0)
// .eq("bat_code", statusData.getRentBatCode()));
// //归还电池信息维护
// batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
// .set("status", HDConstant.DcConstant.STATUS_CD)
// .set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR)
// .set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION)
// .set("point_code", order.getPlateNum())
// .set("point_name", order.getPlateNum())
// .set("soc", statusData.getReturnBatSoc())
// .set("dcc_no", statusData.getReturnBatNo())
// .eq("bat_code", statusData.getReturnBatCode()));
// // 添加2块电池的溯源记录
// addBatteryTrace(orderStatus, statusData, order);
//
// }
// }
//
//
//
//
//
//
// /**
// * 添加电池轨迹记录
// *
// * @param orderStatus
// * @param statusData
// * @param osb
// */
// private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) {
// BatteryTrace bt1 = new BatteryTrace();
// bt1.setOrderNo(orderStatus.getOrderNo());
// bt1.setBatCode(statusData.getRentBatCode());
// bt1.setSoc(statusData.getRentBatSoc());
// bt1.setBeginTime(orderStatus.getStatusTime());
// bt1.setPointType(2);
// bt1.setPointCode(osb.getPlateNum());
// bt1.setPointName(osb.getPlateNum());
// bt1.setCreater("SYS");
// BatteryTrace bt2 = new BatteryTrace();
// BeanUtils.copyProperties(bt1, bt2);
// bt2.setBatCode(statusData.getReturnBatCode());
// bt2.setSoc(statusData.getRentBatSoc());
// bt2.setPointType(1);
// bt2.setPointCode(osb.getStationCode());
// bt2.setPointName(osb.getStationName());
// batteryStationDcService.addTrace(bt1);
// batteryStationDcService.addTrace(bt2);
// }
//
} }

View File

@ -23,7 +23,7 @@ public interface MqttStrategyEventExchangeProcessor extends MqttStrategyExchange
default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){ default void sendAESMessage(MessageTopic topic, MqttMessageHeader header, EventFunctionTypesEnum typesEnum, MqttResponse response){
topic.setMessageType(MqttMessageTypeEnum.EVENT.getType()); topic.setMessageType(MqttMessageTypeEnum.CONFIRM.getType());
header.setFunction(typesEnum.getReFunction()); header.setFunction(typesEnum.getReFunction());
logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN))); logger.info("\r\n=====>>>回复站端的EVENT消息--MQTT发送到消息主题{},头部信息:{},message:{}", topic,header, JSONUtil.parseObj(response, new JSONConfig().setDateFormat(DatePattern.NORM_DATETIME_PATTERN)));
sendAESMessage(topic, header, response); sendAESMessage(topic, header, response);

View File

@ -13,15 +13,12 @@ import com.evotech.hd.cloud.service.OrderService;
import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse; import com.evotech.hd.common.core.entity.cloud.request.BatterySwapResponse;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.redis.utils.RedisServiceUtils; import com.evotech.hd.common.redis.utils.RedisServiceUtils;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
/** /**
* 换电信息--站端回复开始换电通知信息类 * 换电信息--站端回复开始换电通知信息类
* *
@ -67,11 +64,7 @@ public class MqttRequestBatterySwapExchangeProcessorImpl implements MqttStrategy
Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo)); Order order = orderService.getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderNo));
//如果是成功, 创建订单详情 //如果是成功, 创建订单详情
if(MqttResponse.PUBLIC_SUCCESS.equals(battery.getCode())){ if(MqttResponse.PUBLIC_SUCCESS.equals(battery.getCode())){
OrderDetail detail = new OrderDetail(); orderDetailService.addOrderDetailByOrder(order.getPkId());
detail.setOrderId(order.getPkId());
detail.setServiceTimeBegin(new Date());
detail.setOrderTimeBegin(new Date());
orderDetailService.save(detail);
}else{ }else{
wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg()))); wechatService.sendClientMessage(order.getPreWechatId(), JSON.toJSONString(Collections.asMap("code",0, "msg", battery.getMsg())));
} }

View File

@ -4,6 +4,9 @@ import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.event.MqttEventSwapCompleteExchangeProcessorImpl;
import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor; import com.evotech.hd.cloud.mqtt.message.processor.strategy.impl.state.MqttStateSwapStepDataExchangeProcessor;
import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor; import com.evotech.hd.cloud.open.processor.StationMessageStrategyExchangeProcessor;
import com.evotech.hd.cloud.service.OrderService; import com.evotech.hd.cloud.service.OrderService;
@ -41,7 +44,8 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess
private OrderSwapBatteryStepService orderSwapBatteryStepService; private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Resource @Resource
private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor; private MqttStateSwapStepDataExchangeProcessor mqttStateSwapStepDataExchangeProcessor;
@Resource
private MqttEventSwapCompleteExchangeProcessorImpl mqttEventSwapCompleteExchangeProcessorImpl;
/*** /***
* 新增换电单 禁止删除, 反射调用 * 新增换电单 禁止删除, 反射调用
* @param json * @param json
@ -82,7 +86,7 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess
*/ */
public Result arrivalSignal(JSONObject json){ public Result arrivalSignal(JSONObject json){
try { try {
Order order = orderService.getById(json.getInteger("preId")); Order order = orderService.getById(json.getInteger("pkId"));
json.put("orderNo", order.getOrderNo()); json.put("orderNo", order.getOrderNo());
mqttStateSwapStepDataExchangeProcessor.exchange(new MessageTopic(json.getString("stationCode")+"_WEB站推送", "http"), null, JSONUtil.parseObj(json.toJSONString())); mqttStateSwapStepDataExchangeProcessor.exchange(new MessageTopic(json.getString("stationCode")+"_WEB站推送", "http"), null, JSONUtil.parseObj(json.toJSONString()));
return Result.getInstance().build(Boolean.class).success(true); return Result.getInstance().build(Boolean.class).success(true);
@ -90,6 +94,32 @@ public class OrderSwapProcessor implements StationMessageStrategyExchangeProcess
e.printStackTrace();; e.printStackTrace();;
return Result.getInstance().build(Boolean.class).error(e.getMessage(), null); return Result.getInstance().build(Boolean.class).error(e.getMessage(), null);
} }
}
/***
* 车辆换电完成
* @param json
* @return
*/
public Result orderCompleted(JSONObject json){
try {
Order order = orderService.getById(json.getInteger("pkId"));
OrderStatusData statusData = JSONUtil.toBean(json.toJSONString(), OrderStatusData.class);
SwapComplete orderStatus = new SwapComplete();
orderStatus.setOrderNo(order.getOrderNo());
orderStatus.setStatus(3);
orderStatus.setStatusTime(new Date());
orderStatus.setStatusData(statusData);
// 订单状态更新处理
orderService.handleOrderStatus(orderStatus, statusData);
//再次查询数据信息
order = orderService.getById(json.getInteger("pkId"));
return Result.getInstance().build(JSONObject.class).success((JSONObject)JSONObject.toJSON(order));
} catch (Exception e) {
e.printStackTrace();
return Result.getInstance().build(JSONObject.class).error(e.getMessage(), null);
}
} }
} }

View File

@ -13,4 +13,7 @@ import com.evotech.hd.common.core.entity.order.OrderDetail;
* @remark: 开发人员联系方式 1042025947@qq.com/微信同步 * @remark: 开发人员联系方式 1042025947@qq.com/微信同步
*/ */
public interface OrderDetailService extends IService<OrderDetail> { public interface OrderDetailService extends IService<OrderDetail> {
public OrderDetail addOrderDetailByOrder(Integer orderId);
} }

View File

@ -3,6 +3,8 @@ package com.evotech.hd.cloud.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.evotech.hd.cloud.entity.vo.NativePayVO; import com.evotech.hd.cloud.entity.vo.NativePayVO;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.common.core.Dto.Result; import com.evotech.hd.common.core.Dto.Result;
import com.evotech.hd.common.core.Dto.order.OrderBillListVo; import com.evotech.hd.common.core.Dto.order.OrderBillListVo;
import com.evotech.hd.common.core.Dto.order.OrderDetailVo; import com.evotech.hd.common.core.Dto.order.OrderDetailVo;
@ -81,4 +83,6 @@ public interface OrderService extends IService<Order> {
Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd); Result<List<OrderBillListVo>> billList(String companyCode, String orderTimeEnd);
void excelBillList(String companyCode, String orderTimeEnd); void excelBillList(String companyCode, String orderTimeEnd);
void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData);
} }

View File

@ -1,12 +1,15 @@
package com.evotech.hd.cloud.service.impl; package com.evotech.hd.cloud.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.service.OrderDetailService;
import com.evotech.hd.common.core.dao.cloud.OrderDetailDao; import com.evotech.hd.common.core.dao.cloud.OrderDetailDao;
import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.cloud.service.OrderDetailService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
/** /**
* 订单详情实现类 * 订单详情实现类
* *
@ -21,6 +24,18 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailDao, OrderDetail> implements OrderDetailService { public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailDao, OrderDetail> implements OrderDetailService {
@Override
public OrderDetail addOrderDetailByOrder(Integer orderId) {
OrderDetail orderDetail = getOne(new LambdaQueryWrapper<OrderDetail>().eq(OrderDetail::getOrderId, orderId), false);
if(orderDetail == null){
orderDetail = new OrderDetail();
orderDetail.setOrderId(orderId);
orderDetail.setServiceTimeBegin(new Date());
orderDetail.setOrderTimeBegin(new Date());
save(orderDetail);
}
return orderDetail;
}
} }

View File

@ -10,6 +10,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao; import com.evotech.hd.cloud.dao.OrderSwapBatteryPreDao;
@ -21,12 +22,11 @@ import com.evotech.hd.cloud.mqtt.enums.MqttMessageTypeEnum;
import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum; import com.evotech.hd.cloud.mqtt.enums.RequestFunctionTypesEnum;
import com.evotech.hd.cloud.mqtt.message.MessageTopic; import com.evotech.hd.cloud.mqtt.message.MessageTopic;
import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader; import com.evotech.hd.cloud.mqtt.message.MqttMessageHeader;
import com.evotech.hd.cloud.mqtt.message.dto.newer.event.SwapComplete;
import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq; import com.evotech.hd.cloud.mqtt.message.dto.newer.req.battery.BatterySwapReq;
import com.evotech.hd.cloud.mqtt.message.dto.newer.state.OrderStatusData;
import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService; import com.evotech.hd.cloud.mqtt.message.handle.MessageUtilService;
import com.evotech.hd.cloud.service.OrderService; import com.evotech.hd.cloud.service.*;
import com.evotech.hd.cloud.service.TaxPointService;
import com.evotech.hd.cloud.service.TradeService;
import com.evotech.hd.cloud.service.WalletAccountService;
import com.evotech.hd.cloud.service.rpc.WechatService; import com.evotech.hd.cloud.service.rpc.WechatService;
import com.evotech.hd.cloud.utils.CommonUtil; import com.evotech.hd.cloud.utils.CommonUtil;
import com.evotech.hd.cloud.utils.ExcelUtil; import com.evotech.hd.cloud.utils.ExcelUtil;
@ -45,10 +45,7 @@ import com.evotech.hd.common.core.entity.cloud.request.PageListSwapOrderRequest;
import com.evotech.hd.common.core.entity.order.Order; import com.evotech.hd.common.core.entity.order.Order;
import com.evotech.hd.common.core.entity.order.OrderDetail; import com.evotech.hd.common.core.entity.order.OrderDetail;
import com.evotech.hd.common.core.entity.resource.auth.AuthUser; import com.evotech.hd.common.core.entity.resource.auth.AuthUser;
import com.evotech.hd.common.core.enums.CodeMsg; import com.evotech.hd.common.core.enums.*;
import com.evotech.hd.common.core.enums.OrderStatusEnums;
import com.evotech.hd.common.core.enums.PayTypeEnums;
import com.evotech.hd.common.core.enums.TradeTypeEnums;
import com.evotech.hd.common.core.utils.Collections; import com.evotech.hd.common.core.utils.Collections;
import com.evotech.hd.common.core.utils.DataUtils; import com.evotech.hd.common.core.utils.DataUtils;
import com.evotech.hd.common.permission.util.RedisPermissionUtils; import com.evotech.hd.common.permission.util.RedisPermissionUtils;
@ -60,6 +57,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal; import java.math.BigDecimal;
@ -104,10 +102,15 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
private OrderSwapBatteryPreDao orderSwapBatteryPreDao; private OrderSwapBatteryPreDao orderSwapBatteryPreDao;
@Resource @Resource
private MessageUtilService messageUtilService; private MessageUtilService messageUtilService;
@Autowired
private BatteryStationDcService batteryStationDcService;
@Autowired
private OrderSwapBatteryStepService orderSwapBatteryStepService;
@Autowired
private OrderDetailService orderDetailService;
public static OrderListVo convertOrderListVo(Order order){
public static OrderListVo convertOrderListVo(Order order){
OrderListVo vo = new OrderListVo(); OrderListVo vo = new OrderListVo();
BeanUtils.copyProperties(order, vo); BeanUtils.copyProperties(order, vo);
vo.setAmount(order.getOrderAmount()); vo.setAmount(order.getOrderAmount());
@ -216,8 +219,17 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
order.setStationName(orderSwapBatteryPre.getStationName()); order.setStationName(orderSwapBatteryPre.getStationName());
order.setDelFlag(HDConstant.DELETE_NO); order.setDelFlag(HDConstant.DELETE_NO);
// TODO 查询换电站信息拿到计费方式计费信息在充电结束时, 计算 // TODO 查询换电站信息拿到计费方式计费信息在充电结束时, 计算
Boolean saveResult = save(order);
if(saveResult){
try {
orderDetailService.addOrderDetailByOrder(order.getPkId());
} catch (Exception e) {
e.printStackTrace();
log.error("生成换电订单详情出错",e);
}
}
// osb = orderBasicFeeComponent.orderBasicFee(osb); // osb = orderBasicFeeComponent.orderBasicFee(osb);
return (save(order) ? new Result<Order>().success(order) : new Result<Order>().error("订单生成异常", null)); return (saveResult ? new Result<Order>().success(order) : new Result<Order>().error("订单生成异常", null));
} }
@Override @Override
@ -234,6 +246,13 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
return new Result<Boolean>().error("未找到符合条件的订单"); return new Result<Boolean>().error("未找到符合条件的订单");
} }
try {
orderDetailService.addOrderDetailByOrder(order.getPkId());
} catch (Exception e) {
e.printStackTrace();
log.error("生成换电订单详情出错",e);
}
try { try {
log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid); log.info("开始处理换电请求, 订单编号: {}, 用户ID: {}", order.getOrderNo(), wuid);
// 构建换电请求消息 // 构建换电请求消息
@ -620,6 +639,142 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, Order> implements Or
updateById(order); updateById(order);
} }
/**
* 订单最终状态的更新
* @param orderStatus
* @param statusData
*/
@Override
public void handleOrderStatus(SwapComplete orderStatus, OrderStatusData statusData) {
Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getOrderNo, orderStatus.getOrderNo()));
if(ObjectUtils.isEmpty(order)){
throw new RuntimeException("未找到订单信息");
}
//更新订单状态
order.setStatus(orderStatus.getStatus());
updateById(order);
//修改订单状态及金额
alterOrderStatus(order, statusData);
//记录电池信息 or 记录最后的换电步骤
alterSwapBatteryStep(orderStatus, statusData, order);
}
/**
* 修改订单状态方法
* @param order
* @param statusData
* @return
*/
private void alterOrderStatus(Order order, OrderStatusData statusData) {
if (order.getStatus() == 3 || order.getStatus() == 5) {
//如果订单是完成. 查询订单详情
OrderDetail orderDetail = orderDetailService.addOrderDetailByOrder(order.getPkId());
orderDetail.setFeeType(ParamServiceUtils.getSettlementType());
orderDetail.setOrderTimeEnd(new Date());
orderDetail.setServiceTimeEnd(new Date());
//copy属性
BeanUtils.copyProperties(statusData, orderDetail);
orderDetail.setRentBatSoc(Double.valueOf(statusData.getRentBatSoc()));
orderDetail.setReturnBatSoc(Double.valueOf(statusData.getReturnBatSoc()));
switch (orderDetail.getFeeType()){
case HDConstant.OrderConstant.FEE_TYPE_DL:
orderDetail.setElectricityQuantity(statusData.getElectAmount().doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_ODO:
// orderDetail.setElectricityQuantity(new BigDecimal(statusData.getSoc()).doubleValue());
break;
case HDConstant.OrderConstant.FEE_TYPE_SOC:
default:
orderDetail.setElectricityQuantity(new BigDecimal(statusData.getRentBatSoc()).subtract(new BigDecimal(statusData.getReturnBatSoc())).doubleValue());
break;
}
//计算费用方式
log.info("\r\n=====>>>订单状态更新处理订单状态开始结算:{},{}",order.getOrderNo(),order.getStatus() );
//计算费用信息
orderBasicFeeComponent.orderBasicFee(order, orderDetail);
//发送换电完成推送
wechatService.sendGzhSwapOrderSuccessMessage(order);
calculateCost(order);
}
}
/**
* 修改订单费用
* @param order
* @param statusData
* @return
*/
private void alterSwapBatteryStep(SwapComplete orderStatus, OrderStatusData statusData, Order order) {
if (orderStatus.getStatus() == 3 || orderStatus.getStatus() == 5){
//生成步骤
orderSwapBatteryStepService.addOrderSwapBatteryStepBySwapComplete(orderStatus.getOrderNo(), SwapBatteryStepEnum.COMPLETED.getKey(), orderStatus.getStatusTime());
// 修改车上电池编码
vehicleInfoDao.update(new UpdateWrapper<VehicleInfo>()
.set("bat_code", statusData.getRentBatCode())
.set("bat_soc", statusData.getRentBatSoc())
.eq("plate_num", order.getPlateNum()));
//出租电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CZ)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_STATION)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_CAR)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("dcc_no", 0)
.eq("bat_code", statusData.getRentBatCode()));
//归还电池信息维护
batteryStationDcService.update(new UpdateWrapper<BatteryStationDc>()
.set("status", HDConstant.DcConstant.STATUS_CD)
.set("source_from", HDConstant.DcConstant.SOURCE_FROM_CAR)
.set("point_type", HDConstant.DcConstant.POINT_TYPE_STATION)
.set("point_code", order.getPlateNum())
.set("point_name", order.getPlateNum())
.set("soc", statusData.getReturnBatSoc())
.set("dcc_no", statusData.getReturnBatNo())
.eq("bat_code", statusData.getReturnBatCode()));
// 添加2块电池的溯源记录
addBatteryTrace(orderStatus, statusData, order);
}
}
/**
* 添加电池轨迹记录
*
* @param orderStatus
* @param statusData
* @param osb
*/
private void addBatteryTrace(SwapComplete orderStatus, OrderStatusData statusData, Order osb) {
BatteryTrace bt1 = new BatteryTrace();
bt1.setOrderNo(orderStatus.getOrderNo());
bt1.setBatCode(statusData.getRentBatCode());
bt1.setSoc(statusData.getRentBatSoc());
bt1.setBeginTime(orderStatus.getStatusTime());
bt1.setPointType(2);
bt1.setPointCode(osb.getPlateNum());
bt1.setPointName(osb.getPlateNum());
bt1.setCreater("SYS");
BatteryTrace bt2 = new BatteryTrace();
BeanUtils.copyProperties(bt1, bt2);
bt2.setBatCode(statusData.getReturnBatCode());
bt2.setSoc(statusData.getRentBatSoc());
bt2.setPointType(1);
bt2.setPointCode(osb.getStationCode());
bt2.setPointName(osb.getStationName());
batteryStationDcService.addTrace(bt1);
batteryStationDcService.addTrace(bt2);
}
} }

View File

@ -97,10 +97,12 @@ public class LoginServiceImpl implements LoginService {
String openid = redisUtil.get(HDConstant.openidPrefix + wuid).toString(); String openid = redisUtil.get(HDConstant.openidPrefix + wuid).toString();
String sessionKey = redisUtil.get(HDConstant.sessionKeyPrefix + wuid).toString(); String sessionKey = redisUtil.get(HDConstant.sessionKeyPrefix + wuid).toString();
HMac hmac = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, sessionKey.getBytes()); HMac hmac = DigestUtil.hmac(HmacAlgorithm.HmacSHA256, sessionKey.getBytes());
String res = LoginUtil.checkSessionKey(accessTokenService.getAccessToken(), openid, hmac.digestHex("")); String res = LoginUtil.resetUserSessionKey(accessTokenService.getAccessToken(), openid, hmac.digestHex(""));
// String res = LoginUtil.code2Session(xcxProperties.getAppid(), openid, hmac.digestHex("")); // String res = LoginUtil.code2Session(xcxProperties.getAppid(), openid, hmac.digestHex(""));
JSONObject jo = JSONUtil.parseObj(res); JSONObject jo = JSONUtil.parseObj(res);
if (jo.getInt("errcode") == 0) { if (jo.getInt("errcode") == 0) {
redisUtil.set(HDConstant.openidPrefix + wuid, jo.getStr("openid"), 0);
redisUtil.set(HDConstant.sessionKeyPrefix + wuid, jo.getStr("session_key"), 0);
Map<String, String> m = tokenBuilder(wuid); Map<String, String> m = tokenBuilder(wuid);
return new Result<Map<String, String>>().success(m); return new Result<Map<String, String>>().success(m);
} }

View File

@ -147,7 +147,7 @@ public interface PayExchangeProcessor {
//交易类型 //交易类型
tradeDetail.setTradeType(getAttach().getInt("type")); tradeDetail.setTradeType(getAttach().getInt("type"));
tradeDetail.setOrderNo(getAttach().getStr("orderNo")); tradeDetail.setOrderNo(getAttach().getStr("orderNo"));
tradeDetail.setOutTradeNo(getAttach().getStr("outTradeNo")); tradeDetail.setOutTradeNo(transaction.getOutTradeNo());
tradeDetail.setOrderCount(StringUtils.isNotEmpty(tradeDetail.getOrderNo()) ? tradeDetail.getOrderNo().split(",").length : 0); tradeDetail.setOrderCount(StringUtils.isNotEmpty(tradeDetail.getOrderNo()) ? tradeDetail.getOrderNo().split(",").length : 0);
tradeDetail.setTradeAmount(transaction.getAmount().getPayerTotal()); tradeDetail.setTradeAmount(transaction.getAmount().getPayerTotal());
tradeDetail.setPayType(PayTypeEnums.WECHAT.getCode()); tradeDetail.setPayType(PayTypeEnums.WECHAT.getCode());

View File

@ -106,11 +106,12 @@ hbyt:
-----END PUBLIC KEY----- -----END PUBLIC KEY-----
# 支付回调地址 # 支付回调地址
notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/notify notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/notify
#notify_url: http://y865f68d.natappfree.cc/wechat/pay/wechatpay/notify #notify_url: http://wc8b537a.natappfree.cc/wechat/pay/wechatpay/notify
# Native支付回调地址 # Native支付回调地址
native_notify_url: https://api.evo-techina.com/wechat/wechatpay/native/nativeback/msg native_notify_url: https://api.evo-techina.com/wechat/wechatpay/native/nativeback/msg
# 退款回调地址 # 退款回调地址
refund_notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/refunds/notify refund_notify_url: http://api.evo-techina.com/wechat/pay/wechatpay/refunds/notify
#refund_notify_url: http://wc8b537a.natappfree.cc/wechat/pay/wechatpay/refunds/notify
# token缓存时效小时 # token缓存时效小时
token_exp_hour: 2 token_exp_hour: 2
# 公众号 # 公众号