Преглед изворни кода

加入 临时车缴费功能

wuxw пре 6 година
родитељ
комит
e6c0063bc3

+ 297 - 0
Api/src/main/java/com/java110/api/listener/fee/PayFeePreTempCarInoutListener.java

@@ -0,0 +1,297 @@
+package com.java110.api.listener.fee;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.java110.api.listener.AbstractServiceApiDataFlowListener;
+import com.java110.core.annotation.Java110Listener;
+import com.java110.core.context.DataFlowContext;
+import com.java110.core.smo.fee.IFeeConfigInnerServiceSMO;
+import com.java110.core.smo.fee.IFeeInnerServiceSMO;
+import com.java110.core.smo.hardwareAdapation.ICarInoutInnerServiceSMO;
+import com.java110.core.smo.room.IRoomInnerServiceSMO;
+import com.java110.dto.FeeConfigDto;
+import com.java110.dto.FeeDto;
+import com.java110.dto.RoomDto;
+import com.java110.dto.hardwareAdapation.CarInoutDto;
+import com.java110.entity.center.AppService;
+import com.java110.entity.order.Orders;
+import com.java110.event.service.api.ServiceDataFlowEvent;
+import com.java110.utils.constant.BusinessTypeConstant;
+import com.java110.utils.constant.CommonConstant;
+import com.java110.utils.constant.FeeTypeConstant;
+import com.java110.utils.constant.ResponseConstant;
+import com.java110.utils.constant.ServiceCodeConstant;
+import com.java110.utils.exception.ListenerExecuteException;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.BeanConvertUtil;
+import com.java110.utils.util.DateUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName PayFeeListener
+ * @Description TODO 预交费(临时停车费)侦听
+ * @Author wuxw
+ * @Date 2019/6/3 13:46
+ * @Version 1.0
+ * add by wuxw 2019/6/3
+ **/
+@Java110Listener("payFeePreTempCarInoutListener")
+public class PayFeePreTempCarInoutListener extends AbstractServiceApiDataFlowListener {
+
+    private static Logger logger = LoggerFactory.getLogger(PayFeePreTempCarInoutListener.class);
+
+
+    @Autowired
+    private IFeeInnerServiceSMO feeInnerServiceSMOImpl;
+
+    @Autowired
+    private IRoomInnerServiceSMO roomInnerServiceSMOImpl;
+
+    @Autowired
+    private ICarInoutInnerServiceSMO carInoutInnerServiceSMOImpl;
+
+    @Autowired
+    private IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl;
+
+
+    @Override
+    public String getServiceCode() {
+        return ServiceCodeConstant.SERVICE_CODE_PAY_FEE_PRE_TEMP_CAR_INOUT;
+    }
+
+    @Override
+    public HttpMethod getHttpMethod() {
+        return HttpMethod.POST;
+    }
+
+    @Override
+    public void soService(ServiceDataFlowEvent event) {
+
+        logger.debug("ServiceDataFlowEvent : {}", event);
+
+        DataFlowContext dataFlowContext = event.getDataFlowContext();
+        AppService service = event.getAppService();
+
+        String paramIn = dataFlowContext.getReqData();
+
+        //校验数据
+        validate(paramIn);
+        JSONObject paramObj = JSONObject.parseObject(paramIn);
+
+        HttpHeaders header = new HttpHeaders();
+        dataFlowContext.getRequestCurrentHeaders().put(CommonConstant.HTTP_ORDER_TYPE_CD, "D");
+        JSONArray businesses = new JSONArray();
+
+        //添加单元信息
+        businesses.add(addFeeDetail(paramObj, dataFlowContext));
+        businesses.add(modifyFee(paramObj, dataFlowContext));
+        businesses.add(modifyCarInout(paramObj, dataFlowContext));
+
+        JSONObject paramInObj = super.restToCenterProtocol(businesses, dataFlowContext.getRequestCurrentHeaders());
+
+        //将 rest header 信息传递到下层服务中去
+        super.freshHttpHeader(header, dataFlowContext.getRequestCurrentHeaders());
+
+        ResponseEntity<String> responseEntity = this.callService(dataFlowContext, service.getServiceCode(), paramInObj);
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            dataFlowContext.setResponseEntity(responseEntity);
+            return;
+        }
+
+        JSONObject paramOut = JSONObject.parseObject(responseEntity.getBody());
+        paramOut.put("receivableAmount", paramObj.getString("receivableAmount"));
+
+        responseEntity = new ResponseEntity<>(paramOut.toJSONString(), HttpStatus.OK);
+        dataFlowContext.setResponseEntity(responseEntity);
+    }
+
+    private JSONObject modifyCarInout(JSONObject reqJson, DataFlowContext context) {
+
+        FeeDto feeDto = (FeeDto) reqJson.get("feeInfo");
+        CarInoutDto tempCarInoutDto = new CarInoutDto();
+        tempCarInoutDto.setCommunityId(reqJson.getString("communityId"));
+        tempCarInoutDto.setInoutId(feeDto.getPayerObjId());
+        List<CarInoutDto> carInoutDtos = carInoutInnerServiceSMOImpl.queryCarInouts(tempCarInoutDto);
+
+        Assert.listOnlyOne(carInoutDtos, "根据费用信息反差车辆进场记录未查到 或查到多条");
+
+        CarInoutDto carInoutDto = carInoutDtos.get(0);
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_CAR_INOUT);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessCarInout = new JSONObject();
+        businessCarInout.putAll(BeanConvertUtil.beanCovertMap(carInoutDto));
+        businessCarInout.put("state", "100400");
+        //计算 应收金额
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessCarInout", businessCarInout);
+        return business;
+    }
+
+    /**
+     * 刷入order信息
+     *
+     * @param orders  订单信息
+     * @param headers 头部信息
+     */
+    protected void freshOrderProtocol(JSONObject orders, Map<String, String> headers) {
+        super.freshOrderProtocol(orders, headers);
+        orders.put("orderProcess", Orders.ORDER_PROCESS_ORDER_PRE_SUBMIT);
+
+    }
+
+    /**
+     * 添加费用明细信息
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject addFeeDetail(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_SAVE_FEE_DETAIL);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessFeeDetail = new JSONObject();
+        businessFeeDetail.putAll(paramInJson);
+        businessFeeDetail.put("detailId", "-1");
+        businessFeeDetail.put("primeRate", "1.00");
+        //计算 应收金额
+        FeeDto feeDto = new FeeDto();
+        feeDto.setFeeId(paramInJson.getString("feeId"));
+        feeDto.setCommunityId(paramInJson.getString("communityId"));
+        List<FeeDto> feeDtos = feeInnerServiceSMOImpl.queryFees(feeDto);
+        if (feeDtos == null || feeDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "查询费用信息失败,未查到数据或查到多条数据");
+        }
+        feeDto = feeDtos.get(0);
+        paramInJson.put("feeInfo", feeDto);
+        FeeConfigDto feeConfigDto = new FeeConfigDto();
+        feeConfigDto.setFeeTypeCd(feeDto.getFeeTypeCd());
+        feeConfigDto.setCommunityId(feeDto.getCommunityId());
+        List<FeeConfigDto> feeConfigDtos = feeConfigInnerServiceSMOImpl.queryFeeConfigs(feeConfigDto);
+        if (feeConfigDtos == null || feeConfigDtos.size() != 1) {
+            throw new ListenerExecuteException(ResponseConstant.RESULT_CODE_ERROR, "未查到费用配置信息,查询多条数据");
+        }
+        feeConfigDto = feeConfigDtos.get(0);
+        Date nowTime = new Date();
+
+        long diff = nowTime.getTime() - feeDto.getStartTime().getTime();
+        long nd = 1000 * 24 * 60 * 60;// 一天的毫秒数
+        long nh = 1000 * 60 * 60;// 一小时的毫秒数
+        long nm = 1000 * 60;// 一分钟的毫秒数
+        double day = 0;
+        double hour = 0;
+        double min = 0;
+        day = diff / nd;// 计算差多少天
+        hour = diff % nd / nh + day * 24;// 计算差多少小时
+        min = diff % nd % nh / nm + day * 24 * 60;// 计算差多少分钟
+        double money = 0.00;
+        double newHour = hour;
+        if (min > 0) { //一小时超过
+            newHour += 1;
+        }
+        if (newHour <= 2) {
+            money = Double.parseDouble(feeConfigDto.getAdditionalAmount());
+        } else {
+            double lastHour = newHour - 2;
+            money = lastHour * Double.parseDouble(feeConfigDto.getSquarePrice()) + Double.parseDouble(feeConfigDto.getAdditionalAmount());
+        }
+
+        double receivableAmount = money;
+
+        businessFeeDetail.put("receivableAmount", receivableAmount);
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFeeDetail", businessFeeDetail);
+        paramInJson.put("receivableAmount", receivableAmount);
+        return business;
+    }
+
+
+    /**
+     * 修改费用信息
+     *
+     * @param paramInJson     接口调用放传入入参
+     * @param dataFlowContext 数据上下文
+     * @return 订单服务能够接受的报文
+     */
+    private JSONObject modifyFee(JSONObject paramInJson, DataFlowContext dataFlowContext) {
+
+
+        JSONObject business = JSONObject.parseObject("{\"datas\":{}}");
+        business.put(CommonConstant.HTTP_BUSINESS_TYPE_CD, BusinessTypeConstant.BUSINESS_TYPE_UPDATE_FEE_INFO);
+        business.put(CommonConstant.HTTP_SEQ, DEFAULT_SEQ + 1);
+        business.put(CommonConstant.HTTP_INVOKE_MODEL, CommonConstant.HTTP_INVOKE_MODEL_S);
+        JSONObject businessFee = new JSONObject();
+        FeeDto feeInfo = (FeeDto) paramInJson.get("feeInfo");
+        Map feeMap = BeanConvertUtil.beanCovertMap(feeInfo);
+        feeMap.put("startTime", DateUtil.getFormatTimeString(feeInfo.getStartTime(), DateUtil.DATE_FORMATE_STRING_A));
+        feeMap.put("endTime", DateUtil.getFormatTimeString(new Date(), DateUtil.DATE_FORMATE_STRING_A));
+        feeMap.put("total", paramInJson.getString("receivableAmount"));
+        businessFee.putAll(feeMap);
+        business.getJSONObject(CommonConstant.HTTP_BUSINESS_DATAS).put("businessFee", businessFee);
+
+        return business;
+    }
+
+    /**
+     * 数据校验
+     *
+     * @param paramIn "communityId": "7020181217000001",
+     *                "memberId": "3456789",
+     *                "memberTypeCd": "390001200001"
+     */
+    private void validate(String paramIn) {
+        Assert.jsonObjectHaveKey(paramIn, "communityId", "请求报文中未包含communityId节点");
+        Assert.jsonObjectHaveKey(paramIn, "receivedAmount", "请求报文中未包含receivedAmount节点");
+        Assert.jsonObjectHaveKey(paramIn, "feeId", "请求报文中未包含feeId节点");
+
+        JSONObject paramInObj = JSONObject.parseObject(paramIn);
+        Assert.hasLength(paramInObj.getString("communityId"), "小区ID不能为空");
+        Assert.hasLength(paramInObj.getString("receivedAmount"), "实收金额不能为空");
+        Assert.hasLength(paramInObj.getString("feeId"), "费用ID不能为空");
+
+    }
+
+    @Override
+    public int getOrder() {
+        return DEFAULT_ORDER;
+    }
+
+
+    public IFeeInnerServiceSMO getFeeInnerServiceSMOImpl() {
+        return feeInnerServiceSMOImpl;
+    }
+
+    public void setFeeInnerServiceSMOImpl(IFeeInnerServiceSMO feeInnerServiceSMOImpl) {
+        this.feeInnerServiceSMOImpl = feeInnerServiceSMOImpl;
+    }
+
+    public IFeeConfigInnerServiceSMO getFeeConfigInnerServiceSMOImpl() {
+        return feeConfigInnerServiceSMOImpl;
+    }
+
+    public void setFeeConfigInnerServiceSMOImpl(IFeeConfigInnerServiceSMO feeConfigInnerServiceSMOImpl) {
+        this.feeConfigInnerServiceSMOImpl = feeConfigInnerServiceSMOImpl;
+    }
+
+    public IRoomInnerServiceSMO getRoomInnerServiceSMOImpl() {
+        return roomInnerServiceSMOImpl;
+    }
+
+    public void setRoomInnerServiceSMOImpl(IRoomInnerServiceSMO roomInnerServiceSMOImpl) {
+        this.roomInnerServiceSMOImpl = roomInnerServiceSMOImpl;
+    }
+}

