fllmoyu преди 4 години
родител
ревизия
d96896c0f9
променени са 27 файла, в които са добавени 1095 реда и са изтрити 31 реда
  1. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/dao/MergeOrderInfoDAO.java
  2. 4 0
      common/src/main/java/com/jpsoft/bus/modules/base/dao/OrderInfoDAO.java
  3. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/dao/PaymentInfoDAO.java
  4. 1 1
      common/src/main/java/com/jpsoft/bus/modules/base/entity/MergeOrderInfo.java
  5. 4 4
      common/src/main/java/com/jpsoft/bus/modules/base/entity/OrderInfo.java
  6. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/MergeOrderInfoService.java
  7. 4 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/OrderInfoService.java
  8. 2 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/PaymentInfoService.java
  9. 11 6
      common/src/main/java/com/jpsoft/bus/modules/base/service/impl/MergeOrderInfoServiceImpl.java
  10. 10 0
      common/src/main/java/com/jpsoft/bus/modules/base/service/impl/OrderInfoServiceImpl.java
  11. 11 6
      common/src/main/java/com/jpsoft/bus/modules/base/service/impl/PaymentInfoServiceImpl.java
  12. 21 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dto/DriverBuyTicketDTO.java
  13. 20 0
      common/src/main/java/com/jpsoft/bus/modules/bus/dto/VehicleStationDTO.java
  14. 4 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/PassengerInfoService.java
  15. 105 0
      common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PassengerInfoServiceImpl.java
  16. 10 0
      common/src/main/java/com/jpsoft/bus/modules/pay/service/AlipayService.java
  17. 10 0
      common/src/main/java/com/jpsoft/bus/modules/pay/service/WechatService.java
  18. 100 0
      common/src/main/java/com/jpsoft/bus/modules/pay/service/impl/AlipayServiceImpl.java
  19. 112 0
      common/src/main/java/com/jpsoft/bus/modules/pay/service/impl/WechatServiceImpl.java
  20. 10 2
      common/src/main/resources/mapper/base/MergeOrderInfo.xml
  21. 16 0
      common/src/main/resources/mapper/base/OrderInfo.xml
  22. 9 0
      common/src/main/resources/mapper/base/PaymentInfo.xml
  23. 4 0
      web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java
  24. 166 7
      web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java
  25. 3 5
      web/src/main/java/com/jpsoft/bus/modules/mobile/controller/PassengerApiController.java
  26. 211 0
      web/src/main/java/com/jpsoft/bus/modules/pay/alipay/AlipayController.java
  27. 241 0
      web/src/main/java/com/jpsoft/bus/modules/pay/wechat/WxPayController.java

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dao/MergeOrderInfoDAO.java

@@ -15,4 +15,6 @@ public interface MergeOrderInfoDAO {
 	int delete(String id);
 	List<MergeOrderInfo> list();
 	List<MergeOrderInfo> search(Map<String,Object> searchParams,List<Sort> sortList);
+
+    MergeOrderInfo findByOutOrderNo(String outOrderNo);
 }

+ 4 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dao/OrderInfoDAO.java

@@ -17,4 +17,8 @@ public interface OrderInfoDAO {
 	List<OrderInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
 
     List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus);
+
+    OrderInfo findByOutOrderNo(String outTradeNo);
+
+	List<OrderInfo> findByMergeOrderId(String mergeOrderId);
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/dao/PaymentInfoDAO.java

@@ -15,4 +15,6 @@ public interface PaymentInfoDAO {
 	int delete(String id);
 	List<PaymentInfo> list();
 	List<PaymentInfo> search(Map<String, Object> searchParams, List<Sort> sortList);
+
+    PaymentInfo findByCompanyId(String companyId);
 }

+ 1 - 1
common/src/main/java/com/jpsoft/bus/modules/base/entity/MergeOrderInfo.java

@@ -43,5 +43,5 @@ public class MergeOrderInfo {
 	    @ApiModelProperty(value = "更新时间")
     private Date updateTime;
         @ApiModelProperty(value = "是否删除")
-    private Boolean delFlag;
+    private Boolean delFlag = false;
 }

+ 4 - 4
common/src/main/java/com/jpsoft/bus/modules/base/entity/OrderInfo.java

