fllmoyu %!s(int64=4) %!d(string=hai) anos
pai
achega
0b09234f42

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

@@ -22,4 +22,13 @@ public interface OrderInfoService {
 	List<OrderInfo> findByMergeOrderId(String mergeOrderId);
 
     OrderInfo findByPassengerIdMergeOrderId(String id, String mergeOrderId);
+
+
+	/**
+	 * 订单在线退款
+	 * @param orderId
+	 * @return
+	 * @throws Exception
+	 */
+	Boolean refund(String orderId) throws Exception;
 }

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

@@ -4,6 +4,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import javax.annotation.Resource;
+
+import com.jpsoft.bus.modules.bus.entity.PassengerInfo;
+import com.jpsoft.bus.modules.bus.service.PassengerInfoService;
+import com.jpsoft.bus.modules.pay.service.AlipayService;
+import com.jpsoft.bus.modules.pay.service.WechatService;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
 import com.jpsoft.bus.modules.base.dao.OrderInfoDAO;
@@ -19,6 +25,15 @@ public class OrderInfoServiceImpl implements OrderInfoService {
 	@Resource(name="orderInfoDAO")
 	private OrderInfoDAO orderInfoDAO;
 
+	@Autowired
+	private AlipayService alipayService;
+
+	@Autowired
+	private PassengerInfoService passengerInfoService;
+
+	@Autowired
+	private WechatService wechatService;
+
 	@Override
 	public OrderInfo get(String id) {
 		// TODO Auto-generated method stub
@@ -87,4 +102,35 @@ public class OrderInfoServiceImpl implements OrderInfoService {
 	public OrderInfo findByPassengerIdMergeOrderId(String id, String mergeOrderId) {
 		return orderInfoDAO.findByPassengerIdMergeOrderId(id,mergeOrderId);
 	}
+
+	@Override
+	public Boolean refund(String orderId) throws Exception {
+
+		OrderInfo orderInfo = get(orderId);
+		if (orderInfo == null){
+			throw new Exception("订单不存在");
+		}
+		if (orderInfo.getPayStatus() !=20){
+			throw new Exception("订单状态错误,不可退款");
+		}
+		if (!"wechat".equals(orderInfo.getPayName()) || "alipay".equals(orderInfo.getPayName())){
+			throw new Exception("非在线支付,不可在线退款");
+		}
+
+		if ("wechat".equals(orderInfo.getPayName())){
+			wechatService.wxRefund(orderInfo);
+		}
+
+		if ("alipay".equals(orderInfo.getPayName())){
+			alipayService.aliPayRefund(orderInfo);
+		}
+
+		//退款成功修改乘客记录
+		PassengerInfo passengerInfo = passengerInfoService.get(orderInfo.getPassengerId());
+		passengerInfo.setPayStatus("0");
+		passengerInfoService.update(passengerInfo);
+
+
+		return true;
+	}
 }

+ 14 - 0
common/src/main/java/com/jpsoft/bus/modules/bus/dto/PassengerMessageDTO.java

@@ -23,6 +23,20 @@ public class PassengerMessageDTO {
 
     private String statusName;
 
+    private String ticketType;
+
+    private String ticketTypeName;
+
     private String imageUrl;
 
+    public String getTicketTypeName(String ticketType){
+        String ticketTypeName = "成人票";
+
+        if ("1".equals(ticketType)){
+            ticketTypeName = "儿童票";
+        }
+
+        return ticketTypeName;
+    }
+
 }

+ 8 - 3
common/src/main/java/com/jpsoft/bus/modules/common/utils/StringUtils.java

@@ -1,5 +1,7 @@
 package com.jpsoft.bus.modules.common.utils;
 
+import cn.hutool.core.date.DateUtil;
+
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.text.MessageFormat;
@@ -47,11 +49,14 @@ public final class StringUtils extends org.apache.commons.lang3.StringUtils {
 	 * @return {String}
 	 */
 	public synchronized static String getOutTradeNo() {
-		SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
+		/*SimpleDateFormat format = new SimpleDateFormat("MMddHHmmss", Locale.getDefault());
 		Date date = new Date();
 		String key = format.format(date);
-		Integer ran = (int)((Math.random()*9+1)*100000);
-		key = key +ran.toString();
+		DateUtil.formatDateTime(new Date());
+		Integer ran = (int)((Math.random()*9+1)*100000);*/
+
+		String key = System.currentTimeMillis() + "cxd" + (int) (Math.random() * 900000000 + 100000000);
+	//	key = key +ran.toString();
 	//	key = key.substring(0, 24);
 		return key;
 	}

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

@@ -1,5 +1,9 @@
 package com.jpsoft.bus.modules.pay.service;
 
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+
+import java.math.BigDecimal;
+
 /**
  * @author 墨鱼_mo
  * @date 2021-4-9 14:51
@@ -7,4 +11,15 @@ package com.jpsoft.bus.modules.pay.service;
 public interface AlipayService {
 
     String tradePrecreatePay(String mergeOrderId) throws Exception;
+
+
+    /**
+     * 支付宝退款
+     * @param orderInfo
+     * @return
+     * @throws Exception
+     */
+    Boolean aliPayRefund(OrderInfo orderInfo) throws Exception;
+
+
 }

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

@@ -1,5 +1,9 @@
 package com.jpsoft.bus.modules.pay.service;
 
+import com.jpsoft.bus.modules.base.entity.OrderInfo;
+
+import java.math.BigDecimal;
+
 /**
  * @author 墨鱼_mo
  * @date 2021-4-9 14:50
@@ -7,4 +11,13 @@ package com.jpsoft.bus.modules.pay.service;
 public interface WechatService {
 
     String wxNativePay(String mergeOrderId) throws Exception;
+
+
+    /**
+     *微信退款
+     * @param orderInfo
+     * @return
+     * @throws Exception
+     */
+    Boolean wxRefund(OrderInfo orderInfo) throws Exception;
 }

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

@@ -4,7 +4,9 @@ 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.request.AlipayTradeRefundRequest;
 import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
 import com.jpsoft.bus.config.AliPayConfig;
 import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
 import com.jpsoft.bus.modules.base.entity.OrderInfo;
@@ -13,6 +15,7 @@ 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.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -97,4 +100,49 @@ public class AlipayServiceImpl implements AlipayService {
 
         return qr_code;
     }
+
+    @Override
+    public Boolean aliPayRefund(OrderInfo orderInfo) throws Exception {
+
+
+
+
+        Integer payStatus = 40;
+
+
+
+        AlipayClient alipayClient = new DefaultAlipayClient(aliPayConfig.getServiceUrl(), aliPayConfig.getAppId(), aliPayConfig.getPrivateKey(), "json", aliPayConfig.getInputCharset(), aliPayConfig.getZfbPublicKey(), aliPayConfig.getSignType());
+        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+
+
+        Map<String, Object> maps = new HashMap<>();
+        maps.put("out_trade_no", orderInfo.getOutOrderNo());
+        maps.put("refund_reason", "正常退款");
+        maps.put("refund_amount", orderInfo.getPayFee());
+
+
+        JSONObject extendParams = new JSONObject();
+
+        extendParams.put("sys_service_provider_id", aliPayConfig.getMchId());
+        maps.put("extend_params", extendParams);
+        request.putOtherTextParam("app_auth_token", aliPayConfig.getAppAuthToken());
+        //把订单信息转换为json对象的字符串
+        String postdata = JSONObject.toJSONString(maps);
+        request.setBizContent(postdata);
+
+
+        AlipayTradeRefundResponse response = alipayClient.execute(request);
+
+        //退款成功
+        if (response.isSuccess()){
+            orderInfo.setRefundFee(orderInfo.getPayFee());
+            orderInfo.setPayStatus(payStatus);
+            orderInfoService.update(orderInfo);
+
+        }
+
+        return response.isSuccess();
+
+
+    }
 }

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