+ 20 - 0
AppFrontService/src/main/java/com/java110/app/controller/PaymentController.java

@@ -3,6 +3,7 @@ package com.java110.app.controller;
 import com.java110.app.smo.complaint.ISaveComplaintSMO;
 import com.java110.app.smo.payment.IToNotifySMO;
 import com.java110.app.smo.payment.IToPaySMO;
+import com.java110.app.smo.payment.IToPayTempCarInoutSMO;
 import com.java110.core.base.controller.BaseController;
 import com.java110.core.context.IPageData;
 import com.java110.core.context.PageData;
@@ -33,6 +34,9 @@ public class PaymentController extends BaseController {
     @Autowired
     private IToPaySMO toPaySMOImpl;
 
+    @Autowired
+    private IToPayTempCarInoutSMO toPayTempCarInoutSMOImpl;
+
     @Autowired
     private IToNotifySMO toNotifySMOImpl;
 
@@ -52,6 +56,22 @@ public class PaymentController extends BaseController {
         return toPaySMOImpl.toPay(newPd);
     }
 
+    /**
+     * <p>统一下单入口</p>
+     *
+     * @param request
+     * @throws Exception
+     */
+    @RequestMapping(path = "/toPayTempCarInout", method = RequestMethod.POST)
+    public ResponseEntity<String> toPayTempCarInout(@RequestBody String postInfo, HttpServletRequest request) {
+        IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);
+        /*IPageData pd = (IPageData) request.getAttribute(CommonConstant.CONTEXT_PAGE_DATA);*/
+        IPageData newPd = PageData.newInstance().builder(pd.getUserId(), pd.getUserName(), pd.getToken(), postInfo,
+                "", "", "", pd.getSessionId(),
+                request.getHeader("APP_ID"));
+        return toPayTempCarInoutSMOImpl.toPay(newPd);
+    }
+
 
     /**
      * <p>支付回调Api</p>

+ 83 - 3
AppFrontService/src/main/java/com/java110/app/smo/AppAbstractComponentSMO.java

@@ -1,21 +1,32 @@
 package com.java110.app.smo;
 
-import com.java110.core.base.smo.BaseServiceSMO;
+import com.java110.app.properties.WechatAuthProperties;
 import com.java110.core.component.AbstractComponentSMO;
 import com.java110.core.context.IPageData;
 import com.java110.utils.constant.CommonConstant;
 import com.java110.utils.util.Assert;
+import com.java110.utils.util.PayUtil;
 import com.java110.utils.util.StringUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.http.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpEntity;
+import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
 import org.springframework.web.client.HttpStatusCodeException;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
 public abstract class AppAbstractComponentSMO extends AbstractComponentSMO {
 
     private static final Logger logger = LoggerFactory.getLogger(AppAbstractComponentSMO.class);
-
+    @Autowired
+    private WechatAuthProperties wechatAuthProperties;
 
     /**
      * 调用中心服务
@@ -48,4 +59,73 @@ public abstract class AppAbstractComponentSMO extends AbstractComponentSMO {
 
     }
 
+    /**
+     * 预下单
+     *
+     * @param orderNum
+     * @param money
+     * @param openId
+     * @return
+     * @throws Exception
+     */
+    protected Map<String, String> java110Payment(RestTemplate restTemplate,String feeName, String orderNum, double money, String openId) throws Exception {
+        logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
+        SortedMap<String, String> resultMap = new TreeMap<String, String>();
+//生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
+
+        double payAmount = PayUtil.getPayAmountByEnv("DEV", money);
+//添加或更新支付记录(参数跟进自己业务需求添加)
+
+        Map<String, String> resMap = this.java110UnifieldOrder(restTemplate,feeName, orderNum, wechatAuthProperties.TRADE_TYPE_JSAPI, payAmount, openId);
+        if ("SUCCESS".equals(resMap.get("return_code")) && "SUCCESS".equals(resMap.get("result_code"))) {
+            resultMap.put("appId", wechatAuthProperties.getAppId());
+            resultMap.put("timeStamp", PayUtil.getCurrentTimeStamp());
+            resultMap.put("nonceStr", PayUtil.makeUUID(32));
+            resultMap.put("package", "prepay_id=" + resMap.get("prepay_id"));
+            resultMap.put("signType", "MD5");
+            resultMap.put("sign", PayUtil.createSign(resultMap, wechatAuthProperties.getKey()));
+            resultMap.put("code", "0");
+            resultMap.put("msg", "下单成功");
+            logger.info("【小程序支付】统一下单成功,返回参数:" + resultMap);
+        } else {
+            resultMap.put("code", resMap.get("return_code"));
+            resultMap.put("msg", resMap.get("return_msg"));
+            logger.info("【小程序支付】统一下单失败,失败原因:" + resMap.get("return_msg"));
+        }
+        return resultMap;
+    }
+
+    /**
+     * 小程序支付统一下单
+     */
+    private Map<String, String> java110UnifieldOrder(RestTemplate restTemplate, String feeName, String orderNum, String tradeType, double payAmount, String openid) throws Exception {
+//封装参数
+        SortedMap<String, String> paramMap = new TreeMap<String, String>();
+        paramMap.put("appid", wechatAuthProperties.getAppId());
+        paramMap.put("mch_id", wechatAuthProperties.getMchId());
+        paramMap.put("nonce_str", PayUtil.makeUUID(32));
+        paramMap.put("body", "HC智慧家园-" + feeName);
+        paramMap.put("out_trade_no", orderNum);
+        paramMap.put("total_fee", PayUtil.moneyToIntegerStr(payAmount));
+        paramMap.put("spbill_create_ip", PayUtil.getLocalIp());
+        paramMap.put("notify_url", wechatAuthProperties.getWxNotifyUrl());
+        paramMap.put("trade_type", tradeType);
+        paramMap.put("openid", openid);
+        paramMap.put("sign", PayUtil.createSign(paramMap, wechatAuthProperties.getKey()));
+//转换为xml
+        String xmlData = PayUtil.mapToXml(paramMap);
+
+        logger.debug("调用支付统一下单接口" + xmlData);
+
+        ResponseEntity<String> responseEntity = restTemplate.postForEntity(
+                wechatAuthProperties.getWxPayUnifiedOrder(), xmlData, String.class);
+
+        logger.debug("统一下单返回" + responseEntity);
+//请求微信后台,获取预支付ID
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("支付失败" + responseEntity.getBody());
+        }
+        return PayUtil.xmlStrToMap(responseEntity.getBody());
+    }
+
 }