@@ -21,7 +21,7 @@ public class OrderInfo {
     @ApiModelProperty(value = "")
     private String id;
     @ApiModelProperty(value = "账单金额")
-    private BigDecimal totalFee;
+    private BigDecimal totalFee = BigDecimal.ZERO;
     @ApiModelProperty(value = "商品描述")
     private String body;
     @ApiModelProperty(value = "支付状态(10:未支付,15:部分支付,20:支付完成,30:关闭,40:全额退款,45:部分退款)")
@@ -29,9 +29,9 @@ public class OrderInfo {
     @ApiModelProperty(value = "支付方式(wechat:微信,alipay:支付宝,cash:现金,ticket:车票)")
     private String payName;
     @ApiModelProperty(value = "支付金额")
-    private BigDecimal payFee;
+    private BigDecimal payFee = BigDecimal.ZERO;
     @ApiModelProperty(value = "退款金额")
-    private BigDecimal refundFee;
+    private BigDecimal refundFee = BigDecimal.ZERO;
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm", timezone = "GMT+8")
     @ApiModelProperty(value = "支付时间")
@@ -57,7 +57,7 @@ public class OrderInfo {
     @ApiModelProperty(value = "更新时间")
     private Date updateTime;
     @ApiModelProperty(value = "是否删除")
-    private Boolean delFlag;
+    private Boolean delFlag =false;
     @ApiModelProperty(value = "乘客记录表")
     private String passengerId;
     @ApiModelProperty(value = "购票类型,1:儿童票,2:成人票")

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/MergeOrderInfoService.java

@@ -14,4 +14,6 @@ public interface MergeOrderInfoService {
 	int delete(String id);
 	List<MergeOrderInfo> list();
 	Page<MergeOrderInfo> pageSearch(Map<String, Object> searchParams,int pageNum,int pageSize,boolean count,List<Sort> sortList);
+
+    MergeOrderInfo findByOutOrderNo(String outOrderNo);
 }

+ 4 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/OrderInfoService.java

@@ -16,4 +16,8 @@ public interface OrderInfoService {
 	Page<OrderInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
 
     List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus);
+
+    OrderInfo findByOutOrderNo(String outTradeNo);
+
+	List<OrderInfo> findByMergeOrderId(String mergeOrderId);
 }

+ 2 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/PaymentInfoService.java

@@ -14,4 +14,6 @@ public interface PaymentInfoService {
 	int delete(String id);
 	List<PaymentInfo> list();
 	Page<PaymentInfo> pageSearch(Map<String, Object> searchParams, int pageNum, int pageSize, boolean count, List<Sort> sortList);
+
+    PaymentInfo findByCompanyId(String companyId);
 }

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/base/service/impl/MergeOrderInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class MergeOrderInfoServiceImpl implements MergeOrderInfoService {
 	public int insert(MergeOrderInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return mergeOrderInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(MergeOrderInfo model) {
 		// TODO Auto-generated method stub
-		return mergeOrderInfoDAO.update(model);		
+		return mergeOrderInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class MergeOrderInfoServiceImpl implements MergeOrderInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = mergeOrderInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<MergeOrderInfo> list() {
 		// TODO Auto-generated method stub
 		return mergeOrderInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<MergeOrderInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<MergeOrderInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             mergeOrderInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public MergeOrderInfo findByOutOrderNo(String outOrderNo) {
+		return mergeOrderInfoDAO.findByOutOrderNo(outOrderNo);
+	}
 }

+ 10 - 0
common/src/main/java/com/jpsoft/bus/modules/base/service/impl/OrderInfoServiceImpl.java

@@ -72,4 +72,14 @@ public class OrderInfoServiceImpl implements OrderInfoService {
 	public List<OrderInfo> findByPassengerIdAndPayStatus(String passengerId,Integer payStatus) {
 		return orderInfoDAO.findByPassengerIdAndPayStatus(passengerId,payStatus);
 	}
+
+	@Override
+	public OrderInfo findByOutOrderNo(String outTradeNo) {
+		return orderInfoDAO.findByOutOrderNo(outTradeNo);
+	}
+
+	@Override
+	public List<OrderInfo> findByMergeOrderId(String mergeOrderId) {
+		return orderInfoDAO.findByMergeOrderId(mergeOrderId);
+	}
 }

+ 11 - 6
common/src/main/java/com/jpsoft/bus/modules/base/service/impl/PaymentInfoServiceImpl.java

@@ -29,14 +29,14 @@ public class PaymentInfoServiceImpl implements PaymentInfoService {
 	public int insert(PaymentInfo model) {
 		// TODO Auto-generated method stub
 		//model.setId(UUID.randomUUID().toString());
-		
+
 		return paymentInfoDAO.insert(model);
 	}
 
 	@Override
 	public int update(PaymentInfo model) {
 		// TODO Auto-generated method stub
-		return paymentInfoDAO.update(model);		
+		return paymentInfoDAO.update(model);
 	}
 
 	@Override
@@ -49,22 +49,27 @@ public class PaymentInfoServiceImpl implements PaymentInfoService {
 	public boolean exist(String id) {
 		// TODO Auto-generated method stub
 		int count = paymentInfoDAO.exist(id);
-		
+
 		return count > 0 ? true : false;
 	}
-	
+
 	@Override
 	public List<PaymentInfo> list() {
 		// TODO Auto-generated method stub
 		return paymentInfoDAO.list();
 	}
-		
+
 	@Override
 	public Page<PaymentInfo> pageSearch(Map<String, Object> searchParams, int pageNumber, int pageSize,boolean count,List<Sort> sortList) {
         Page<PaymentInfo> page = PageHelper.startPage(pageNumber,pageSize,count).doSelectPage(()->{
             paymentInfoDAO.search(searchParams,sortList);
         });
-        
+
         return page;
 	}
+
+	@Override
+	public PaymentInfo findByCompanyId(String companyId) {
+		return paymentInfoDAO.findByCompanyId(companyId);
+	}
 }

+ 21 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dto/DriverBuyTicketDTO.java

@@ -0,0 +1,21 @@
+package com.jpsoft.bus.modules.bus.dto;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 11:31
+ */
+@Data
+public class DriverBuyTicketDTO {
+
+    private String payName;
+
+    private String payNameStr;
+
+    private String url;
+
+    private BigDecimal totalFee;
+}

+ 20 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dto/VehicleStationDTO.java

@@ -0,0 +1,20 @@
+package com.jpsoft.bus.modules.bus.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 16:21
+ */
+@Data
+public class VehicleStationDTO {
+
+    private String id;
+
+    @ApiModelProperty(value = "车辆与当前站点的关系,1:过站,2:当前站,3:未到站")
+    private String status;
+
+    private String stationName;
+
+}

+ 4 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/PassengerInfoService.java

@@ -2,6 +2,8 @@ package com.jpsoft.bus.modules.bus.service;
 
 import java.util.List;
 import java.util.Map;
+
+import com.jpsoft.bus.modules.bus.dto.DriverBuyTicketDTO;
 import com.jpsoft.bus.modules.bus.entity.PassengerInfo;
 import com.github.pagehelper.Page;
 import com.jpsoft.bus.modules.bus.entity.ShiftInfo;
@@ -20,4 +22,6 @@ public interface PassengerInfoService {
 	List<PassengerInfo> findByPersonIdShiftIdStatus(Long personId,String shiftId,String status);
 
     void passengerFace(VehicleInfo vehicleInfo, ShiftInfo shiftInfo, String retFileUrl, String recordTime, String stationId,String personId) throws Exception;
+
+	DriverBuyTicketDTO driverBuyTicket(PassengerInfo passengerInfo, String ticketUpStationId, String ticketDownStationId, String ticketType, String goodsTicket, String totalFee, String payName,String paymentId) throws Exception;
 }

+ 105 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/service/impl/PassengerInfoServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jpsoft.bus.modules.bus.service.impl;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -8,10 +9,18 @@ import javax.annotation.Resource;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.StrUtil;
+import com.google.common.collect.Ordering;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.bus.dto.DriverBuyTicketDTO;
 import com.jpsoft.bus.modules.bus.entity.ShiftInfo;
 import com.jpsoft.bus.modules.bus.entity.VehicleInfo;
 import com.jpsoft.bus.modules.bus.service.BaiduService;
 import com.jpsoft.bus.modules.common.utils.CommonUtil;
+import com.jpsoft.bus.modules.pay.service.AlipayService;
+import com.jpsoft.bus.modules.pay.service.WechatService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -29,6 +38,18 @@ public class PassengerInfoServiceImpl implements PassengerInfoService {
     @Resource(name = "passengerInfoDAO")
     private PassengerInfoDAO passengerInfoDAO;
 
+    @Autowired
+	private MergeOrderInfoService mergeOrderInfoService;
+
+    @Autowired
+    private WechatService wechatService;
+
+    @Autowired
+    private AlipayService alipayService;
+
+    @Autowired
+	private OrderInfoService orderInfoService;
+
     @Autowired
     private BaiduService baiduService;
 
@@ -141,4 +162,88 @@ public class PassengerInfoServiceImpl implements PassengerInfoService {
 			}
         }
     }
+
+	@Override
+	public DriverBuyTicketDTO driverBuyTicket(PassengerInfo passengerInfo, String ticketUpStationId, String ticketDownStationId, String ticketType, String goodsTicket, String totalFee, String payName,String paymentId) throws Exception {
+
+        DriverBuyTicketDTO driverBuyTicketDTO = new DriverBuyTicketDTO();
+
+
+    	//乘客记录添加购票上车点和下车点
+		passengerInfo.setTicketUpStationId(ticketUpStationId);
+		passengerInfo.setTicketDownStationId(ticketDownStationId);
+		update(passengerInfo);
+
+
+
+		//根据支付方式创建订单
+		if ("cash".equals(payName) || "ticket".equals(payName)){
+			//创建综合账单
+			MergeOrderInfo mergeOrderInfo = new MergeOrderInfo();
+			mergeOrderInfo.setId(UUID.randomUUID().toString());
+			mergeOrderInfo.setPayStatus(20);
+			mergeOrderInfo.setOutOrderNo(com.jpsoft.bus.modules.common.utils.StringUtils.getOutTradeNo());
+			mergeOrderInfo.setPayName(payName);
+			mergeOrderInfo.setPaymentId(paymentId);
+			mergeOrderInfo.setCreateTime(new Date());
+			mergeOrderInfoService.insert(mergeOrderInfo);
+
+			OrderInfo orderInfo = new OrderInfo();
+			orderInfo.setId(UUID.randomUUID().toString());
+			orderInfo.setBody("买车票");
+			orderInfo.setTotalFee(new BigDecimal(totalFee));
+			orderInfo.setPayStatus(20);
+			orderInfo.setPayName(payName);
+			orderInfo.setPayFee(new BigDecimal(totalFee));
+			orderInfo.setPayTime(new Date());
+			orderInfo.setOutOrderNo(com.jpsoft.bus.modules.common.utils.StringUtils.getOutTradeNo());
+			orderInfo.setMergeOrderId(mergeOrderInfo.getId());
+			orderInfo.setTransactionId(orderInfo.getOutOrderNo());
+			orderInfo.setPassengerId(passengerInfo.getId());
+			orderInfo.setTicketType(ticketType);
+			orderInfo.setGoodsTicket(new BigDecimal(goodsTicket));
+
+			orderInfoService.insert(orderInfo);
+
+
+		}else {
+
+			//创建综合账单
+			MergeOrderInfo mergeOrderInfo = new MergeOrderInfo();
+			mergeOrderInfo.setId(UUID.randomUUID().toString());
+			mergeOrderInfo.setPayStatus(10);
+			mergeOrderInfo.setOutOrderNo(com.jpsoft.bus.modules.common.utils.StringUtils.getOutTradeNo());
+			mergeOrderInfo.setPaymentId(paymentId);
+			mergeOrderInfo.setCreateTime(new Date());
+			mergeOrderInfoService.insert(mergeOrderInfo);
+
+			OrderInfo orderInfo = new OrderInfo();
+			orderInfo.setId(UUID.randomUUID().toString());
+			orderInfo.setBody("买车票");
+			orderInfo.setTotalFee(new BigDecimal(totalFee));
+			orderInfo.setPayStatus(10);
+			orderInfo.setOutOrderNo(com.jpsoft.bus.modules.common.utils.StringUtils.getOutTradeNo());
+			orderInfo.setMergeOrderId(mergeOrderInfo.getId());
+			orderInfo.setPassengerId(passengerInfo.getId());
+			orderInfo.setTicketType(ticketType);
+			orderInfo.setGoodsTicket(new BigDecimal(goodsTicket));
+			orderInfo.setCreateTime(new Date());
+			orderInfoService.insert(orderInfo);
+
+			String codeUrl = "";
+			if ("wechat".equals(payName)){
+			     codeUrl = wechatService.wxNativePay(mergeOrderInfo.getId());
+			}
+			if ("alipay".equals(payName)){
+			    codeUrl = alipayService.tradePrecreatePay(mergeOrderInfo.getId());
+            }
+
+            driverBuyTicketDTO.setPayName(payName);
+			driverBuyTicketDTO.setTotalFee(orderInfo.getTotalFee());
+			driverBuyTicketDTO.setUrl(codeUrl);
+			driverBuyTicketDTO.setPayNameStr(orderInfo.getPayNameStr(payName));
+		}
+
+		return driverBuyTicketDTO;
+	}
 }

+ 10 - 0
common/src/main/java/com/jpsoft/bus/modules/pay/service/AlipayService.java

@@ -0,0 +1,10 @@
+package com.jpsoft.bus.modules.pay.service;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 14:51
+ */
+public interface AlipayService {
+
+    String tradePrecreatePay(String mergeOrderId) throws Exception;
+}

+ 10 - 0
common/src/main/java/com/jpsoft/bus/modules/pay/service/WechatService.java

@@ -0,0 +1,10 @@
+package com.jpsoft.bus.modules.pay.service;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 14:50
+ */
+public interface WechatService {
+
+    String wxNativePay(String mergeOrderId) throws Exception;
+}

+ 100 - 0
common/src/main/java/com/jpsoft/bus/modules/pay/service/impl/AlipayServiceImpl.java

@@ -0,0 +1,100 @@
+package com.jpsoft.bus.modules.pay.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.jpsoft.bus.config.AliPayConfig;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.entity.PaymentInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.base.service.PaymentInfoService;
+import com.jpsoft.bus.modules.pay.service.AlipayService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 14:51
+ */
+@Transactional
+@Component(value = "alipayService")
+public class AlipayServiceImpl implements AlipayService {
+
+    @Autowired
+    private AliPayConfig aliPayConfig;
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+
+    @Autowired
+    private MergeOrderInfoService mergeOrderInfoService;
+
+
+    @Override
+    public String tradePrecreatePay(String mergeOrderId) throws Exception {
+
+        AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getServiceUrl(), aliPayConfig.getAppId(), aliPayConfig.getPrivateKey(), "json", aliPayConfig.getInputCharset(), aliPayConfig.getZfbPublicKey(), aliPayConfig.getSignType());
+        MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(mergeOrderId);
+
+        List<OrderInfo> orderInfoList = orderInfoService.findByMergeOrderId(mergeOrderId);
+        if (orderInfoList.size() == 0) {
+            throw new Exception("订单错误");
+        }
+        BigDecimal totalFee = BigDecimal.ZERO;
+        for (OrderInfo orderInfo : orderInfoList) {
+            if (orderInfo.getPayStatus() != 10) {
+                throw new Exception("订单错误");
+            }
+            totalFee = totalFee.add(orderInfo.getTotalFee());
+        }
+
+
+        PaymentInfo paymentInfo = paymentInfoService.get(mergeOrderInfo.getPaymentId());
+        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
+        request.setNotifyUrl(paymentInfo.getAlipayNotifyUrl());
+
+
+        String appAuthToken = paymentInfo.getAppAuthToken();
+
+        Map<String, Object> maps = new HashMap<>();
+        maps.put("out_trade_no", mergeOrderInfo.getOutOrderNo());
+        maps.put("total_amount", String.valueOf(totalFee));
+        maps.put("subject", orderInfoList.get(0).getBody());
+        maps.put("timeout_express", "5m");
+
+        JSONObject extendParams = new JSONObject();
+
+        extendParams.put("sys_service_provider_id", paymentInfo.getMchId());
+        maps.put("extend_params", extendParams);
+        request.putOtherTextParam("app_auth_token", appAuthToken);
+        //把订单信息转换为json对象的字符串
+        String postdata = JSONObject.toJSONString(maps);
+        request.setBizContent(postdata);
+        AlipayTradePrecreateResponse response = alipayClient.execute(request);
+        String body = response.getBody();
+        JSONObject jsonObject = JSONObject.parseObject(body);
+        String alipayTradePrecreateResponse = jsonObject.getString("alipay_trade_precreate_response");
+        JSONObject jsonResponse = JSONObject.parseObject(alipayTradePrecreateResponse);
+
+        if (!jsonResponse.getString("code").equals("10000")) {
+            throw new Exception(jsonResponse.getString("sub_msg"));
+        }
+
+        String qr_code = jsonObject.getJSONObject("alipay_trade_precreate_response").getString("qr_code");
+
+        return qr_code;
+    }
+}

+ 112 - 0
common/src/main/java/com/jpsoft/bus/modules/pay/service/impl/WechatServiceImpl.java

@@ -0,0 +1,112 @@
+package com.jpsoft.bus.modules.pay.service.impl;
+
+import com.ijpay.core.enums.SignType;
+import com.ijpay.core.enums.TradeType;
+import com.ijpay.core.kit.WxPayKit;
+import com.ijpay.wxpay.WxPayApi;
+import com.ijpay.wxpay.model.UnifiedOrderModel;
+import com.jpsoft.bus.config.WxJpsoftConfig;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.entity.PaymentInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.base.service.PaymentInfoService;
+import com.jpsoft.bus.modules.pay.service.WechatService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2021-4-9 14:51
+ */
+@Transactional
+@Component(value = "wechatService")
+public class WechatServiceImpl implements WechatService {
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+
+    @Autowired
+    private MergeOrderInfoService mergeOrderInfoService;
+
+    @Autowired
+    private WxJpsoftConfig wxJpsoftConfig;
+
+
+    @Override
+    public String wxNativePay(String mergeOrderId) throws Exception {
+
+
+        if (StringUtils.isBlank(mergeOrderId)) {
+            throw new Exception("订单id为空");
+        }
+
+        MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(mergeOrderId);
+
+        List<OrderInfo> orderInfoList = orderInfoService.findByMergeOrderId(mergeOrderId);
+        if (orderInfoList.size() ==0){
+            throw new Exception("订单错误");
+        }
+        BigDecimal totalFee = BigDecimal.ZERO;
+        for (OrderInfo orderInfo : orderInfoList){
+            if (orderInfo.getPayStatus() != 10) {
+                throw new Exception("订单支付状态异常");
+            }
+            totalFee = totalFee.add(orderInfo.getTotalFee());
+        }
+
+
+
+        PaymentInfo paymentInfo = paymentInfoService.get(mergeOrderInfo.getPaymentId());
+
+        String subMchId = paymentInfo.getSubMchId();
+
+        //金额处理
+        int wxTotalTee = totalFee.multiply(new BigDecimal(100)).intValue();
+
+        Map<String, String> params = UnifiedOrderModel
+                .builder()
+                .appid(paymentInfo.getAppId())
+                .mch_id(paymentInfo.getMchId())
+                .sub_mch_id(subMchId)
+                .nonce_str(WxPayKit.generateStr())
+                .body(orderInfoList.get(0).getBody())
+                .out_trade_no(mergeOrderInfo.getOutOrderNo())
+                .total_fee(String.valueOf(wxTotalTee))
+                .spbill_create_ip(wxJpsoftConfig.getIp())
+                .notify_url(paymentInfo.getWechatNotifyUrl())
+                .trade_type(TradeType.NATIVE.getTradeType())
+                .build()
+                .createSign(wxJpsoftConfig.getMchKey(), SignType.HMACSHA256);
+
+        String xmlResult = WxPayApi.pushOrder(false, params);
+
+        Map<String, String> result = WxPayKit.xmlToMap(xmlResult);
+
+        String returnCode = result.get("return_code");
+        String returnMsg = result.get("return_msg");
+        System.out.println(returnMsg);
+        if (!WxPayKit.codeIsOk(returnCode)) {
+            throw new Exception(returnMsg);
+        }
+        String resultCode = result.get("result_code");
+        if (!WxPayKit.codeIsOk(resultCode)) {
+            throw new Exception(returnMsg);
+        }
+        //生成预付订单success
+        String qrCodeUrl = result.get("code_url");
+
+
+        return qrCodeUrl;
+    }
+}

+ 10 - 2
common/src/main/resources/mapper/base/MergeOrderInfo.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <!-- namespace必须指向DAO接口 -->
 <mapper namespace="com.jpsoft.bus.modules.base.dao.MergeOrderInfoDAO">
@@ -86,7 +86,7 @@
 	where id_=#{id}
 	</update>
 	<select id="get" parameterType="string" resultMap="MergeOrderInfoMap">
-		select 
+		select
 id_,open_id,pay_status,pay_name,out_order_no,transaction_id,payment_id,create_by,create_time,update_by,update_time,del_flag		from base_merge_order_info where id_=#{0}
 	</select>
 	<select id="exist" parameterType="string" resultType="int">
@@ -108,4 +108,12 @@ id_,open_id,pay_status,pay_name,out_order_no,transaction_id,payment_id,create_by
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByOutOrderNo" resultMap="MergeOrderInfoMap">
+		<![CDATA[
+		select * from base_merge_order_info
+		where del_flag = 0
+		and out_order_no = #{outOrderNo}
+		]]>
+	</select>
 </mapper>

+ 16 - 0
common/src/main/resources/mapper/base/OrderInfo.xml

@@ -180,4 +180,20 @@
 		and pay_status = #{payStatus}
 		]]>
 	</select>
+
+	<select id="findByOutOrderNo" resultMap="OrderInfoMap">
+		<![CDATA[
+		select * from base_order_info
+		where del_flag = 0
+		and out_order_no = #{outTradeNo}
+		]]>
+	</select>
+
+	<select id="findByMergeOrderId" resultMap="OrderInfoMap">
+		<![CDATA[
+		select * from base_order_info
+		where del_flag = 0
+		and merge_order_id = #{mergeOrderId}
+		]]>
+	</select>
 </mapper>

+ 9 - 0
common/src/main/resources/mapper/base/PaymentInfo.xml

@@ -127,4 +127,13 @@
 	        ${sort.name} ${sort.order}
 	 	</foreach>
 	</select>
+
+	<select id="findByCompanyId" resultMap="PaymentInfoMap">
+		<![CDATA[
+		select * from base_payment_info
+		where del_flag = 0
+		and company_id = #{companyId}
+		limit 1
+		]]>
+	</select>
 </mapper>

+ 4 - 0
web/src/main/java/com/jpsoft/bus/config/WebMvcConfig.java

@@ -60,6 +60,10 @@ public class WebMvcConfig implements WebMvcConfigurer {
 				.excludePathPatterns("/mobile/passengerApi/getShiftInfo")
 				.excludePathPatterns("/mobile/passengerApi/upload")
 				.excludePathPatterns("/wechat/findUserInfo/**")
+				.excludePathPatterns("/wechat/getConfig")
+				.excludePathPatterns("/mobile/passengerApi/upload")
+				.excludePathPatterns("/aliPay/**")
+				.excludePathPatterns("/wxPay/**")
 				;
 	}
 }

