2 Commits 76c7363c26 ... 6a122bec61

Author SHA1 Message Date
  liude 6a122bec61 Merge remote-tracking branch 'origin/master' 3 months ago
  liude 45ccdb12bc 首信易支付下单 3 months ago

+ 18 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/constant/TradeConstant.java

@@ -36,4 +36,22 @@ public interface TradeConstant {
      * 转账地址
      */
     static final String TRANSFER_URL = "https://apis.5upay.com/transferAccount/order";
+
+    /**
+     * 下单通知地址
+     */
+    static final String ORDER_NOTIFY_URL = "";
+    /**
+     * 下单回调地址
+     */
+    static final String ORDER_CALLBACKURL = "";
+    /**
+     * (直连)
+     */
+    static final String MINIAPPS_WEIXIN_PAY_P2P = "MINIAPPS-WEIXIN_PAY-P2P";
+    /**
+     * (非直连)
+     */
+    static final String MINIAPPS_WEIXIN_PAY = "";
+
 }

+ 43 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/dto/RefundDTO.java

@@ -0,0 +1,43 @@
+package com.chelvc.cloud.vehicle.client.dto;
+
+import com.chelvc.cloud.vehicle.client.param.Payment;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+
+/**
+ * @author liude
+ * @date 2024/12/24 21:45
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+public class RefundDTO extends Payment implements Serializable {
+    /**
+     * 交易流水号	交易流水号
+     */
+    private String serialNumber;
+    /**
+     * 状态	SUCCESS 成功(此成功状态为提交请求至首信易成功而不是退款成功),
+     *     FAILED 失败
+     *     ERROR 错误(此状态的返回参数见异常情况说明)
+     */
+    private String status;
+    /**
+     * 退款金额	单位:分,1元=100分
+     */
+    private String amount;
+    /**
+     * 退款币种	默认人民币CNY
+     */
+    private String currency;
+
+
+
+}

+ 38 - 0
vehicle-client/src/main/java/com/chelvc/cloud/vehicle/client/param/Payment.java

@@ -0,0 +1,38 @@
+package com.chelvc.cloud.vehicle.client.param;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import lombok.experimental.SuperBuilder;
+
+import java.io.Serializable;
+/**
+ * @author liude
+ * @date 2024/12/24 21:45
+ **/
+@Data
+@SuperBuilder
+@NoArgsConstructor
+@AllArgsConstructor
+@ToString(callSuper = true)
+public class Payment implements Serializable {
+    /**
+     * 商户编号	varchar(9)	商户在首信易系统的唯一id,可在商户后台查看	M
+     */
+    private String merchantId;
+    /**
+     * 订单号	varchar(50)	统一收单接口传入的requestid	M
+     */
+    private String requestId;
+    /**
+     * 服务商id	varchar(9)	服务商在首信易系统的唯一id,可在商户后台查看	C
+     */
+    private String partnerId;
+    /**
+     * 参数签名	varchar(500)	商户生成的参数签名结果,获取hmac的方法请参考请求加密流程	M
+     */
+    private String hmac;
+
+
+}

+ 7 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderReturnApplyService.java

@@ -3,6 +3,7 @@ package com.chelvc.cloud.vehicle.server.service;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderReturnApplyDTO;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderReturnApplyIdsDTO;
 import com.chelvc.cloud.vehicle.client.dto.OrderReturnApplyDTO;
+import com.chelvc.cloud.vehicle.client.dto.RefundDTO;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyPagingParam;
 import com.chelvc.framework.common.model.Pagination;
@@ -88,4 +89,10 @@ public interface OmsOrderReturnApplyService
     Integer queryReturnOrderNum(Long userId);
 
     OmsOrderReturnApplyDTO getOrderReturnApplyInfo(Long id);
+
+    /**
+     * 退款成功回调
+     * @param refundDTO
+     */
+    void refundCallBack(RefundDTO refundDTO);
 }

+ 7 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OmsOrderService.java

@@ -8,6 +8,7 @@ import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
 import com.chelvc.framework.common.model.Pagination;
 import com.chelvc.framework.database.support.EnhanceService;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
