qin преди 2 години
родител
ревизия
108380f94d

+ 2 - 1
src/main/java/com/poteviohealth/ym/ipos/YmIposApplication.java

@@ -12,7 +12,8 @@ import org.springframework.cloud.openfeign.EnableFeignClients;
  * @description
  */
 @EnableDiscoveryClient
-@EnableFeignClients(basePackages = {"com.poteviohealth.cgp.common.integrated.partner","com.poteviohealth.cgp.common.integrated.customer"})
+@EnableFeignClients(basePackages = {"com.poteviohealth.cgp.common.integrated.partner",
+		"com.poteviohealth.cgp.common.integrated.customer","com.poteviohealth.cgp.common.integrated.order"})
 @EnableConfigurationProperties
 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class})
 public class YmIposApplication {

+ 36 - 0
src/main/java/com/poteviohealth/ym/ipos/controller/ReceivePayAndRefundController.java

@@ -0,0 +1,36 @@
+package com.poteviohealth.ym.ipos.controller;
+
+import com.poteviohealth.cgp.common.facade.log.OperateType;
+import com.poteviohealth.cgp.common.facade.log.OperationLog;
+import com.poteviohealth.ym.ipos.model.payment.PayNotification;
+import com.poteviohealth.ym.ipos.service.IPaymentService;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+/**
+ * 支付回调类
+ * @author Qin
+ */
+@Controller
+@RequestMapping("/order/receive")
+@Slf4j
+public class ReceivePayAndRefundController {
+
+    @Resource
+    private IPaymentService paymentService;
+
+    @ApiOperation(value="支付回调")
+    @RequestMapping(value = "/payNotify",method = RequestMethod.POST)
+    @ResponseBody
+    @OperationLog(type = OperateType.ADD, description = "支付回调")
+    public String payNotify(@RequestBody PayNotification payNotification){
+        return paymentService.payNotification(payNotification);
+    }
+}

+ 58 - 0
src/main/java/com/poteviohealth/ym/ipos/controller/feign/IposFeignController.java

@@ -0,0 +1,58 @@
+package com.poteviohealth.ym.ipos.controller.feign;
+
+
+import com.poteviohealth.cgp.common.controller.BaseFeignController;
+import com.poteviohealth.cgp.common.integrated.order.model.PayBefor;
+import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
+import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
+import com.poteviohealth.cgp.common.model.VaultsResponse;
+import com.poteviohealth.cgp.common.utils.CgpTool;
+import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
+import com.poteviohealth.ym.ipos.service.IPaymentRecordsService;
+import com.poteviohealth.ym.ipos.service.IPaymentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import javax.annotation.Resource;
+
+/**
+ * 第三方支付
+ * @author Qin
+ */
+@Controller
+@RequestMapping("/ipos/feign")
+@Api(tags = {"第三方-支付相关接口"})
+public class IposFeignController extends BaseFeignController {
+
+    @Resource
+    private IPaymentRecordsService paymentRecordsService;
+    @Resource
+    private IPaymentService paymentService;
+
+    @ApiOperation(value = "第三方支付信息")
+    @RequestMapping(value = "/returnPay", method = RequestMethod.POST)
+    @ResponseBody
+    public VaultsResponse<PayInfoAppOutDTO> returnPay(@RequestBody PayBefor payBefor){
+        PaymentRecords pr = new PaymentRecords();
+        pr.setPayId(CgpTool.generateKey());
+        pr.setPaySn(payBefor.getPaySn());
+        pr.setTxAmt(payBefor.getPrice());
+        pr.setOpenid(payBefor.getOpenid());
+        pr.setOperatorId(payBefor.getOperatorId());
+        paymentRecordsService.save(pr);
+
+        return paymentService.unifiedOrder(pr);
+    }
+
+    @ApiOperation(value = "退款信息")
+    @RequestMapping(value = "/barcodeReverse", method = RequestMethod.POST)
+    @ResponseBody
+    public VaultsResponse barcodeReverse(@RequestBody RefundReceive refundReceive){
+         return paymentService.barcodeReverse(refundReceive);
+    }
+}

+ 12 - 0
src/main/java/com/poteviohealth/ym/ipos/mapper/PaymentRecordsMapper.java

@@ -0,0 +1,12 @@
+package com.poteviohealth.ym.ipos.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
+
+/**
+ * 支付记录
+ * @author Qin
+ */
+public interface PaymentRecordsMapper extends BaseMapper<PaymentRecords> {
+
+}

+ 68 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/PaymentRecords.java

@@ -0,0 +1,68 @@
+package com.poteviohealth.ym.ipos.model.payment;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.poteviohealth.cgp.common.model.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 支付记录
+ * @author Qin
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ipos_payment_records")
+public class PaymentRecords extends BaseEntity {
+
+    @ApiModelProperty(value = "运营商id")
+    private Integer operatorId;
+
+    @ApiModelProperty(value = "支付Id")
+    private Long payId;
+
+    @ApiModelProperty(value = "支付单号")
+    private String paySn;
+
+    @ApiModelProperty(value = "-1.未支付.0:失败,1:成功")
+    private Integer status;
+
+    @ApiModelProperty(value = "交易金额(分)")
+    private Long txAmt;
+
+    @ApiModelProperty(value = "交易完成时间")
+    private String endTime;
+
+    @ApiModelProperty(value = "预分账日期")
+    private String planSplitDate;
+
+    @ApiModelProperty(value="用户openId")
+    private String openid;
+
+    @ApiModelProperty(value="订单来源,1:接口接入,2:收款码牌")
+    private String source;
+
+    @ApiModelProperty(value="终端号")
+    private String posId;
+
+    /**
+     * 502:支付宝支付
+     * 503:微信支付
+     * 515:微信小程序
+     * 512:银联二维码
+     * 516:数字人民币
+     * 517:网银支付
+     * 518:快捷支付
+     * 620:银行卡刷卡
+     */
+    @ApiModelProperty(value="支付方式")
+    private String payType;
+
+    @ApiModelProperty(value="交易类型,1:支付")
+    private String transType;
+
+    @ApiModelProperty(value="支付平台的订单号,仅成功时有值")
+    private String tradeNo;
+}

+ 12 - 0
src/main/java/com/poteviohealth/ym/ipos/service/IPaymentRecordsService.java

@@ -0,0 +1,12 @@
+package com.poteviohealth.ym.ipos.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
+
+/**
+ * 支付记录
+ * @author Qin
+ */
+public interface IPaymentRecordsService extends IService<PaymentRecords> {
+
+}

+ 14 - 13
src/main/java/com/poteviohealth/ym/ipos/service/IPaymentService.java

@@ -1,11 +1,10 @@
 package com.poteviohealth.ym.ipos.service;
 
-import com.poteviohealth.cgp.common.integrated.StringParams;
+import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
+import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.ym.ipos.model.payment.PayNotification;
-import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
-import com.poteviohealth.ym.ipos.model.payment.PayReverse;
-import com.poteviohealth.ym.ipos.model.payment.back.PayBack;
+import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
 import com.poteviohealth.ym.ipos.model.payment.back.PayQueryBack;
 import com.poteviohealth.ym.ipos.model.payment.dto.BindDto;
 
@@ -24,36 +23,38 @@ public interface IPaymentService {
 
     /**
      * 支付查询交易
-     * @param paySn
+     * @param transactionId
      * @return
      */
-    VaultsResponse<PayQueryBack> barcodeQuery(String paySn);
+    VaultsResponse<PayQueryBack> barcodeQuery(String transactionId);
 
     /**
      * 支付退款交易
-     * @param payReverse
+     * @param refundReceive
      * @return
      */
-    VaultsResponse barcodeReverse(PayReverse payReverse);
+    VaultsResponse barcodeReverse(RefundReceive refundReceive);
 
     /**
      * 退款查询交易
-     * @param payRefundQuery
+     * @param transactionId
+     * @param operatorId
      * @return
      */
-    VaultsResponse barcodeRefundQuery(PayRefundQuery payRefundQuery);
+    VaultsResponse barcodeRefundQuery(String transactionId,String operatorId);
 
     /**
      * 统一下单交易
-     * @param params
+     * @param records
      * @return
      */
-    VaultsResponse<PayBack> unifiedOrder(StringParams params);
+    VaultsResponse<PayInfoAppOutDTO> unifiedOrder(PaymentRecords records);
 
     /**
      * 支付交易支付结果通知
      * @param payNotification
+     * @return
      */
-     void payNotification(PayNotification payNotification);
+     String payNotification(PayNotification payNotification);
 
 }

+ 17 - 0
src/main/java/com/poteviohealth/ym/ipos/service/impl/PaymentRecordsServiceImpl.java

@@ -0,0 +1,17 @@
+package com.poteviohealth.ym.ipos.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.poteviohealth.ym.ipos.mapper.PaymentRecordsMapper;
+import com.poteviohealth.ym.ipos.model.payment.PaymentRecords;
+import com.poteviohealth.ym.ipos.service.IPaymentRecordsService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 支付记录
+ * @author Qin
+ */
+@Service
+public class PaymentRecordsServiceImpl extends ServiceImpl<PaymentRecordsMapper, PaymentRecords> implements IPaymentRecordsService {
+
+
+}

+ 147 - 17
src/main/java/com/poteviohealth/ym/ipos/service/impl/PaymentServiceImpl.java

@@ -1,22 +1,28 @@
 package com.poteviohealth.ym.ipos.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.poteviohealth.cgp.common.filter.TokenContext;
-import com.poteviohealth.cgp.common.integrated.StringParams;
+import com.poteviohealth.cgp.common.integrated.order.OrderFeignClient;
+import com.poteviohealth.cgp.common.integrated.order.model.PayInfoAppOutDTO;
+import com.poteviohealth.cgp.common.integrated.order.model.PayReceive;
+import com.poteviohealth.cgp.common.integrated.order.model.RefundReceive;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
+import com.poteviohealth.cgp.common.utils.DateUtils;
 import com.poteviohealth.ym.ipos.model.payment.*;
-import com.poteviohealth.ym.ipos.model.payment.back.BindPosBack;
-import com.poteviohealth.ym.ipos.model.payment.back.PayBack;
-import com.poteviohealth.ym.ipos.model.payment.back.PayQueryBack;
-import com.poteviohealth.ym.ipos.model.payment.detail.PayParams;
-import com.poteviohealth.ym.ipos.model.payment.detail.PayQueryDetail;
-import com.poteviohealth.ym.ipos.model.payment.detail.StoreInfo;
-import com.poteviohealth.ym.ipos.model.payment.detail.Wxapp;
+import com.poteviohealth.ym.ipos.model.payment.back.*;
+import com.poteviohealth.ym.ipos.model.payment.detail.*;
 import com.poteviohealth.ym.ipos.model.payment.dto.BindDto;
+import com.poteviohealth.ym.ipos.service.IPaymentRecordsService;
 import com.poteviohealth.ym.ipos.service.IPaymentService;
 import com.poteviohealth.ym.ipos.utils.YmUtil;
 import lombok.extern.log4j.Log4j2;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.Resource;
+import java.util.Date;
+
 /**
  * 支付
  * @author Qin
@@ -25,6 +31,21 @@ import org.springframework.stereotype.Service;
 @Log4j2
 public class PaymentServiceImpl implements IPaymentService {
 
+    @Value("${pay.field.ip}")
+    private String ip;
+
+    @Value("${pay.field.notifyUrl}")
+    private String notifyUrl;
+
+    @Value("${pay.field.code}")
+    private String code;
+
+    @Resource
+    private IPaymentRecordsService paymentRecordsService;
+    @Resource
+    private OrderFeignClient orderFeignClient;
+
+
     @Override
     public VaultsResponse bindPos(BindDto dto) {
         BindPos pos = new BindPos();
@@ -55,12 +76,13 @@ public class PaymentServiceImpl implements IPaymentService {
     }
 
     @Override
-    public VaultsResponse<PayQueryBack> barcodeQuery(String paySn) {
+    public VaultsResponse<PayQueryBack> barcodeQuery(String transactionId) {
+
         PayQuery payQuery = new PayQuery();
         payQuery.setPos_id(TokenContext.curePosId());
         payQuery.setStore_id(TokenContext.cureStoreId());
         PayQueryDetail detail = new PayQueryDetail();
-        detail.setOrg_pos_seq(paySn);
+        detail.setOrg_pos_seq(transactionId);
         payQuery.setBarcode_query_request(detail);
         PayQueryBack back = null;
         try {
@@ -78,24 +100,132 @@ public class PaymentServiceImpl implements IPaymentService {
     }
 
     @Override
-    public VaultsResponse barcodeReverse(PayReverse payReverse) {
-        return null;
+    public VaultsResponse barcodeReverse(RefundReceive refundReceive) {
+        PayReverse payReverse = new PayReverse();
+        payReverse.setPos_id(code);
+        payReverse.setStore_id(refundReceive.getOperatorId().toString());
+        payReverse.setPos_seq(refundReceive.getRefundId().toString());
+        PayReverseDetail detail = new PayReverseDetail();
+        detail.setTx_amt(refundReceive.getPrice().toString());
+        detail.setOrg_pos_seq(refundReceive.getPayId().toString());
+        payReverse.setBarcode_reverse_request(detail);
+        PayReverseBack back = null;
+        try {
+            back = (PayReverseBack) YmUtil.resultBack(payReverse,new PayReverseBack());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return VaultsResponse.failed(e.getMessage());
+        }
+
+        if(YmUtil.SUCCESS.equals(back.getResult().getId())){
+            return VaultsResponse.success();
+        }else if(YmUtil.FAIL.equals(back.getResult().getId())){
+            return this.barcodeRefundQuery(refundReceive.getRefundId().toString(),refundReceive.getOperatorId().toString());
+        }
+
+        return VaultsResponse.failed(back.getResult().getComment());
     }
 
     @Override
-    public VaultsResponse barcodeRefundQuery(PayRefundQuery payRefundQuery) {
-        return null;
+    public VaultsResponse barcodeRefundQuery(String transactionId,String operatorId) {
+        PayRefundQuery payRefundQuery = new PayRefundQuery();
+        payRefundQuery.setPos_id(code);
+        payRefundQuery.setStore_id(operatorId);
+        PayQueryDetail detail = new PayQueryDetail();
+        detail.setOrg_pos_seq(transactionId);
+        payRefundQuery.setBarcode_refundquery_request(detail);
+
+        PayRefundQueryBack back = null;
+        try {
+            back = (PayRefundQueryBack) YmUtil.resultBack(payRefundQuery,new PayRefundQueryBack());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return VaultsResponse.failed(e.getMessage());
+        }
+
+        if(YmUtil.SUCCESS.equals(back.getResult().getId())){
+            return VaultsResponse.success();
+        }else if(YmUtil.FAIL.equals(back.getResult().getId())){
+            return VaultsResponse.success("退款处理中...");
+        }
+
+        return VaultsResponse.failed(back.getResult().getComment());
     }
 
     @Override
-    public VaultsResponse<PayBack> unifiedOrder(StringParams params) {
+    public VaultsResponse<PayInfoAppOutDTO> unifiedOrder(PaymentRecords records) {
+        PayInfoAppOutDTO dto = new PayInfoAppOutDTO();
+        PayOrder payOrder = new PayOrder();
+        payOrder.setPos_seq(records.getPayId().toString());
+        payOrder.setPos_id(code);
+        payOrder.setStore_id(records.getOperatorId().toString());
+        payOrder.setDevice_ip(ip);
+        PayDetail detail = new PayDetail();
+        detail.setBuyer_id(records.getOpenid());
+        detail.setTx_amt(records.getTxAmt());
+        detail.setNotify_url(notifyUrl);
+        ExtendParams extendParams = new ExtendParams();
+        extendParams.setPlan_split_date(DateFormatUtils.format(DateUtils.caculDays(new Date(),17),"yyyyMMdd"));
+        detail.setExtend_params(extendParams);
+        payOrder.setUnifiedorder_request(detail);
+        PayBack back = null;
+        try {
+            back = (PayBack) YmUtil.resultBack(payOrder,new PayBack());
+        } catch (IllegalAccessException e) {
+            e.printStackTrace();
+            return VaultsResponse.failed(e.getMessage());
+        }
+
+        if(YmUtil.FAIL.equals(back.getResult().getId())){
+            dto.setTimeStamp(back.getTime_stamp());
+            dto.setNonceStr(back.getNonce_str());
+            dto.setPackages(back.getPay_id());
+            dto.setSignType(back.getSign_type());
+            dto.setPaySign(back.getPay_sign());
+            dto.setPaySn(records.getPaySn());
+            return VaultsResponse.success(dto);
+        }
 
-        return null;
+        return VaultsResponse.failed(back.getResult().getComment());
 
     }
 
     @Override
-    public void payNotification(PayNotification payNotification) {
+    public String payNotification(PayNotification payNotification) {
 
+        QueryWrapper<PaymentRecords> queryMapper = new QueryWrapper<>();
+        queryMapper.eq("pay_id",payNotification.getPos_seq());
+        try {
+            PaymentRecords pr = paymentRecordsService.getOne(queryMapper);
+            if(pr.getStatus() == -1){
+                pr.setStatus(Integer.parseInt(payNotification.getStatus()));
+                pr.setEndTime(payNotification.getEnd_time());
+                pr.setSource(payNotification.getSource());
+                pr.setPosId(payNotification.getPos_id());
+                pr.setPayType(payNotification.getPay_type());
+                pr.setTransType(payNotification.getTrans_type());
+                pr.setTradeNo(payNotification.getTrade_no());
+
+                PayReceive payReceive = new PayReceive();
+                payReceive.setPayId(pr.getPayId());
+                payReceive.setPaySn(pr.getPaySn());
+                payReceive.setOperatorId(pr.getOperatorId());
+                payReceive.setTradeNo(payNotification.getPos_seq());
+                VaultsResponse vaultsResponse = orderFeignClient.changeOrderPay(payReceive);
+                if(vaultsResponse.validate()){
+                    paymentRecordsService.updateById(pr);
+                }else {
+                    return "fail";
+                }
+
+            }else{
+                log.info("重复推送支付成功消息---"+pr.getPaySn());
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return "fail";
+        }
+            return "success";
     }
 }

+ 1 - 16
src/main/java/com/poteviohealth/ym/ipos/utils/YmUtil.java

@@ -1,29 +1,14 @@
 package com.poteviohealth.ym.ipos.utils;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
-import com.alibaba.fastjson.TypeReference;
 import com.google.common.collect.Maps;
-import com.google.gson.internal.LinkedHashTreeMap;
-import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.cgp.common.utils.HttpUtils;
-import com.poteviohealth.ym.ipos.model.merchant.Picture;
-import com.poteviohealth.ym.ipos.model.merchant.UserSearch;
-import com.poteviohealth.ym.ipos.model.merchant.back.ImageListBack;
-import com.poteviohealth.ym.ipos.model.merchant.back.PictureBack;
-import com.poteviohealth.ym.ipos.model.merchant.back.UserSearchBack;
-import com.poteviohealth.ym.ipos.model.merchant.detail.PictureDetail;
-import com.poteviohealth.ym.ipos.model.merchant.detail.UserSearchDetail;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.commons.lang3.ArrayUtils;
 
 import java.lang.reflect.Field;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * 请求返回类封装
@@ -34,7 +19,7 @@ public class YmUtil {
 
     private static final  String SECRETKEY = "test";
     public static final String SUCCESS =  "0000";
-
+    public static final String FAIL =  "9998";
     private static final  String URL = "https://ipos-sa.imageco.cn";
 
     public static <T> Object resultBack(T obj, T clazz) throws IllegalAccessException {

+ 4 - 0
src/main/resources/mapper/ipos/PaymentRecordsMapper.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.poteviohealth.ym.ipos.mapper.PaymentRecordsMapper">
+</mapper>

+ 1 - 0
src/main/resources/uat/application.yml

@@ -49,6 +49,7 @@ pay:
     code: ZKY
     ip: 123.56.196.46
     split: 0.7
+    notifyUrl : http://dev.poteviohealth.com/gateway/order/receive/payNotify
 
 ribbon:
   ReadTimeout: 50000