+ 166 - 7
web/src/main/java/com/jpsoft/bus/modules/driver/controller/DriverApiController.java

@@ -7,9 +7,13 @@ import com.github.pagehelper.Page;
 import com.jpsoft.bus.config.OSSConfig;
 import com.jpsoft.bus.modules.base.dto.PassengerOrderDTO;
 import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.entity.PaymentInfo;
 import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.base.service.PaymentInfoService;
+import com.jpsoft.bus.modules.bus.dto.DriverBuyTicketDTO;
 import com.jpsoft.bus.modules.bus.dto.PassengerDetailDTO;
 import com.jpsoft.bus.modules.bus.dto.StationStatusDTO;
+import com.jpsoft.bus.modules.bus.dto.VehicleStationDTO;
 import com.jpsoft.bus.modules.bus.entity.*;
 import com.jpsoft.bus.modules.bus.service.*;
 import com.jpsoft.bus.modules.common.dto.MessageResult;
@@ -18,10 +22,7 @@ import com.jpsoft.bus.modules.common.utils.CommonUtil;
 import com.jpsoft.bus.modules.common.utils.JwtUtil;
 import com.jpsoft.bus.modules.common.utils.OSSUtil;
 import com.jpsoft.bus.modules.common.utils.PojoUtils;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.bouncycastle.crypto.signers.ECDSASigner;