+import com.upay.sdk.onlinepay.builder.OrderResponse;
 
 import java.math.BigDecimal;
 import java.util.Map;
@@ -134,4 +135,10 @@ public interface OmsOrderService extends EnhanceService<OmsOrder>
      * 根据核销码获取订单详情
      */
     OmsOrderDetailDTO getOraderDetail(Long orderSn,Long merchantId);
+
+    /**
+     * 下单回调接口
+     * @param orderResponse
+     */
+    void orderCallBacl(OrderResponse orderResponse);
 }

+ 3 - 1
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/OnlinePayService.java

@@ -1,8 +1,10 @@
 package com.chelvc.cloud.vehicle.server.service;
 
+import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyModifyParam;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrderItem;
+import com.upay.sdk.onlinepay.builder.OrderResponse;
 
 import java.util.List;
 
@@ -16,7 +18,7 @@ public interface OnlinePayService{
     /**
      * 商户发送请求参数给首信易支付,并接收同步返回的支付信息,用支付信息拉起对应支付方式,并在订单终态后接收异步通知结果。
      */
-    void order(OmsOrder omsOrder, List<OmsOrderItem> orderItemList);
+    OrderResponse order(OmsOrder omsOrder, List<OmsOrderItem> orderItemList, OmsOrderModifyParam orderParam);
 
     /**
      * 商户通过单笔订单查询接口查询首信易支付平台的订单状态,并且通过主动查询订单来获知订单信息

+ 26 - 0
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -1,5 +1,6 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
 
+import cn.hutool.core.collection.ListUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -11,6 +12,7 @@ import com.chelvc.cloud.vehicle.client.constant.ReserveStatus;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderReturnApplyDTO;
 import com.chelvc.cloud.vehicle.client.dto.OmsOrderReturnApplyIdsDTO;
 import com.chelvc.cloud.vehicle.client.dto.OrderReturnApplyDTO;
+import com.chelvc.cloud.vehicle.client.dto.RefundDTO;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyPagingParam;
 import com.chelvc.cloud.vehicle.server.copier.OrderReturnApplyCopier;
@@ -35,6 +37,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -209,4 +212,27 @@ public class OmsOrderReturnApplyServiceImpl extends ServiceImpl<OmsOrderReturnAp
         }
         return ObjectUtils.copying(omsOrderReturnApply, OmsOrderReturnApplyDTO.class);
     }
+    @Override
+    public void refundCallBack(RefundDTO refundDTO){
+        List<OmsOrderReturnApply> list = this.lambdaQuery().eq(OmsOrderReturnApply::getOrderId,Long.valueOf(refundDTO.getRequestId()))
+                .orderByDesc(OmsOrderReturnApply::getCreateTime).list();
+        if (list == null && list.size() < 1){
+            return;
+        }
+        OmsOrderReturnApply omsOrderReturnApply = list.get(0);
+        String withdrawAmount = refundDTO.getAmount();
+        BigDecimal amount = omsOrderReturnApply.getReturnAmount();
+        if(amount.compareTo(new BigDecimal(withdrawAmount)) != 0){
+            //金额不一致
+            return;
+        }
+        String transferStatus = refundDTO.getStatus();
+        Long status = 3l;
+        if("SUCCESS".equals(transferStatus)){
+            status = 2l;
+        }
+        omsOrderReturnApply.setStatus(status);
+        this.baseMapper.updateById(omsOrderReturnApply);
+
+    }
 }

+ 31 - 12
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OmsOrderServiceImpl.java

@@ -27,6 +27,7 @@ import com.chelvc.framework.redis.context.RedisContextHolder;
 import com.chelvc.framework.wechat.WechatPayRequest;
 import com.chelvc.framework.wechat.WechatPaymentHandler;
 import com.chelvc.framework.wechat.WechatUnifiedOrder;
+import com.upay.sdk.onlinepay.builder.OrderResponse;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.Timeout;
 import io.netty.util.Timer;
@@ -86,6 +87,8 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
     private static final String DIGITS = "0123456789";
     private static final String ALL_CHARACTERS = LOWER_CASE + UPPER_CASE + DIGITS;
 
+    private final OnlinePayService onlinePayService;
+
     @Override
     public ConfirmOrderResultDTO generateConfirmOrder(OmsOrderModifyParam orderParam) {
         ConfirmOrderResultDTO result = new ConfirmOrderResultDTO();
@@ -294,19 +297,21 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         //发送延迟消息取消订单
         sendDelayMessageCancelOrder(order.getId());
         //调用jsapi支付逻辑
-        WechatPayRequest request = new WechatPayRequest();
-        request.setAmount(order.getPayAmount());
-        request.setComment("商品购买");
-        request.setOrder(String.valueOf(order.getId()));
-        String openid = userService.queryOpenid(userId);
-        if(openid == null){
-            throw new ResourceUnavailableException("账号未绑定微信,请联系客服");
-        }
-        request.setOpenid(openid);
+//        WechatPayRequest request = new WechatPayRequest();
+//        request.setAmount(order.getPayAmount());
+//        request.setComment("商品购买");
+//        request.setOrder(String.valueOf(order.getId()));
+//        String openid = userService.queryOpenid(userId);
+//        if(openid == null){
+//            throw new ResourceUnavailableException("账号未绑定微信,请联系客服");
+//        }
+//        request.setOpenid(openid);
         //WechatPaymentHandler wechatPaymentHandler = applicationContext.getBean(WechatPaymentHandler.class);
-
-
-        return this.wechatPaymentHandler.unifiedorder("applet", request);
+//        return this.wechatPaymentHandler.unifiedorder("applet", request);
+        OrderResponse orderResponse = this.onlinePayService.order(order,orderItemList,orderParam);
+        WechatUnifiedOrder wechatUnifiedOrder = new WechatUnifiedOrder();
+        wechatUnifiedOrder.setOrder(orderResponse.getReceiptOrderId());
+        return wechatUnifiedOrder;
     }
 
     @Override
@@ -998,4 +1003,18 @@ public class OmsOrderServiceImpl extends ServiceImpl<OmsOrderMapper, OmsOrder> i
         orderDetail.setMerchantInfo(merchant);
         return orderDetail;
     }
+    @Override
+    public void orderCallBacl(OrderResponse orderResponse){
+        //修改订单支付状态
+        OmsOrder order = this.baseMapper.selectById(orderResponse.getRequestId());
+        if(order == null){
+            return ;
+        }
+        order.setStatus(1);
+        order.setPaymentTime(new Date());
+        order.setPayType(1);
+        DatabaseContextHolder.transactional((Executor) () ->
+                orderHandleService.paySuccess(order)
+        );
+    }
 }

+ 131 - 10
vehicle-server/src/main/java/com/chelvc/cloud/vehicle/server/service/impl/OnlinePayServiceImpl.java

@@ -1,24 +1,36 @@
 package com.chelvc.cloud.vehicle.server.service.impl;
+import cn.hutool.core.codec.Base64;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.shaded.com.google.gson.Gson;
+import com.chelvc.cloud.user.client.UserClient;
+import com.chelvc.cloud.user.client.dto.UserDTO;
 import com.chelvc.cloud.vehicle.client.constant.TradeConstant;
+import com.chelvc.cloud.vehicle.client.param.OmsOrderModifyParam;
 import com.chelvc.cloud.vehicle.client.param.OrderReturnApplyModifyParam;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrder;
 import com.chelvc.cloud.vehicle.server.entity.OmsOrderItem;
 import com.chelvc.cloud.vehicle.server.handle.TradeHandle;
+import com.chelvc.cloud.vehicle.server.service.MerchantAuthService;
+import com.chelvc.cloud.vehicle.server.service.MerchantService;
 import com.chelvc.cloud.vehicle.server.service.OnlinePayService;
+import com.upay.sdk.entity.Payer;
+import com.upay.sdk.entity.ProductDetail;
 import com.upay.sdk.exception.HmacVerifyException;
 import com.upay.sdk.exception.RequestException;
 import com.upay.sdk.exception.ResponseException;
 import com.upay.sdk.exception.UnknownException;
 import com.upay.sdk.executer.ResultListenerAdpater;
 import com.upay.sdk.onlinepay.builder.OrderBuilder;
+import com.upay.sdk.onlinepay.builder.OrderResponse;
 import com.upay.sdk.onlinepay.builder.QueryBuilder;
 import com.upay.sdk.onlinepay.builder.RefundBuilder;
 import com.upay.sdk.onlinepay.executer.OnlinePayOrderExecuter;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.io.PrintWriter;
+import java.io.IOException;
+import java.util.LinkedList;
 import java.util.List;
 
 /**
@@ -28,25 +40,134 @@ import java.util.List;
  * @date 2025/1/6
  */
 @Service
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
 public class OnlinePayServiceImpl  implements OnlinePayService {
+
+    private final UserClient userService;
+
     @Override
-    public void order(OmsOrder omsOrder, List<OmsOrderItem> orderItemList){
+    public OrderResponse  order(OmsOrder omsOrder, List<OmsOrderItem> orderItemList, OmsOrderModifyParam orderParam){
         OrderBuilder builder = new OrderBuilder(omsOrder.getMerchantId().toString());
         builder.setRequestId(omsOrder.getId().toString())
                 .setOrderAmount(omsOrder.getPayAmount().toString())
                 .setOrderCurrency("CNY")
-                .setNotifyUrl(TradeConstant.WITHDRAW_NOTIFY_URL)
-                .setCallbackUrl("")
+                .setNotifyUrl(TradeConstant.ORDER_NOTIFY_URL)
+                .setCallbackUrl(TradeConstant.ORDER_CALLBACKURL)
                 .setRemark(omsOrder.getNote())
-                .setPaymentModeCode("")
+                .setPaymentModeCode(TradeConstant.MINIAPPS_WEIXIN_PAY_P2P)
                 .setAuthCode("")
-                .setMerchantUserId("")
+                .setMerchantUserId(omsOrder.getUserId().toString())
                 .setBindCardId("")
                 .setClientIp("");
-        Gson gson = new Gson();
-        JSONObject json = TradeHandle.handle(gson.toJson(builder),
-                TradeConstant.WITHDRAW_URL, omsOrder.getMerchantId().toString(), TradeConstant.PARTNER_ID);
-        String result = json.getString("status");
+        builder.setTimeout("15");
+        builder.setPaymentToken("");
+        builder.setAppId("");
+
+        builder.setSerialNumber("");
+        builder.setApCardNo("");
+        builder.setApTransData("");
+        builder.setApUserData("");
+        builder.setReportSerialNo("");
+        builder.setReportTerminalNo("");
+        builder.setPartnerId(TradeConstant.PARTNER_ID);
+        builder.setProjectId(TradeConstant.PARTNER_ID);
+        builder.setSplitMark("");
+
+
+        //productDetails(商品信息)
+//        List<ProductDetail> productDetails = new LinkedList();
+        for (OmsOrderItem omsOrderItem : orderItemList) {
+            ProductDetail productDetail = new ProductDetail();
+            productDetail.setName(omsOrderItem.getGoodsName());
+            productDetail.setAmount(Long.valueOf(omsOrderItem.getGoodsPrice().toString()));
+            productDetail.setQuantity(Long.valueOf(omsOrderItem.getGoodsQuantity()));
+            builder.addProductDetail(productDetail);
+        }
+        UserDTO userDTO = userService.getUser(omsOrder.getUserId());
+        builder.setOpenId(userDTO.getOpenid());
+        //payer(身份信息)可选项
+        Payer payer = new Payer();
+        payer.setName(userDTO.getNickname());
+        payer.setPhoneNum(userDTO.getMobile());
+        payer.setBankCardNum("");
+        payer.setIdNum("");
+        payer.setIdType("");
+        payer.setEmail("");
+        builder.setPayer(payer);
+        OrderResponse orderResponse = new OrderResponse();
+        //分期支付参数
+//        InstalmentParams instalmentParams = new InstalmentParams();
+//        instalmentParams.setInterestType(interestType);
+//        instalmentParams.setSuppBankCodes(suppBankCodes);
+//        instalmentParams.setLimitNum(limitNum);
+//        instalmentParams.setStoreNo(storeNo);
+//        instalmentParams.setStoreName(storeName);
+//        builder.setInstalmentParams(instalmentParams);
+
+
+//        builder.setSubsidyMark(subsidyMark);
+//        builder.setSubsidyAmount(subsidyAmount);
+
+        try {
+            OnlinePayOrderExecuter executer = new OnlinePayOrderExecuter();
+            System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
+            executer.bothOrder(builder, new ResultListenerAdpater() {
+                /**
+                 * 提交成功,不代表支付成功
+                 */
+                @Override
+                public void success(JSONObject jsonObject) {
+                    if (jsonObject.get("scanCode") != null) {
+                        try {
+
+                            orderResponse.setHmac(jsonObject.getString("hmac"));
+                            orderResponse.setMerchantId(jsonObject.getString("merchantId"));
+                            orderResponse.setRequestId(jsonObject.getString("requestId"));
+                            orderResponse.setStatus(jsonObject.getString("status"));
+                            String scanCodeStr = jsonObject.getString("scanCode");
+//                            orderResponse.setScanCode(Base64.decodeBase64(scanCodeStr));
+//
+//                            session.setAttribute("orderResponse", orderResponse);
+//                            resp.sendRedirect("scancode.jsp");
+                        } catch (Exception e) {
+                            System.out.println("响应异常</br>");
+                            System.out.println(e.toString());
+                        }
+                    } else if (jsonObject.get("jsString") != null) {
+                        //微信公众号支付
+                        try {
+//                            HttpSession session = req.getSession();
+//                            session.setAttribute("jsString", jsonObject.get("jsString"));
+//                            resp.sendRedirect("wechatjsapi.jsp");
+                        } catch (Exception e) {
+                            System.out.println("响应异常</br>");
+                            System.out.println(e.toString());
+                        }
+                    }
+                    System.out.println("提交成功</br>");
+                    System.out.println(jsonObject);
+                }
+
+                @Override
+                public void redirect(JSONObject jsonObject, String redirectUrl) throws IOException {
+//                    resp.sendRedirect(redirectUrl);
+                }
+            });
+        } catch (ResponseException e) {
+            System.out.println("响应异常</br>");
+            System.out.println(e.toString());
+        } catch (HmacVerifyException e) {
+            System.out.println("签名验证异常</br>");
+            System.out.println(e.toString());
+        } catch (RequestException e) {
+            System.out.println("请求异常</br>");
+            System.out.println(e.toString());
+        } catch (UnknownException e) {
+            System.out.println("未知异常</br>");
+            System.out.println(e.toString());
+        }
+        return orderResponse;
+
     }
     @Override
     public String query(OmsOrder omsOrder) {

+ 6 - 1
vehicle-server/src/main/resources/5upay-config.properties

@@ -3,7 +3,12 @@ wallet.withdraw.url=https://apis.5upay.com/wallet/withdraw
 wallet.withdraw.query.url=https://apis.5upay.com/wallet/withdrawQuery
 wallet.withdraw.certificate.url=https://apis.5upay.com/wallet/withdrawCertificate
 wallet.withdraw.certificate.partner.url=https://apis.5upay.com/wallet/withdrawCertificatePartner
-onlinepay.order.url=https://apis.5upay.com/onlinePay/query
+onlinepay.order.url=https://apis.5upay.com/onlinePay/order
+onlinepay.query.url=https://apis.5upay.com/onlinePay/query
+onlinepay.refund.url=https://apis.5upay.com/onlinePay/refund
+onlinepay.refund.query.url=https://apis.5upay.com/onlinePay/refundQuery
+onlinepay.cancelOrder.url=https://apis.5upay.com/onlinePay/cancelOrder
+
 ehking.sdk.net.client.defaultConnectTimeout=30000
 ehking.sdk.net.client.defaultReadTimeout=30000