@@ -4,6 +4,7 @@ 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.RefundModel;
 import com.ijpay.wxpay.model.UnifiedOrderModel;
 import com.jpsoft.bus.config.WxJpsoftConfig;
 import com.jpsoft.bus.modules.base.entity.MergeOrderInfo;
@@ -109,4 +110,52 @@ public class WechatServiceImpl implements WechatService {
 
         return qrCodeUrl;
     }
+
+    @Override
+    public Boolean wxRefund(OrderInfo orderInfo) throws Exception {
+
+
+
+        Integer payStatus = 40;
+
+
+        String totalFee = orderInfo.getTotalFee().multiply(new BigDecimal(100)).setScale(0).toString();
+        String refundFeeStr = orderInfo.getPayFee().multiply(new BigDecimal(100)).setScale(0).toString();
+
+
+        Map<String, String> params = RefundModel.builder()
+                .appid(wxJpsoftConfig.getAppId())
+                .mch_id(wxJpsoftConfig.getMchId())
+                .sub_mch_id(wxJpsoftConfig.getSubMchId())
+                .nonce_str(WxPayKit.generateStr())
+                .transaction_id(orderInfo.getTransactionId())
+                .out_trade_no(orderInfo.getTransactionId())
+                .out_refund_no(WxPayKit.generateStr())
+                .total_fee(totalFee)
+                .refund_fee(refundFeeStr)
+                .notify_url(wxJpsoftConfig.getRefundUrl())
+                .build()
+                .createSign(wxJpsoftConfig.getMchKey(), SignType.HMACSHA256);
+        //  .createSign(wxTransferConfig.getKey(), SignType.HMACSHA256);
+
+        //  return WxPayApi.orderRefund(false, params, wxTransferConfig.getCertPath(), wxTransferConfig.getMchId());
+        String result = WxPayApi.orderRefund(false, params, wxJpsoftConfig.getCertPath(), wxJpsoftConfig.getMchId());
+        Map<String, String> map = WxPayKit.xmlToMap(result);
+        String returnCode = map.get("return_code");
+        String resultCode = map.get("result_code");
+        if (WxPayKit.codeIsOk(returnCode) && WxPayKit.codeIsOk(resultCode)) {
+
+            orderInfo.setRefundFee(orderInfo.getPayFee());
+            orderInfo.setPayStatus(payStatus);
+            orderInfoService.update(orderInfo);
+
+
+
+            return true;
+        } else {
+            // 退款失败
+            throw new Exception("退款失败," + map.get("return_msg") + "," + map.get("err_code_des"));
+        }
+
+    }
 }

+ 2 - 0
web/src/main/java/com/jpsoft/bus/modules/mobile/controller/PassengerApiController.java

@@ -974,6 +974,8 @@ public class PassengerApiController {
                     passengerMessageDTO.setSendTime(DateUtil.format(passengerMessage.getCreateTime(),"yyyy-MM-dd HH:mm:ss"));
                     passengerMessageDTO.setStatusName("已过站");
                     passengerMessageDTO.setImageUrl(passengerInfo.getImageUrl());
+                    passengerMessageDTO.setTicketType(passengerInfo.getTicketType());
+                    passengerMessageDTO.setTicketTypeName(passengerMessageDTO.getTicketTypeName(passengerMessageDTO.getTicketType()));
                     list.add(passengerMessageDTO);
 
                     passengerMessage.setReadStatus(true);