@@ -52,6 +53,9 @@ public class DriverApiController {
     @Autowired
     private OSSConfig ossConfig;
 
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+
     @Autowired
     private ShiftInfoService shiftInfoService;
 
@@ -636,18 +640,35 @@ public class DriverApiController {
             @ApiImplicitParam(name = "ticketDownStationId", value = "乘客买票下车站点id", required = true, paramType = "form"),
             @ApiImplicitParam(name = "ticketType", value = "购票类型(1:儿童票,2:成人票)", required = true, paramType = "form"),
             @ApiImplicitParam(name = "goodsTicket", value = "货票金额", required = true, paramType = "form"),
+            @ApiImplicitParam(name = "totalFee", value = "总金额", required = true, paramType = "form"),
             @ApiImplicitParam(name = "payName", value = "cash:现金,ticket:车票,wechat:微信,alipay:支付宝", required = true, paramType = "form"),
     })
-    public MessageResult<Map> driverCreateOrder(String id,String token, @RequestAttribute String subject) {
-        MessageResult<Map> messageResult = new MessageResult<>();
+    public MessageResult<DriverBuyTicketDTO> driverCreateOrder(String id,String ticketUpStationId,String ticketDownStationId,String ticketType,String goodsTicket,String totalFee,String payName,String token, @RequestAttribute String subject) {
+        MessageResult<DriverBuyTicketDTO> messageResult = new MessageResult<>();
 
         try {
 
+            VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
+            if (vehicleInfo == null){
+                throw new Exception("当前车辆不存在");
+            }
+
+            PaymentInfo paymentInfo = paymentInfoService.findByCompanyId(vehicleInfo.getCompanyId());
+            if (paymentInfo == null){
+                throw new Exception("车辆对应公司为配置收款账户");
+            }
 
+            List<ShiftInfo> shiftInfoList = shiftInfoService.findByVehicleIdAndStatus(vehicleInfo.getId(),"1");
+            if (shiftInfoList.size() == 0){
+                throw new Exception("车辆没有相关班次信息");
+            }
 
+            PassengerInfo passengerInfo = passengerInfoService.get(id);
 
 
+            DriverBuyTicketDTO driverBuyTicketDTO = passengerInfoService.driverBuyTicket(passengerInfo,ticketUpStationId,ticketDownStationId,ticketType,goodsTicket,totalFee,payName,paymentInfo.getId());
 
+            messageResult.setData(driverBuyTicketDTO);
             messageResult.setResult(true);
             messageResult.setCode(200);
         } catch (Exception ex) {
@@ -676,7 +697,10 @@ public class DriverApiController {
 
             PriceInfo priceInfo = priceInfoService.findByStartStationAndEndStation(ticketUpStationId,ticketDownStationId);
             if (priceInfo == null){
-                throw new Exception("站点间没有价格标准");
+                PriceInfo priceInfo1 = priceInfoService.findByStartStationAndEndStation(ticketDownStationId,ticketUpStationId);
+                if (priceInfo1 == null){
+                    throw new Exception("站点间无费用设置");
+                }
             }
 
             BigDecimal price = priceInfo.getPrice();
@@ -699,6 +723,141 @@ public class DriverApiController {
         return messageResult;
     }
 
+    @PostMapping("getPayType")
+    @ApiOperation(value = "获取可用支付方式")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "令牌", paramType = "form"),
+            @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form")
+    })
+    public MessageResult<Map> getPayType(String token, @RequestAttribute String subject) {
+        MessageResult<Map> messageResult = new MessageResult<>();
+
+        try {
+
+            VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
+            if (vehicleInfo == null){
+                throw new Exception("当前车辆不存在");
+            }
+
+            List<String> list = new ArrayList<>();
+            list.add("cash");
+            list.add("ticket");
+            PaymentInfo paymentInfo = paymentInfoService.findByCompanyId(vehicleInfo.getCompanyId());
+            if (paymentInfo != null){
+                if (StringUtils.isNotBlank(paymentInfo.getSubMchId())){
+                    list.add("wechat");
+                }
+                if (StringUtils.isNotBlank(paymentInfo.getAppAuthToken())){
+                    list.add("alipay");
+                }
+            }
+
+            Map<String,Object> map = new HashMap<>();
+            map.put("list",list);
+
+
+            messageResult.setData(map);
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+
+    @PostMapping("busShiftAllStation")
+    @ApiOperation(value = "车辆班次所有站点信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "token", value = "令牌", paramType = "form"),
+            @ApiImplicitParam(name = "subject", value = "目标(不传)", paramType = "form")
+    })
+    public MessageResult<List<VehicleStationDTO>> busShiftAllStation(String token, @RequestAttribute String subject) {
+        MessageResult<List<VehicleStationDTO>> messageResult = new MessageResult<>();
+
+        try {
+
+            VehicleInfo vehicleInfo = vehicleInfoService.get(subject);
+            if (vehicleInfo == null){
+                throw new Exception("当前车辆不存在");
+            }
+
+            List<ShiftInfo> shiftInfoList = shiftInfoService.findByVehicleIdAndStatus(vehicleInfo.getId(),"1");
+            if (shiftInfoList.size() == 0){
+                throw new Exception("车辆没有相关班次信息");
+            }
+
+            ShiftInfo shiftInfo = shiftInfoList.get(0);
+
+            List<StationInfo> stationInfoList = stationInfoService.findByRouteId(shiftInfo.getRouteId());
+
+            List<VehicleStationDTO> vehicleStationDTOList = new ArrayList<>();
+            if (stationInfoList.size()>0){
+                StationInfo currentStation = stationInfoService.get(shiftInfo.getCurrentStationId());
+
+                int size = stationInfoList.size();
+                Integer index = stationInfoList.indexOf(currentStation);
+                if (shiftInfo.getStartStationId().equals(stationInfoList.get(0).getId())){
+                    for (int n = 0;n<size;n++){
+                        StationInfo stationInfo = stationInfoList.get(n);
+                        VehicleStationDTO vehicleStationDTO = new VehicleStationDTO();
+                        vehicleStationDTO.setId(stationInfo.getId());
+                        vehicleStationDTO.setStationName(stationInfo.getName());
+                        if (n < index){
+                            vehicleStationDTO.setStatus("1");
+
+                        }
+                        if (n == index){
+                            vehicleStationDTO.setStatus("2");
+                        }
+                        if (n > index){
+                            vehicleStationDTO.setStatus("3");
+                        }
+                        vehicleStationDTOList.add(vehicleStationDTO);
+
+                    }
+                }
+                if (shiftInfo.getEndStationId().equals(stationInfoList.get(0).getId())){
+                    for (int n = size-1;n>=0;n--){
+                        StationInfo stationInfo = stationInfoList.get(n);
+                        VehicleStationDTO vehicleStationDTO = new VehicleStationDTO();
+                        vehicleStationDTO.setId(stationInfo.getId());
+                        vehicleStationDTO.setStationName(stationInfo.getName());
+                        if (n < index){
+                            vehicleStationDTO.setStatus("3");
+
+                        }
+                        if (n == index){
+                            vehicleStationDTO.setStatus("2");
+                        }
+                        if (n > index){
+                            vehicleStationDTO.setStatus("1");
+                        }
+                        vehicleStationDTOList.add(vehicleStationDTO);
+
+                    }
+                }
+
+            }
+
+
+            messageResult.setData(vehicleStationDTOList);
+            messageResult.setResult(true);
+            messageResult.setCode(200);
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+            messageResult.setResult(false);
+            messageResult.setMessage(ex.getMessage());
+        }
+
+        return messageResult;
+    }
+
+
+
 
 
 }

+ 3 - 5
web/src/main/java/com/jpsoft/bus/modules/mobile/controller/PassengerApiController.java

@@ -264,18 +264,16 @@ public class PassengerApiController {
     @ApiOperation(value = "人员照片上传")
     @ApiImplicitParams({
             @ApiImplicitParam(name = "photoName", value = "照片名称", required = true, paramType = "form"),
-            @ApiImplicitParam(name = "photoFile", value = "员工照片", required = true, paramType = "form", dataType = "__file"),
-            @ApiImplicitParam(name = "token", value = "令牌", required = false, paramType = "query"),
-            @ApiImplicitParam(name = "subject", value = "令牌", required = false, paramType = "query")
+            @ApiImplicitParam(name = "photoFile", value = "照片base64编码", required = true, paramType = "form"),
     })
     public MessageResult<String> upload(
-            String photoName, MultipartFile photoFile, String token, @RequestAttribute String subject) {
+            String photoName, String photoFile) {
         MessageResult<String> messageResult = new MessageResult<>();
 
         try {
 
 
-            String retFileUrl = OSSUtil.upload(ossConfig, "/faceImage", photoName, photoFile.getInputStream());
+            String retFileUrl = OSSUtil.uploadBase64(photoFile,photoName,ossConfig);
 
             messageResult.setResult(true);
             messageResult.setData(retFileUrl);

+ 211 - 0
web/src/main/java/com/jpsoft/bus/modules/pay/alipay/AlipayController.java

@@ -0,0 +1,211 @@
+package com.jpsoft.bus.modules.pay.alipay;
+
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.alipay.api.AlipayApiException;
+import com.alipay.api.AlipayClient;
+import com.alipay.api.DefaultAlipayClient;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipaySystemOauthTokenRequest;
+import com.alipay.api.request.AlipayTradeCreateRequest;
+import com.alipay.api.request.AlipayTradePrecreateRequest;
+import com.alipay.api.response.AlipaySystemOauthTokenResponse;
+import com.alipay.api.response.AlipayTradeCreateResponse;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.ijpay.alipay.AliPayApi;
+import com.jpsoft.bus.config.AliPayConfig;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.pay.service.AlipayService;
+import com.jpsoft.bus.modules.wechat.vo.UserInfo;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 9:48
+ */
+
+@Slf4j
+@RequestMapping("/aliPay")
+@RestController
+public class AlipayController {
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private AlipayService alipayService;
+
+    @Autowired
+    private MergeOrderInfoService mergeOrderInfoService;
+
+    @Autowired
+    private AliPayConfig aliPayConfig;
+
+
+
+    @RequestMapping(value="/payNotify")
+    public String payNotify(HttpServletRequest request) {
+        try {
+            // 获取支付宝POST过来反馈信息
+
+            Map<String, String> params = AliPayApi.toMap(request);
+
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                System.out.println(entry.getKey() + " = " + entry.getValue());
+            }
+
+            boolean verifyResult = AlipaySignature.rsaCheckV1(params, aliPayConfig.getZfbPublicKey(), "UTF-8", "RSA2");
+
+            if (verifyResult) {
+
+                String outOrderNo = params.get("out_trade_no");
+                MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.findByOutOrderNo(outOrderNo);
+
+                String payFee = params.get("total_amount");
+                if (mergeOrderInfo == null) {
+                    throw new Exception("支付已完成,但未找到此订单号的流水");
+                }
+
+                mergeOrderInfo.setPayStatus(20);
+                mergeOrderInfo.setPayName("alipay");
+                mergeOrderInfo.setTransactionId(params.get("trade_no"));
+                mergeOrderInfo.setUpdateTime(new Date());
+                mergeOrderInfoService.update(mergeOrderInfo);
+
+                List<OrderInfo> orderInfoList = orderInfoService.findByMergeOrderId(mergeOrderInfo.getId());
+
+                if (orderInfoList.size()>0){
+
+                    for (OrderInfo orderInfo : orderInfoList){
+                        orderInfo.setUpdateTime(new Date());
+                        orderInfo.setUpdateBy(params.get("buyer_logon_id"));
+                        orderInfo.setPayName("alipay");
+                        orderInfo.setPayStatus(20);
+                        orderInfo.setPayFee(orderInfo.getTotalFee());
+                        orderInfo.setTransactionId(params.get("trade_no"));
+                        orderInfo.setPayTime(DateUtil.parse(params.get("gmt_payment")));
+                        orderInfoService.update(orderInfo);
+
+
+                        try {
+                            new Thread(() -> {
+
+                                try{
+                                    //根据订单类型做各自处理
+                                }catch (Exception ex){
+                            /*SysLog sysLog = new SysLog();
+                            sysLog.setRemark(ex.getMessage());
+                            sysLog.setData(orderInfo.toString());
+                            sysLog.setPointcut("支付");
+                            sysLog.setCreateTime(new Date());
+                            sysLogService.insert(sysLog);*/
+
+                                }
+
+                            }).start();
+                        } catch (Exception e) {
+                            log.error(e.getMessage(), e);
+                        }
+                    }
+                }
+
+
+
+
+
+                return "success";
+            } else {
+                log.error("notify_url 验证失败");
+                return "failure";
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            return "failure";
+        }
+    }
+
+
+
+    @GetMapping(value="findUserInfo/{authCode}")
+    public MessageResult findUserInfo(@PathVariable(name="authCode") String authCode){
+
+        System.out.println("获取支付宝的userId");
+        try{
+
+            AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getServiceUrl(),aliPayConfig.getAppId(),aliPayConfig.getPrivateKey(),"json",aliPayConfig.getInputCharset(),aliPayConfig.getZfbPublicKey(),aliPayConfig.getSignType());
+
+            AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
+            request.setCode(authCode);
+            request.setGrantType("authorization_code");
+
+            AlipaySystemOauthTokenResponse oauthTokenResponse = alipayClient.execute(request);
+
+            System.out.println(oauthTokenResponse.getUserId());
+
+            HashMap<String,Object> dataMap = new HashMap<String,Object>();
+
+            UserInfo userInfo = new UserInfo();
+            userInfo.setOpenid(oauthTokenResponse.getUserId());
+       //     dataMap.put("openId", oauthTokenResponse.getUserId());
+
+         //   HashMap<String,Object> resultMap = new HashMap<String,Object>();
+
+        //    resultMap.put("userInfo", dataMap);
+
+            return new MessageResult(true, "获取支付宝信息成功", userInfo,200);
+        } catch (AlipayApiException e) {
+
+
+
+            //处理异常
+            e.printStackTrace();
+            return new MessageResult(false, "获取支付宝授权失败", "",400);
+        } catch (Exception e) {
+            //处理异常
+            e.printStackTrace();
+            return new MessageResult(false, "获取支付宝授权失败", "",400);
+        }
+    }
+
+
+    @ApiOperation(value = "支付宝扫码支付")
+    @GetMapping("/tradePrecreatePay")
+    public MessageResult tradePrecreatePay(String id) {
+
+        MessageResult result = new MessageResult();
+
+        try {
+            String qrCode = alipayService.tradePrecreatePay(id);
+            result.setResult(true);
+
+            result.setData(qrCode);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            result.setResult(false);
+            result.setMessage(e.getMessage());
+        }
+        return result;
+
+    }
+
+
+}

+ 241 - 0
web/src/main/java/com/jpsoft/bus/modules/pay/wechat/WxPayController.java

@@ -0,0 +1,241 @@
+package com.jpsoft.bus.modules.pay.wechat;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.StrUtil;
+import com.ijpay.core.enums.SignType;
+import com.ijpay.core.enums.TradeType;
+import com.ijpay.core.kit.HttpKit;
+import com.ijpay.core.kit.WxPayKit;
+import com.ijpay.wxpay.WxPayApi;
+import com.ijpay.wxpay.model.UnifiedOrderModel;
+import com.jfinal.kit.StrKit;
+import com.jpsoft.bus.config.WxJpsoftConfig;
+import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+import com.jpsoft.bus.modules.base.entity.PaymentInfo;
+import com.jpsoft.bus.modules.base.service.MergeOrderInfoService;
+import com.jpsoft.bus.modules.base.service.OrderInfoService;
+import com.jpsoft.bus.modules.base.service.PaymentInfoService;
+import com.jpsoft.bus.modules.common.dto.MessageResult;
+import com.jpsoft.bus.modules.pay.service.WechatService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author 墨鱼_mo
+ * @date 2019-11-26 10:35
+ */
+
+@RequestMapping("/wxPay")
+@RestController
+@Slf4j
+public class WxPayController {
+
+    @Autowired
+    private WxJpsoftConfig wxJpsoftConfig;
+
+    @Autowired
+    private MergeOrderInfoService mergeOrderInfoService;
+
+    @Autowired
+    private OrderInfoService orderInfoService;
+
+    @Autowired
+    private WechatService wechatService;
+
+    @Autowired
+    private PaymentInfoService paymentInfoService;
+
+
+    @ApiOperation(value = "微信JSAPI支付公用方法")
+    @GetMapping("/wxJsapiPay")
+    public MessageResult wxJsapiPay(String id) {
+        MessageResult msgResult = new MessageResult<>();
+        try {
+            MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.get(id);
+
+            if (mergeOrderInfo == null) {
+                throw new Exception("订单不存在");
+            }
+
+            PaymentInfo paymentInfo = paymentInfoService.get(mergeOrderInfo.getPaymentId());
+            String subMchId = paymentInfo.getSubMchId();
+            String outOrderNo = mergeOrderInfo.getOutOrderNo();
+
+            List<OrderInfo> orderInfoList = orderInfoService.findByMergeOrderId(id);
+            BigDecimal totalFee = BigDecimal.ZERO;
+            if (orderInfoList.size() == 0){
+                throw new Exception("订单错误");
+            }
+            for (OrderInfo orderInfo : orderInfoList){
+                if (orderInfo.getPayStatus() !=10){
+                    throw new Exception("订单错误");
+                }
+                totalFee = totalFee.add(orderInfo.getTotalFee());
+            }
+
+
+            //金额处理
+            int wxTotalTee = totalFee.multiply(new BigDecimal(100)).intValue();
+            Map<String, String> params = UnifiedOrderModel
+                    .builder()
+                    .appid(wxJpsoftConfig.getAppId())
+                    .mch_id(wxJpsoftConfig.getMchId())
+                    .sub_mch_id(subMchId)
+                    //     .sub_appid(wxConfig.getAppId())
+                    .nonce_str(WxPayKit.generateStr())
+                    .body(orderInfoList.get(0).getBody())
+                    .out_trade_no(outOrderNo)
+                    .total_fee(String.valueOf(wxTotalTee))
+                    .spbill_create_ip(wxJpsoftConfig.getIp())
+                    .notify_url(paymentInfo.getWechatNotifyUrl())
+                    .trade_type(TradeType.JSAPI.getTradeType())
+                    .sub_openid(mergeOrderInfo.getOpenId())
+                    //    .openid(orderInfo.getOpenId())
+                    .build()
+                    .createSign(wxJpsoftConfig.getMchKey(), SignType.HMACSHA256);
+
+            String xmlResult = WxPayApi.pushOrder(false, params);
+
+            Map<String, String> resultMap = WxPayKit.xmlToMap(xmlResult);
+            String returnCode = resultMap.get("return_code");
+            String returnMsg = resultMap.get("return_msg");
+            if (!WxPayKit.codeIsOk(returnCode)) {
+                log.error(returnCode);
+                throw new Exception(returnMsg);
+            }
+            String resultCode = resultMap.get("result_code");
+            if (!WxPayKit.codeIsOk(resultCode)) {
+                String errCode = resultMap.get("err_code_des");
+                log.error(errCode);
+                throw new Exception(errCode);
+            }
+
+            // 以下字段在 return_code 和 result_code 都为 SUCCESS 的时候有返回
+
+            String prepayId = resultMap.get("prepay_id");
+
+            Map<String, String> packageParams = WxPayKit.prepayIdCreateSign(prepayId, wxJpsoftConfig.getAppId(),
+                    wxJpsoftConfig.getMchKey(), SignType.HMACSHA256);
+
+            msgResult.setData(packageParams);
+            msgResult.setResult(true);
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error(e.getMessage(), e);
+            msgResult.setResult(false);
+            msgResult.setMessage(e.getMessage());
+        }
+        return msgResult;
+    }
+
+    @RequestMapping(value = "/wxPayNotify", method = {RequestMethod.POST, RequestMethod.GET})
+    @ResponseBody
+    public String wxPayNotify(HttpServletRequest request) {
+        String xmlMsg = HttpKit.readData(request);
+        log.warn("支付通知=" + xmlMsg);
+        Map<String, String> params = WxPayKit.xmlToMap(xmlMsg);
+
+        String returnCode = params.get("return_code");
+        String outTradeNo = params.get("out_trade_no");
+        String payTimeStr = params.get("time_end");
+        Date payTime = DateUtil.parse(payTimeStr);
+
+        // 注意此处签名方式需与统一下单的签名类型一致 WxPayApiConfigKit.getWxPayApiConfig().getPartnerKey()
+        if (WxPayKit.verifyNotify(params, wxJpsoftConfig.getMchKey(), SignType.HMACSHA256)) {
+            if (WxPayKit.codeIsOk(returnCode)) {
+                // 更新订单信息
+
+                try {
+
+                    MergeOrderInfo mergeOrderInfo = mergeOrderInfoService.findByOutOrderNo(outTradeNo);
+
+                    if (mergeOrderInfo == null) {
+                        throw new Exception("支付已完成,但未找到此订单号的流水");
+                    }
+
+                    List<OrderInfo> orderInfoList = orderInfoService.findByMergeOrderId(mergeOrderInfo.getId());
+
+                    if (orderInfoList.size()>0){
+                        for (OrderInfo orderInfo : orderInfoList){
+                            orderInfo.setUpdateTime(new Date());
+                            orderInfo.setUpdateBy(params.get("openid"));
+                            orderInfo.setPayName("wechat");
+                            orderInfo.setPayStatus(20);
+                            orderInfo.setPayFee(orderInfo.getTotalFee());
+                            orderInfo.setTransactionId(params.get("transaction_id"));
+                            orderInfo.setPayTime(payTime);
+                            orderInfoService.update(orderInfo);
+
+
+                            new Thread(() -> {
+                                try {
+                                    //根据订单类型做各自处理
+
+                                } catch (Exception ex) {
+                                    log.error(ex.getMessage(), ex);
+                                }
+
+
+                            }).start();
+                        }
+                    }
+
+
+
+
+                    // 发送通知等
+                    Map<String, String> xml = new HashMap<String, String>(2);
+                    xml.put("return_code", "SUCCESS");
+                    xml.put("return_msg", "OK");
+                    return WxPayKit.toXml(xml);
+                } catch (Exception e) {
+                    log.error(e.getMessage(), e);
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        return null;
+    }
+
+
+    @ApiOperation(value = "微信扫码支付功能")
+    @GetMapping("/wxNativePay")
+    @ResponseBody
+    public MessageResult wxNativePay(String id) {
+
+        MessageResult msgResult = new MessageResult<>();
+
+        try {
+
+            String qrCodeUrl = wechatService.wxNativePay(id);
+            msgResult.setData(qrCodeUrl);
+            msgResult.setResult(true);
+
+
+        } catch (Exception ex) {
+            log.error(ex.getMessage(),ex);
+            msgResult.setMessage(ex.getMessage());
+            msgResult.setResult(false);
+        }
+        return msgResult;
+    }
+
+}