TRX před 1 rokem
rodič
revize
270babaa10

+ 6 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/controller/payment/HxzController.java

@@ -52,5 +52,11 @@ public class HxzController {
         return hxzService.qRCodeTransaction(param);
     }
 
+    @Operation(summary = "二维码支付结果查询接口")
+    @PostMapping(value = "TransactionInquiry", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public ResultContent transactionInquiry(@RequestBody TransactionInquiryModel param) {
+        return hxzService.transactionInquiry(param);
+    }
+
 
 }

+ 2 - 0
FullCardServer/src/main/java/com/zhongshu/card/server/core/dao/payment/ExpenseFlowDao.java

@@ -19,4 +19,6 @@ public interface ExpenseFlowDao extends MongoDao<ExpenseFlow>, ExpenseFlowDaoExt
 
     ExpenseFlow findTopByOrderNoAndCardNoOrderByCreateTimeDesc(String orderNo, String cardNo);
 
+    ExpenseFlow findTopByOrderNoOrderByCreateTimeDesc(String orderNo);
+
 }

+ 1 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/domain/payment/ExpenseFlow.java

@@ -93,7 +93,7 @@ public class ExpenseFlow extends SuperMain {
     @Schema(description = "支付是否成功")
     private Boolean isPaySuccess;
 
-    @Schema(description = "支付结果备注")
+    @Schema(description = "支付结果备注,返回给设备展示")
     private String payRemark;
 
     //-----------------------退款 start--------------------------

+ 55 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/httpRequest/ApiRequestService.java

@@ -5,7 +5,9 @@ import cn.hutool.core.date.StopWatch;
 import cn.hutool.json.JSONUtil;
 import com.github.microservice.core.util.net.apache.HttpClientUtil;
 import com.github.microservice.core.util.net.apache.HttpModel;
+import com.github.microservice.core.util.net.apache.MethodType;
 import com.github.microservice.core.util.net.apache.ResponseModel;
+import com.github.microservice.models.hxz.TransactionInquiryResult;
 import com.zhongshu.card.server.core.httpRequest.apiConf.APIResponseModel;
 import com.zhongshu.card.server.core.httpRequest.apiConf.ApiConfParam;
 import com.zhongshu.card.server.core.httpRequest.conf.IotCenterAPIConfig;
@@ -42,6 +44,7 @@ public class ApiRequestService extends SuperService {
      */
     public APIResponseModel sendIotCenterAPI(String apiName, Object data) {
         APIResponseModel responseModel = new APIResponseModel();
+        responseModel.setRequestData(data);
         if (StringUtils.isEmpty(iotCenterConf.getUrl())) {
             responseModel.setIsFailed("未配置物联网平台URL");
             return responseModel;
@@ -54,7 +57,6 @@ public class ApiRequestService extends SuperService {
         StopWatch stopWatch = new StopWatch();
         stopWatch.start();
         try {
-            String json = JSONUtil.toJsonStr(data);
             String url = iotCenterConf.getUrl() + iotCenterConf.getIotserverName() + apiConfParam.getApiName();
             ResponseModel request = HttpClientUtil.request(HttpModel.builder()
                     .url(url).method(apiConfParam.getMethodType()).charset("utf-8").body(data).build());
@@ -78,4 +80,56 @@ public class ApiRequestService extends SuperService {
         return responseModel;
     }
 
+    /**
+     * 访问地址
+     *
+     * @param url
+     * @param data
+     * @return
+     */
+    public APIResponseModel sendWxRequest(String url, Object data) {
+        APIResponseModel responseModel = new APIResponseModel();
+        responseModel.setRequestData(data);
+
+        ApiConfParam apiConfParam = new ApiConfParam();
+        apiConfParam.setApiName(url);
+        apiConfParam.setMethodType(MethodType.Json);
+
+        StopWatch stopWatch = new StopWatch();
+        stopWatch.start();
+        try {
+            responseModel.setParam(apiConfParam);
+            ResponseModel request = HttpClientUtil.request(HttpModel.builder()
+                    .url(apiConfParam.getApiName()).method(apiConfParam.getMethodType())
+                    .charset("utf-8").body(data).build());
+            TransactionInquiryResult result = null;
+            if (request.getCode() == 200) {
+                Object object = request.getBody();
+                log.info("obj: {}", object);
+                responseModel.setIsSuccess();
+                result = BeanUtil.copyProperties(request.getBody(), TransactionInquiryResult.class);
+            } else {
+                result = BeanUtil.copyProperties(request.getBody(), TransactionInquiryResult.class);
+            }
+            if (result.isSuccess()) {
+                responseModel.setIsSuccess();
+            } else {
+                responseModel.setIsFailed(result.getMsg());
+            }
+            responseModel.setContent(JSONUtil.toJsonStr(result));
+            // 请求API参数
+            responseModel.setParam(apiConfParam);
+        } catch (Exception e) {
+            e.printStackTrace();
+            responseModel.setIsFailed(String.format("请求出错:%s", e.getMessage()));
+            return responseModel;
+        }
+        stopWatch.stop();
+        // 请求时间:毫秒
+        responseModel.setMillis(stopWatch.getTotalTimeMillis());
+        // 请求日志
+        requestInfoService.addIotRequestInfo(data, responseModel);
+        return responseModel;
+    }
+
 }

+ 12 - 1
FullCardServer/src/main/java/com/zhongshu/card/server/core/httpRequest/apiConf/APIResponseModel.java

@@ -18,20 +18,25 @@ import org.apache.commons.lang3.StringUtils;
 public class APIResponseModel {
     @Schema(description = "访问是否失败")
     private boolean failed;
+
     @Schema(description = "访问是否成功标记")
     private boolean success;
+
     @Schema(description = "消息")
     private String msg;
+
     @Schema(description = "状态")
     private String state;
+
     @Schema(description = "响应内容")
     private String content;
 
+    //----------------------------请求数据 start -----------------------
     @Schema(description = "请求API定义")
     private ApiConfParam param;
 
     @Schema(description = "请求参数")
-    private Object data;
+    private Object requestData;
 
     @Schema(description = "请求耗时:毫秒")
     private Long millis;
@@ -67,6 +72,12 @@ public class APIResponseModel {
         this.state = "Fail";
     }
 
+    public void setIsSuccess() {
+        this.success = Boolean.TRUE;
+        this.failed = Boolean.FALSE;
+        this.state = "Success";
+    }
+
     public void setIsFailed(String msg) {
         this.setIsFailed();
         this.msg = msg;

+ 113 - 11
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/ExpenseFlowServiceImpl.java

@@ -2,10 +2,7 @@ package com.zhongshu.card.server.core.service.payment;
 
 import cn.hutool.json.JSONUtil;
 import com.github.microservice.components.data.base.util.PageEntityUtil;
-import com.github.microservice.models.hxz.ConsumTransactionsFullParam;
-import com.github.microservice.models.hxz.ConsumTransactionsModel;
-import com.github.microservice.models.hxz.ConsumTransactionsResult;
-import com.github.microservice.models.hxz.QRCodeTransactionModel;
+import com.github.microservice.models.hxz.*;
 import com.github.microservice.models.type.PaymentDeviceType;
 import com.zhongshu.card.client.model.payment.ExpenseFlowCount;
 import com.zhongshu.card.client.model.payment.ExpenseFlowModel;
@@ -32,6 +29,8 @@ import com.zhongshu.card.server.core.domain.payment.WalletRecharge;
 import com.zhongshu.card.server.core.domain.school.BookInfo;
 import com.zhongshu.card.server.core.domain.school.CardInfo;
 import com.zhongshu.card.server.core.domain.school.DeviceInfo;
+import com.zhongshu.card.server.core.httpRequest.ApiRequestService;
+import com.zhongshu.card.server.core.httpRequest.apiConf.APIResponseModel;
 import com.zhongshu.card.server.core.model.payment.ExpendParam;
 import com.zhongshu.card.server.core.service.base.SuperService;
 import com.zhongshu.card.server.core.util.BeanUtils;
@@ -75,6 +74,8 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
 
     @Autowired
     CardInfoDao cardInfoDao;
+    @Autowired
+    private ApiRequestService apiRequestService;
 
     /**
      * 创建订单
@@ -243,8 +244,37 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         return ResultContent.buildSuccess();
     }
 
+    /**
+     * 查询构建支付返回结果
+     *
+     * @param orderNo
+     * @param cardNo
+     * @return
+     */
+    public ConsumTransactionsResult buildConsumTransactionsResult(String orderNo, String cardNo) {
+        ConsumTransactionsResult result = new ConsumTransactionsResult();
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoAndCardNoOrderByCreateTimeDesc(orderNo, cardNo);
+        if (ObjectUtils.isNotEmpty(expenseFlow)) {
+            Boolean isPaySuccess = expenseFlow.getIsPaySuccess();
+            if (isPaySuccess != null && isPaySuccess) {
+                result.setSuccess();
+                result.setText("支付成功");
+                result.setCardNo(expenseFlow.getCardNo());
+                result.setName(expenseFlow.getUserName());
+                // 金额 转为 元 单位
+                result.setAmount(CommonUtil.turnMoney2Show(expenseFlow.getPayAmount()));
+            } else {
+                result.setFailed(expenseFlow.getPayRemark());
+            }
+        } else {
+            result.setFailed("未查询到订单");
+        }
+        return result;
+    }
+
     /**
      * 通过 付款码(二维码)支付接口 创建订单
+     *
      * @param iotParam
      * @return
      */
@@ -256,18 +286,20 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         expenseFlow.setPaymentTime(DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS));
 
         // 消费订单号
-//        expenseFlow.setOrderNo(iotParam.getOrder());
-//        expenseFlow.setCardNo(iotParam.getCardNo());
+        String orderNo = NextNoUtil.getNextPaymentNo("o");
+        expenseFlow.setOrderNo(orderNo);
+        expenseFlow.setCardNo("");
         String paymentNo = NextNoUtil.getNextPaymentNo(null);
         // 支付订单号
         expenseFlow.setPaymentNo(paymentNo);
+        // 消费金额
         BigDecimal amount = CommonUtil.turnMoney2BigDecimal(iotParam.getAmount());
         expenseFlow.setPayAmount(amount);
 
         String deviceId = iotParam.getDeviceId();
         // 设备信息
         expenseFlow.setDeviceId(deviceId);
-        // 支付方式
+        // 支付方式 钱包  二维码
         expenseFlow.setPaymentWay(iotParam.getPaymentType().getRemark());
         expenseFlow.setParam(iotParam);
         expenseFlow.setPaymentDeviceType(PaymentDeviceType.HxzConsumTransactions);
@@ -275,21 +307,91 @@ public class ExpenseFlowServiceImpl extends SuperService implements ExpenseFlowS
         return ResultContent.buildSuccess(expenseFlow);
     }
 
+    /**
+     * 消费机 B扫C的支付
+     *
+     * @param entity
+     * @return
+     */
+    @Transactional
+    public ResultContent<ExpenseFlow> expendPayQrCode(ExpenseFlow entity) {
+        // 验证QR 关联的用户信息
+        String userId = "665fc0389083d203896d3541";
+
+        UserAccount userAccount = userCountDao.findTopByUserId(userId);
+        if (ObjectUtils.isEmpty(userAccount)) {
+            entity.setIsPaySuccess(Boolean.FALSE);
+            entity.setPayRemark("账号未注册");
+            entity.setPaymentStatus("支付失败");
+            expenseFlowDao.save(entity);
+            return ResultContent.buildSuccess(entity);
+        }
+
+        if (userAccount.getState() == UserState.Locked) {
+            entity.setIsPaySuccess(Boolean.FALSE);
+            entity.setPayRemark("账号已锁定");
+            entity.setPaymentStatus("支付失败");
+            expenseFlowDao.save(entity);
+            return ResultContent.buildSuccess(entity);
+        }
+        entity.setUserName(userAccount.getName());
+        entity.setUserId(userId);
+
+        String deviceId = entity.getDeviceId();
+        if (deviceId == null) {
+            deviceId = "";
+        }
+        DeviceInfo deviceInfo = deviceInfoDao.findTopByDeviceId(deviceId);
+        if (ObjectUtils.isEmpty(deviceInfo)) {
+            entity.setIsPaySuccess(Boolean.FALSE);
+            entity.setPayRemark("业务设备未注册");
+            entity.setPaymentStatus("支付失败");
+            expenseFlowDao.save(entity);
+            return ResultContent.buildSuccess(entity);
+        }
+
+        // 消费设备信息
+        if (deviceInfo.getDeviceType() != null) {
+            entity.setPayType(deviceInfo.getDeviceType().getRemark());
+        } else {
+            entity.setPayType("消费");
+        }
+        // 调用微信支付
+        QRCodeTransactionModel payParam = (QRCodeTransactionModel) entity.getParam();
+        String url = "https://jupan.5xryd.com//wxapi/pay/createQrCodeOrder";
+        APIResponseModel apiResponseModel = apiRequestService.sendWxRequest(url, payParam);
+        log.info("支付结果:{}", apiResponseModel);
+        if (apiResponseModel.isSuccess()) {
+            // 关联参数
+            TransactionInquiryResult result = JSONUtil.toBean(apiResponseModel.getContent(), TransactionInquiryResult.class);
+            entity.setOrderNo(result.getQrorder());
+            entity.setPaymentStatus("支付成功");
+            entity.setIsPaySuccess(Boolean.TRUE);
+            entity.setPayRemark("支付成功");
+        } else {
+            // 关联参数
+            entity.setPaymentStatus("支付失败");
+            entity.setIsPaySuccess(Boolean.FALSE);
+            entity.setPayRemark(apiResponseModel.getMsg());
+        }
+        expenseFlowDao.save(entity);
+        return ResultContent.buildSuccess();
+    }
+
     /**
      * 查询构建支付返回结果
      *
      * @param orderNo
-     * @param cardNo
      * @return
      */
-    public ConsumTransactionsResult buildConsumTransactionsResult(String orderNo, String cardNo) {
+    public ConsumTransactionsResult buildConsumTransactionsResult(String orderNo) {
         ConsumTransactionsResult result = new ConsumTransactionsResult();
-        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoAndCardNoOrderByCreateTimeDesc(orderNo, cardNo);
+        ExpenseFlow expenseFlow = expenseFlowDao.findTopByOrderNoOrderByCreateTimeDesc(orderNo);
         if (ObjectUtils.isNotEmpty(expenseFlow)) {
             Boolean isPaySuccess = expenseFlow.getIsPaySuccess();
             if (isPaySuccess != null && isPaySuccess) {
                 result.setSuccess();
-                result.setText("支付成功");
+                result.setText(expenseFlow.getPayRemark());
                 result.setCardNo(expenseFlow.getCardNo());
                 result.setName(expenseFlow.getUserName());
                 // 金额 转为 元 单位

+ 23 - 8
FullCardServer/src/main/java/com/zhongshu/card/server/core/service/payment/HxzService.java

@@ -3,6 +3,7 @@ package com.zhongshu.card.server.core.service.payment;
 import cn.hutool.json.JSONUtil;
 import com.github.microservice.models.hxz.*;
 import com.github.microservice.models.hxz.base.BaseResultModel;
+import com.github.microservice.models.type.PaymentType;
 import com.zhongshu.card.client.ret.ResultContent;
 import com.zhongshu.card.client.utils.type.UserState;
 import com.zhongshu.card.client.utils.type.school.CardState;
@@ -146,19 +147,33 @@ public class HxzService extends SuperService {
         ExpenseFlow expenseFlow = createResult.getContent();
 
         // 扣款支付订单
-        ResultContent<ExpenseFlow> resultContent = expenseFlowService.expendPay(expenseFlow);
+        ResultContent<ExpenseFlow> resultContent = expenseFlowService.expendPayQrCode(expenseFlow);
         if (resultContent.isFailed()) {
-            model.setFailed(resultContent.getMsg());
-            requestInfoService.addRequestInfo(param, model);
-            result.setModel(model);
-            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+//            model.setFailed(resultContent.getMsg());
+//            requestInfoService.addRequestInfo(param, model);
+//            result.setModel(model);
+//            return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
         }
-        // 构建返回结果
-//        model = expenseFlowService.buildConsumTransactionsResult(expenseFlow.getOrderNo(), expenseFlow.getCardNo());
-//        result.setModel(model);
+        model.setQrorder(expenseFlow.getOrderNo());
         // 记录日志
         requestInfoService.addRequestInfo(param, model);
         return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
     }
 
+    /**
+     * 用户刷卡消费结果查询接口
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent transactionInquiry(TransactionInquiryModel param) {
+        ConsumTransactionsFullResult result = new ConsumTransactionsFullResult();
+        result.setPaymentType(PaymentType.WxQrCode);
+        // 构建返回结果
+        ConsumTransactionsResult resultModel = expenseFlowService.buildConsumTransactionsResult(param.getQROrder());
+        result.setModel(resultModel);
+        requestInfoService.addRequestInfo(param, resultModel);
+        return ResultContent.buildSuccess(JSONUtil.toJsonStr(result));
+    }
+
 }