+ 17 - 0
AppFrontService/src/main/java/com/java110/app/smo/payment/IToPayTempCarInoutSMO.java

@@ -0,0 +1,17 @@
+package com.java110.app.smo.payment;
+
+import com.java110.core.context.IPageData;
+import org.springframework.http.ResponseEntity;
+
+/**
+ * 统一下单接口类
+ */
+public interface IToPayTempCarInoutSMO {
+
+    /**
+     * 下单
+     * @param pd
+     * @return
+     */
+    public ResponseEntity<String> toPay(IPageData pd);
+}

+ 1 - 1
AppFrontService/src/main/java/com/java110/app/smo/payment/impl/ToNotifySMOImpl.java

@@ -40,7 +40,7 @@ public class ToNotifySMOImpl implements IToNotifySMO {
     private WechatAuthProperties wechatAuthProperties;
 
     @Override
-    public ResponseEntity<String> toNotify(String param,HttpServletRequest request) {
+    public ResponseEntity<String> toNotify(String param, HttpServletRequest request) {
         String resXml = "";
         ResponseEntity responseEntity = null;
         try {

+ 60 - 60
AppFrontService/src/main/java/com/java110/app/smo/payment/impl/ToPaySMOImpl.java

@@ -87,7 +87,7 @@ public class ToPaySMOImpl extends AppAbstractComponentSMO implements IToPaySMO {
         String openId = realUserInfo.getString("openId");
 
         //微信下单PayUtil
-        Map result = java110Payment(paramIn.getString("feeName"), orderId, money, openId);
+        Map result = super.java110Payment(restTemplate,paramIn.getString("feeName"), orderId, money, openId);
         responseEntity = new ResponseEntity(JSONObject.toJSONString(result), HttpStatus.OK);
 
         return responseEntity;
@@ -103,63 +103,63 @@ public class ToPaySMOImpl extends AppAbstractComponentSMO implements IToPaySMO {
      * @return
      * @throws Exception
      */
-    private Map<String, String> java110Payment(String feeName, String orderNum, double money, String openId) throws Exception {
-        logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
-        SortedMap<String, String> resultMap = new TreeMap<String, String>();
-//生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
-
-        double payAmount = PayUtil.getPayAmountByEnv("DEV", money);
-//添加或更新支付记录(参数跟进自己业务需求添加)
-
-        Map<String, String> resMap = this.java110UnifieldOrder(feeName, orderNum, wechatAuthProperties.TRADE_TYPE_JSAPI, payAmount, openId);
-        if ("SUCCESS".equals(resMap.get("return_code")) && "SUCCESS".equals(resMap.get("result_code"))) {
-            resultMap.put("appId", wechatAuthProperties.getAppId());
-            resultMap.put("timeStamp", PayUtil.getCurrentTimeStamp());
-            resultMap.put("nonceStr", PayUtil.makeUUID(32));
-            resultMap.put("package", "prepay_id=" + resMap.get("prepay_id"));
-            resultMap.put("signType", "MD5");
-            resultMap.put("sign", PayUtil.createSign(resultMap, wechatAuthProperties.getKey()));
-            resultMap.put("code", "0");
-            resultMap.put("msg", "下单成功");
-            logger.info("【小程序支付】统一下单成功,返回参数:" + resultMap);
-        } else {
-            resultMap.put("code", resMap.get("return_code"));
-            resultMap.put("msg", resMap.get("return_msg"));
-            logger.info("【小程序支付】统一下单失败,失败原因:" + resMap.get("return_msg"));
-        }
-        return resultMap;
-    }
-
-    /**
-     * 小程序支付统一下单
-     */
-    private Map<String, String> java110UnifieldOrder(String feeName, String orderNum, String tradeType, double payAmount, String openid) throws Exception {
-//封装参数
-        SortedMap<String, String> paramMap = new TreeMap<String, String>();
-        paramMap.put("appid", wechatAuthProperties.getAppId());
-        paramMap.put("mch_id", wechatAuthProperties.getMchId());
-        paramMap.put("nonce_str", PayUtil.makeUUID(32));
-        paramMap.put("body", "HC智慧家园-" + feeName);
-        paramMap.put("out_trade_no", orderNum);
-        paramMap.put("total_fee", PayUtil.moneyToIntegerStr(payAmount));
-        paramMap.put("spbill_create_ip", PayUtil.getLocalIp());
-        paramMap.put("notify_url", wechatAuthProperties.getWxNotifyUrl());
-        paramMap.put("trade_type", tradeType);
-        paramMap.put("openid", openid);
-        paramMap.put("sign", PayUtil.createSign(paramMap, wechatAuthProperties.getKey()));
-//转换为xml
-        String xmlData = PayUtil.mapToXml(paramMap);
-
-        logger.debug("调用支付统一下单接口" + xmlData);
-
-        ResponseEntity<String> responseEntity = restTemplate.postForEntity(
-                wechatAuthProperties.getWxPayUnifiedOrder(), xmlData, String.class);
-
-        logger.debug("统一下单返回" + responseEntity);
-//请求微信后台,获取预支付ID
-        if (responseEntity.getStatusCode() != HttpStatus.OK) {
-            throw new IllegalArgumentException("支付失败" + responseEntity.getBody());
-        }
-        return PayUtil.xmlStrToMap(responseEntity.getBody());
-    }
+//    private Map<String, String> java110Payment(String feeName, String orderNum, double money, String openId) throws Exception {
+//        logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
+//        SortedMap<String, String> resultMap = new TreeMap<String, String>();
+////生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
+//
+//        double payAmount = PayUtil.getPayAmountByEnv("DEV", money);
+////添加或更新支付记录(参数跟进自己业务需求添加)
+//
+//        Map<String, String> resMap = this.java110UnifieldOrder(feeName, orderNum, wechatAuthProperties.TRADE_TYPE_JSAPI, payAmount, openId);
+//        if ("SUCCESS".equals(resMap.get("return_code")) && "SUCCESS".equals(resMap.get("result_code"))) {
+//            resultMap.put("appId", wechatAuthProperties.getAppId());
+//            resultMap.put("timeStamp", PayUtil.getCurrentTimeStamp());
+//            resultMap.put("nonceStr", PayUtil.makeUUID(32));
+//            resultMap.put("package", "prepay_id=" + resMap.get("prepay_id"));
+//            resultMap.put("signType", "MD5");
+//            resultMap.put("sign", PayUtil.createSign(resultMap, wechatAuthProperties.getKey()));
+//            resultMap.put("code", "0");
+//            resultMap.put("msg", "下单成功");
+//            logger.info("【小程序支付】统一下单成功,返回参数:" + resultMap);
+//        } else {
+//            resultMap.put("code", resMap.get("return_code"));
+//            resultMap.put("msg", resMap.get("return_msg"));
+//            logger.info("【小程序支付】统一下单失败,失败原因:" + resMap.get("return_msg"));
+//        }
+//        return resultMap;
+//    }
+//
+//    /**
+//     * 小程序支付统一下单
+//     */
+//    private Map<String, String> java110UnifieldOrder(String feeName, String orderNum, String tradeType, double payAmount, String openid) throws Exception {
+////封装参数
+//        SortedMap<String, String> paramMap = new TreeMap<String, String>();
+//        paramMap.put("appid", wechatAuthProperties.getAppId());
+//        paramMap.put("mch_id", wechatAuthProperties.getMchId());
+//        paramMap.put("nonce_str", PayUtil.makeUUID(32));
+//        paramMap.put("body", "HC智慧家园-" + feeName);
+//        paramMap.put("out_trade_no", orderNum);
+//        paramMap.put("total_fee", PayUtil.moneyToIntegerStr(payAmount));
+//        paramMap.put("spbill_create_ip", PayUtil.getLocalIp());
+//        paramMap.put("notify_url", wechatAuthProperties.getWxNotifyUrl());
+//        paramMap.put("trade_type", tradeType);
+//        paramMap.put("openid", openid);
+//        paramMap.put("sign", PayUtil.createSign(paramMap, wechatAuthProperties.getKey()));
+////转换为xml
+//        String xmlData = PayUtil.mapToXml(paramMap);
+//
+//        logger.debug("调用支付统一下单接口" + xmlData);
+//
+//        ResponseEntity<String> responseEntity = restTemplate.postForEntity(
+//                wechatAuthProperties.getWxPayUnifiedOrder(), xmlData, String.class);
+//
+//        logger.debug("统一下单返回" + responseEntity);
+////请求微信后台,获取预支付ID
+//        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+//            throw new IllegalArgumentException("支付失败" + responseEntity.getBody());
+//        }
+//        return PayUtil.xmlStrToMap(responseEntity.getBody());
+//    }
 }

+ 94 - 0
AppFrontService/src/main/java/com/java110/app/smo/payment/impl/ToPayTempCarInoutSMOImpl.java

@@ -0,0 +1,94 @@
+package com.java110.app.smo.payment.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.java110.app.properties.WechatAuthProperties;
+import com.java110.app.smo.AppAbstractComponentSMO;
+import com.java110.app.smo.payment.IToPaySMO;
+import com.java110.app.smo.payment.IToPayTempCarInoutSMO;
+import com.java110.core.context.IPageData;
+import com.java110.utils.constant.ServiceConstant;
+import com.java110.utils.util.Assert;
+import com.java110.utils.util.PayUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+@Service("toPayTempCarInoutSMOImpl")
+public class ToPayTempCarInoutSMOImpl extends AppAbstractComponentSMO implements IToPayTempCarInoutSMO {
+    private static final Logger logger = LoggerFactory.getLogger(ToPayTempCarInoutSMOImpl.class);
+
+
+    @Autowired
+    private RestTemplate restTemplate;
+
+
+
+    @Override
+    public ResponseEntity<String> toPay(IPageData pd) {
+        return super.businessProcess(pd);
+    }
+
+    @Override
+    protected void validate(IPageData pd, JSONObject paramIn) {
+
+        Assert.jsonObjectHaveKey(paramIn, "communityId", "请求报文中未包含communityId节点");
+        Assert.jsonObjectHaveKey(paramIn, "receivedAmount", "请求报文中未包含receivedAmount节点");
+        Assert.jsonObjectHaveKey(paramIn, "feeId", "请求报文中未包含feeId节点");
+        Assert.jsonObjectHaveKey(paramIn, "feeName", "请求报文中未包含feeName节点");
+
+    }
+
+    @Override
+    protected ResponseEntity<String> doBusinessProcess(IPageData pd, JSONObject paramIn) throws Exception {
+
+        ResponseEntity responseEntity = null;
+        //查询用户ID
+        paramIn.put("userId", pd.getUserId());
+        String url = ServiceConstant.SERVICE_API_URL + "/api/fee.payFeePreTempCarInout";
+        responseEntity = super.callCenterService(restTemplate, pd, paramIn.toJSONString(), url, HttpMethod.POST);
+
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            return responseEntity;
+        }
+        JSONObject orderInfo = JSONObject.parseObject(responseEntity.getBody().toString());
+        String orderId = orderInfo.getString("oId");
+        double money = Double.parseDouble(orderInfo.getString("receivableAmount"));
+        Map tmpParamIn = new HashMap();
+        tmpParamIn.put("userId", pd.getUserId());
+        responseEntity = super.getUserAndAttr(pd, restTemplate, tmpParamIn);
+        logger.debug("查询用户信息返回报文:" + responseEntity);
+        if (responseEntity.getStatusCode() != HttpStatus.OK) {
+            throw new IllegalArgumentException("未查询用户信息异常" + tmpParamIn);
+        }
+
+        JSONObject userResult = JSONObject.parseObject(responseEntity.getBody().toString());
+        int total = userResult.getIntValue("total");
+        if (total < 1) {
+            //未查询到用户信息
+            throw new IllegalArgumentException("未查询微信用户");
+        }
+
+        JSONObject realUserInfo = userResult.getJSONArray("users").getJSONObject(0);
+
+        String openId = realUserInfo.getString("openId");
+
+        //微信下单PayUtil
+        Map result = super.java110Payment(restTemplate,paramIn.getString("feeName"), orderId, money, openId);
+        responseEntity = new ResponseEntity(JSONObject.toJSONString(result), HttpStatus.OK);
+
+        return responseEntity;
+    }
+
+
+
+}

+ 4 - 0
java110-utils/src/main/java/com/java110/utils/constant/ServiceCodeConstant.java

@@ -499,6 +499,10 @@ public class ServiceCodeConstant {
 
     //预交费
     public static final String SERVICE_CODE_PAY_FEE_PRE = "fee.payFeePre";
+    /**
+     * 临时停车费
+     */
+    public static final String SERVICE_CODE_PAY_FEE_PRE_TEMP_CAR_INOUT = "fee.payFeePreTempCarInout";
 
     //交费通知
     public static final String SERVICE_CODE_PAY_CONFIRM_PRE = "fee.payFeeConfirm";