Jelajahi Sumber

三方支付支持对平台运营商

qin 1 tahun lalu
induk
melakukan
3b69ae0463
19 mengubah file dengan 382 tambahan dan 40 penghapusan
  1. 43 0
      src/main/java/com/poteviohealth/ym/ipos/common/Basic.java
  2. 10 0
      src/main/java/com/poteviohealth/ym/ipos/controller/ReceivePayAndRefundController.java
  3. 12 0
      src/main/java/com/poteviohealth/ym/ipos/mapper/BasicMapper.java
  4. 26 0
      src/main/java/com/poteviohealth/ym/ipos/model/BasicConfiguration.java
  5. 2 2
      src/main/java/com/poteviohealth/ym/ipos/model/base/Base.java
  6. 2 2
      src/main/java/com/poteviohealth/ym/ipos/model/payment/ChangeBindPos.java
  7. 38 0
      src/main/java/com/poteviohealth/ym/ipos/model/payment/ScanPayOrder.java
  8. 1 1
      src/main/java/com/poteviohealth/ym/ipos/model/payment/detail/Wxapp.java
  9. 45 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/DelayConfirmNotification.java
  10. 9 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecords.java
  11. 18 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecordsDetail.java
  12. 3 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/detail/PayConfirmDetail.java
  13. 29 0
      src/main/java/com/poteviohealth/ym/ipos/model/split/detail/SplitConfirmDetail.java
  14. 7 0
      src/main/java/com/poteviohealth/ym/ipos/service/ISplitService.java
  15. 39 13
      src/main/java/com/poteviohealth/ym/ipos/service/impl/MerchantServiceImpl.java
  16. 26 10
      src/main/java/com/poteviohealth/ym/ipos/service/impl/PaymentServiceImpl.java
  17. 70 6
      src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitServiceImpl.java
  18. 1 3
      src/main/resources/uat/application.yml
  19. 1 3
      src/main/resources/zky/application.yml

+ 43 - 0
src/main/java/com/poteviohealth/ym/ipos/common/Basic.java

@@ -0,0 +1,43 @@
+package com.poteviohealth.ym.ipos.common;
+
+import com.poteviohealth.ym.ipos.model.BasicConfiguration;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 三方支付基础信息配置
+ * @author Qin
+ */
+@Log4j2
+@Service
+public class  Basic {
+    public static Map<Integer, BasicConfiguration> basicMaps = new HashMap<>(2);
+    @PostConstruct
+    public void init(){
+        BasicConfiguration defaultBc = new BasicConfiguration();
+        defaultBc.setOperatorId(0);
+        defaultBc.setCode("CHECG");
+        defaultBc.setPid("00436433");
+        defaultBc.setSystemId("5447");
+        defaultBc.setMchId("6666000142736819");
+        basicMaps.put(0,defaultBc);
+        //四川
+        BasicConfiguration scBc = new BasicConfiguration();
+      /*  bcf.setOperatorId()
+        basicMaps.put(15,)*/
+
+
+    }
+
+    public static BasicConfiguration getSystemParameter(Integer operatorId){
+        if(basicMaps.containsKey(operatorId)){
+            return basicMaps.get(operatorId);
+        }else{
+            return basicMaps.get(0);
+        }
+    }
+}

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

@@ -5,6 +5,7 @@ import com.poteviohealth.cgp.common.facade.log.OperationLog;
 import com.poteviohealth.cgp.common.integrated.LongParams;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.ym.ipos.model.payment.PayNotification;
+import com.poteviohealth.ym.ipos.model.split.DelayConfirmNotification;
 import com.poteviohealth.ym.ipos.service.IPaymentService;
 import com.poteviohealth.ym.ipos.service.ISplitService;
 import io.swagger.annotations.ApiOperation;
@@ -39,6 +40,15 @@ public class ReceivePayAndRefundController {
         return paymentService.payNotification(payNotification);
     }
 
+
+    @ApiOperation(value="延时分账回调")
+    @RequestMapping(value = "/delayConfirmNotify",method = RequestMethod.POST)
+    @ResponseBody
+    @OperationLog(type = OperateType.ADD, description = "支付回调")
+    public String delayConfirmNotify(@RequestBody DelayConfirmNotification delayConfirmNotification){
+        return splitService.delayConfirmNotify(delayConfirmNotification);
+    }
+
     @ApiOperation(value="延时交易确认退回")
     @RequestMapping(value = "/delayConfirmRefund",method = RequestMethod.POST)
     public VaultsResponse delayConfirmRefund(@RequestBody LongParams params){

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

@@ -0,0 +1,12 @@
+package com.poteviohealth.ym.ipos.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.poteviohealth.ym.ipos.model.BasicConfiguration;
+
+/**
+ * 基础配置
+ * @author Qin
+ */
+public interface BasicMapper extends BaseMapper<BasicConfiguration> {
+
+}

+ 26 - 0
src/main/java/com/poteviohealth/ym/ipos/model/BasicConfiguration.java

@@ -0,0 +1,26 @@
+package com.poteviohealth.ym.ipos.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 基础配置
+ * @author Qin
+ */
+@Data
+public class BasicConfiguration{
+    @ApiModelProperty(value = "平台运营商Id:由系统提供")
+    private Integer operatorId;
+
+    @ApiModelProperty(value = "系统平台号:由翼码提供")
+    private String systemId;
+
+    @ApiModelProperty(value = "商户号:由翼码提供")
+    private String pid;
+
+    @ApiModelProperty(value = "门店号:自定义")
+    private String code;
+
+    @ApiModelProperty(value = "微信或通道商户号,固定值")
+    private String mchId;
+}

+ 2 - 2
src/main/java/com/poteviohealth/ym/ipos/model/base/Base.java

@@ -15,10 +15,10 @@ public class Base {
     private String sign;
 
     @ApiModelProperty(value = "系统平台号:由翼码提供",required = true)
-    private String system_id = "5447";
+    private String system_id;
 
     @ApiModelProperty(value = "商户号:翼码商户号,由翼码提供",required = true)
-    private String isspid = "00436433";
+    private String isspid;
 
     @ApiModelProperty(value = "终端流水号:同一个商户必须唯一,且大于12位",required = true)
     private String pos_seq = CgpTool.generateKey().toString();

+ 2 - 2
src/main/java/com/poteviohealth/ym/ipos/model/payment/ChangeBindPos.java

@@ -16,10 +16,10 @@ public class ChangeBindPos{
     private String sign;
 
     @ApiModelProperty(value = "系统平台号:由翼码提供",required = true)
-    private String system_id = "5447";
+    private String system_id;
 
     @ApiModelProperty(value = "商户号:翼码商户号,由翼码提供",required = true)
-    private String isspid = "00436433";
+    private String isspid;
 
     @ApiModelProperty(value = "请求类型,固定值:store_edit_request",required = true)
     private String request_type = "store_edit_request";

+ 38 - 0
src/main/java/com/poteviohealth/ym/ipos/model/payment/ScanPayOrder.java

@@ -0,0 +1,38 @@
+package com.poteviohealth.ym.ipos.model.payment;
+
+import com.poteviohealth.ym.ipos.model.base.Base;
+import com.poteviohealth.ym.ipos.model.payment.detail.PayDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 4.3.扫码支付交易
+ * https://open.wangcaio2o.com/docs/ipos-sa/4.3.md
+ * @author Qin
+ */
+@Data
+public class ScanPayOrder extends Base {
+    @ApiModelProperty(value = "请求类型,固定值:scanpay_request",required = true)
+    private String request_type = "scanpay_request";
+
+    @ApiModelProperty(value = "终端号,商户自定义终端号",required = true)
+    private String pos_id;
+
+    @ApiModelProperty(value = "门店号,商户自定义门店号",required = true)
+    private String store_id;
+
+    @ApiModelProperty(value = "操作员标识,操作员号")
+    private String user_id;
+
+    @ApiModelProperty(value = "设备IP,发起交易的门店公网IP\n" +
+            "根据央行要求必须传门店真实公网IP\n" +
+            "否则商家会被风控!!!")
+    private String device_ip;
+
+    @ApiModelProperty(value = "订单备注")
+    private String memo;
+
+    @ApiModelProperty(value = "支付详情")
+    private PayDetail unifiedorder_request;
+
+}

+ 1 - 1
src/main/java/com/poteviohealth/ym/ipos/model/payment/detail/Wxapp.java

@@ -14,7 +14,7 @@ public class Wxapp {
     private String tunnel ="b";
 
     @ApiModelProperty(value = "微信或通道商户号,固定值",required = true)
-    private String mch_id="6666000142736819";
+    private String mch_id;
 
     @ApiModelProperty(value = "小程序appid",required = true)
     private String appid;

+ 45 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/DelayConfirmNotification.java

@@ -0,0 +1,45 @@
+package com.poteviohealth.ym.ipos.model.split;
+
+import com.poteviohealth.ym.ipos.model.split.detail.SplitConfirmDetail;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 4.29.延时分账结果通知
+ * https://open.wangcaio2o.com/docs/ipos-sa/4.29.md
+ * @author Qin
+ */
+@Data
+public class DelayConfirmNotification {
+    @ApiModelProperty(value = "签名",required = true)
+    private String sign;
+
+    @ApiModelProperty(value = "商户号,交易的翼码商户号",required = true)
+    private String isspid;
+
+    @ApiModelProperty(value = "支付请求流水号,请求支付类接口的流水号(pos_seq)")
+    private String pos_seq;
+
+    @ApiModelProperty(value = "分账流水号",required = true)
+    private String split_seq;
+
+    @ApiModelProperty(value = "交易类型 a:延时分账 b:延时分账退回",required = true)
+    private String type;
+
+    @ApiModelProperty(value = "交易状态 s:成功 f:失败 z:部分成功 部分成功时,需要具体判断明细中的分账状态",required = true)
+    private String trade_state;
+
+    @ApiModelProperty(value = "失败原因")
+    private String error_desc;
+
+    @ApiModelProperty(value = "原商户请求流水号,被退回的延时交易确认的商户请求流水号,通过企账通控台分账的交易,通知中没有此节点")
+    private String org_pos_seq;
+
+    @ApiModelProperty(value = "原分账流水号,被退回的延时分账流水在企账通系统的流水号")
+    private String org_split_seq;
+
+    @ApiModelProperty(value = "分账明细")
+    private List<SplitConfirmDetail> split_detail;
+}

+ 9 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecords.java

@@ -37,4 +37,13 @@ public class SplitRecords extends BaseEntity {
 
     @ApiModelProperty(value = "失败原因")
     private String comment;
+
+    @ApiModelProperty(value = "交易类型 a:延时分账 b:延时分账退回",required = true)
+    private String type;
+
+    @ApiModelProperty(value = "交易状态 s:成功 f:失败 z:部分成功 部分成功时,需要具体判断明细中的分账状态",required = true)
+    private String tradeState;
+
+    @ApiModelProperty(value = "失败原因")
+    private String errorDesc;
 }

+ 18 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/SplitRecordsDetail.java

@@ -28,4 +28,22 @@ public class SplitRecordsDetail extends BaseEntity {
 
     @ApiModelProperty(value = "分账金额")
     private String divAmt;
+
+    /**
+     * 以下参数为回调返回参数
+     */
+    @ApiModelProperty(value = "金额(分)")
+    private Integer amount;
+
+    @ApiModelProperty(value = "分账接收方的收款账户编号,当mch_type=b时必填")
+    private String sellerAccount;
+
+    @ApiModelProperty(value = "分账状态s:成功f:失败",required = true)
+    private String tradeState;
+
+    @ApiModelProperty(value = "分账类型a:参与分账b:收款账户自留",required = true)
+    private String type;
+
+    @ApiModelProperty(value = "接收方类型a:分账商户b:收款账户",required = true)
+    private String mchType;
 }

+ 3 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/PayConfirmDetail.java

@@ -13,6 +13,9 @@ public class PayConfirmDetail {
     @ApiModelProperty(value = "支付请求流水号,被确认的支付请求流水号",required = true)
     private String org_pos_seq;
 
+    @ApiModelProperty(value = "异步通知地址")
+    private String notify_url;
+
     @ApiModelProperty(value = "扩展参数,用于扩展一些特殊的支付参数字段")
     private ExtendParamsConfirm extend_params;
 

+ 29 - 0
src/main/java/com/poteviohealth/ym/ipos/model/split/detail/SplitConfirmDetail.java

@@ -0,0 +1,29 @@
+package com.poteviohealth.ym.ipos.model.split.detail;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * 分账明细
+ * @author Qin
+ */
+@Data
+public class SplitConfirmDetail {
+    @ApiModelProperty(value = "金额(分)")
+    private Integer amount;
+
+    @ApiModelProperty(value = "分账接收方的分账商户号,当mch_type=a时必填")
+    private String merchant_id;
+
+    @ApiModelProperty(value = "分账接收方的收款账户编号,当mch_type=b时必填")
+    private String seller_account;
+
+    @ApiModelProperty(value = "分账状态s:成功f:失败",required = true)
+    private String trade_state;
+
+    @ApiModelProperty(value = "分账类型a:参与分账b:收款账户自留",required = true)
+    private String type;
+
+    @ApiModelProperty(value = "接收方类型a:分账商户b:收款账户",required = true)
+    private String mch_type;
+}

+ 7 - 0
src/main/java/com/poteviohealth/ym/ipos/service/ISplitService.java

@@ -3,6 +3,7 @@ package com.poteviohealth.ym.ipos.service;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.ym.ipos.model.back.BaseBack;
 import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
+import com.poteviohealth.ym.ipos.model.split.DelayConfirmNotification;
 import com.poteviohealth.ym.ipos.model.split.SplitRecords;
 import com.poteviohealth.ym.ipos.model.split.SplitRecordsDetail;
 import com.poteviohealth.ym.ipos.model.split.back.AccountBalanceBack;
@@ -77,4 +78,10 @@ public interface ISplitService{
      * @return
      */
     VaultsResponse<WithdrawBack> withdrawQuery(String withdrawSeq);
+
+    /**
+     * 延时分账回调
+     * @param delayConfirmNotification
+     */
+    String delayConfirmNotify(DelayConfirmNotification delayConfirmNotification);
 }

+ 39 - 13
src/main/java/com/poteviohealth/ym/ipos/service/impl/MerchantServiceImpl.java

@@ -8,6 +8,8 @@ import com.poteviohealth.cgp.common.integrated.OperatorIdParams;
 import com.poteviohealth.cgp.common.integrated.customer.CustomerFeignClient;
 import com.poteviohealth.cgp.common.integrated.partner.PartnerFeignClient;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
+import com.poteviohealth.ym.ipos.common.Basic;
+import com.poteviohealth.ym.ipos.model.BasicConfiguration;
 import com.poteviohealth.ym.ipos.model.back.BaseBack;
 import com.poteviohealth.ym.ipos.model.merchant.*;
 import com.poteviohealth.ym.ipos.model.merchant.back.ImageListBack;
@@ -25,7 +27,6 @@ import com.poteviohealth.ym.ipos.service.IPaymentService;
 import com.poteviohealth.ym.ipos.utils.YmUtil;
 import lombok.extern.log4j.Log4j2;
 import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -49,9 +50,6 @@ public class MerchantServiceImpl implements IMerchantService {
     @Resource
     private IPaymentService paymentService;
 
-    @Value("${pay.field.code}")
-    private String code;
-
     /**
      * 上传图片
      * @param dto
@@ -59,7 +57,10 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     @Override
     public VaultsResponse<String> merchantPicture(ImageDto dto){
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
         Picture p = new Picture();
+        p.setSystem_id(bc.getSystemId());
+        p.setIsspid(bc.getPid());
         PictureDetail detail = new PictureDetail();
         detail.setType(dto.getType());
         detail.setImage_name(dto.getName());
@@ -88,6 +89,7 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     @Override
     public VaultsResponse merchantCreateOpen(UserDto dto) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
         dto.setRemained_amt(dto.getRemained_amt()*100);
         VaultsResponse<UserSearchBack> vaultsResponse = this.merchantQuery(dto.getPhone(),null);
         if(!vaultsResponse.validate()){
@@ -131,7 +133,7 @@ public class MerchantServiceImpl implements IMerchantService {
             }
             VaultsResponse<String> openModifyVault = this.merchantOpenModify(dto);
 
-            VaultsResponse<String> stringVault = updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),2,dto.getRemained_amt());
+            VaultsResponse<String> stringVault = updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),2,dto.getRemained_amt(),basicConfig.getCode());
             if(!stringVault.validate()){
                 log.info("stringVault==="+stringVault);
                 return stringVault;
@@ -140,9 +142,9 @@ public class MerchantServiceImpl implements IMerchantService {
             if(dto.getSourceId().equals(1)){
                 BindDto bd = new BindDto();
                 bd.setAppId(stringVault.getData());
-                bd.setPosId(code);
+                bd.setPosId(basicConfig.getCode());
                 bd.setStoreId(dto.getId().toString());
-                bd.setName("("+code+")"+dto.getMerchant_short_name());
+                bd.setName("("+basicConfig.getCode()+")"+dto.getMerchant_short_name());
                 //修改门店信息
                 if(!dto.getMerchant_short_name().equals(searchBack.getBase_merchant_short_name())){
                     VaultsResponse changeVr = paymentService.changeBindPos(bd);
@@ -173,7 +175,7 @@ public class MerchantServiceImpl implements IMerchantService {
                         return entregisterVault;
                     }
                 }
-                updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),3,dto.getRemained_amt());
+                updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),3,dto.getRemained_amt(),basicConfig.getCode());
             }else{
                 VaultsResponse<String> indvmodifyVault = this.modifyVault(dto);
                 if(!indvmodifyVault.validate()){
@@ -189,7 +191,7 @@ public class MerchantServiceImpl implements IMerchantService {
                 return openVault;
             }
            // if(status != 2){
-                VaultsResponse<String> stringVault = updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),2,dto.getRemained_amt());
+                VaultsResponse<String> stringVault = updateMerchantId(dto.getId(), dto.getSourceId(), dto.getMerchant_id(),2,dto.getRemained_amt(),basicConfig.getCode());
 
                 if(!stringVault.validate()){
                     log.info("stringVault==="+stringVault);
@@ -199,9 +201,9 @@ public class MerchantServiceImpl implements IMerchantService {
                    //终端绑定交易
                    BindDto bd = new BindDto();
                    bd.setAppId(stringVault.getData());
-                   bd.setPosId(code);
+                   bd.setPosId(basicConfig.getCode());
                    bd.setStoreId(dto.getId().toString());
-                   bd.setName("("+code+")"+dto.getMerchant_short_name());
+                   bd.setName("("+basicConfig.getCode()+")"+dto.getMerchant_short_name());
                    return paymentService.bindPos(bd);
                }
            // }
@@ -235,6 +237,9 @@ public class MerchantServiceImpl implements IMerchantService {
     private VaultsResponse merchantCreate(UserDto dto) {
 
         User user = new User();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        user.setSystem_id(bc.getSystemId());
+        user.setIsspid(bc.getPid());
         UserDetail detail = new UserDetail();
         detail.setType(dto.getType());
         detail.setMerchant_short_name(dto.getMerchant_short_name());
@@ -250,7 +255,7 @@ public class MerchantServiceImpl implements IMerchantService {
         }
 
         if(YmUtil.SUCCESS.equals(back.getResult().getId())){
-           VaultsResponse vaultsResponse = updateMerchantId(dto.getId(), dto.getSourceId(), back.getMerchant_id(),0,dto.getRemained_amt());
+           VaultsResponse vaultsResponse = updateMerchantId(dto.getId(), dto.getSourceId(), back.getMerchant_id(),0,dto.getRemained_amt(),bc.getCode());
            if(!vaultsResponse.validate()){
                return vaultsResponse;
            }
@@ -259,7 +264,7 @@ public class MerchantServiceImpl implements IMerchantService {
         return VaultsResponse.failed(back.getResult().getComment());
     }
 
-    private VaultsResponse updateMerchantId(Integer id, Integer source, String merchantId,Integer status,Long remainedAmt) {
+    private VaultsResponse updateMerchantId(Integer id, Integer source, String merchantId,Integer status,Long remainedAmt,String code) {
         VaultsResponse vaultsResponse;
         OperatorIdParams operatorIdParams = new OperatorIdParams();
         operatorIdParams.setOperatorId(TokenContext.cureOperatorId());
@@ -286,6 +291,9 @@ public class MerchantServiceImpl implements IMerchantService {
     private VaultsResponse merchantIndvregister(UserDto dto){
 
         IndvregisterAdd iAdd = new IndvregisterAdd();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        iAdd.setSystem_id(bc.getSystemId());
+        iAdd.setIsspid(bc.getPid());
         IndvregisterAddDetail detail = new IndvregisterAddDetail();
         detail.setMerchant_id(dto.getMerchant_id());
         detail.setIdentity_begin_date(dto.getIdentity_begin_date());
@@ -322,6 +330,9 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     private VaultsResponse merchantIndvmodify(UserDto dto){
         IndvregisterUpdate iUpdate = new IndvregisterUpdate();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        iUpdate.setSystem_id(bc.getSystemId());
+        iUpdate.setIsspid(bc.getPid());
         IndvregisterUpdateDetail iUpdateDetail = new IndvregisterUpdateDetail();
         iUpdateDetail.setMerchant_id(dto.getMerchant_id());
         iUpdateDetail.setIdentity_begin_date(dto.getIdentity_begin_date());
@@ -375,6 +386,9 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     private VaultsResponse merchantEntregister(UserDto dto){
         EntregisterAdd iAdd = new EntregisterAdd();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        iAdd.setSystem_id(bc.getSystemId());
+        iAdd.setIsspid(bc.getPid());
         EntregisterAddDetail detail = new EntregisterAddDetail();
         detail.setMerchant_id(dto.getMerchant_id());
         detail.setLicense_begin_date(dto.getLicense_begin_date());
@@ -424,6 +438,9 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     private VaultsResponse merchantEntmodify(UserDto dto){
         EntregisterUpdate iUpdate = new EntregisterUpdate();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        iUpdate.setSystem_id(bc.getSystemId());
+        iUpdate.setIsspid(bc.getPid());
         EntregisterUpdateDetail iUpdateDetail = new EntregisterUpdateDetail();
         iUpdateDetail.setMerchant_id(dto.getMerchant_id());
         iUpdateDetail.setLicense_begin_date(dto.getLicense_begin_date());
@@ -499,6 +516,9 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     private VaultsResponse merchantOpen(UserDto dto){
         OpenAdd openAdd = new OpenAdd();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        openAdd.setSystem_id(bc.getSystemId());
+        openAdd.setIsspid(bc.getPid());
         openAdd.setMerchant_open_request(this.fill(dto));
         BaseBack back = null;
         try {
@@ -567,6 +587,9 @@ public class MerchantServiceImpl implements IMerchantService {
      */
     private VaultsResponse merchantOpenModify(UserDto dto){
         OpenUpdate openUpdate = new OpenUpdate();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        openUpdate.setSystem_id(bc.getSystemId());
+        openUpdate.setIsspid(bc.getPid());
         openUpdate.setMerchant_openmodify_request(this.fill(dto));
         BaseBack back = null;
         try {
@@ -591,6 +614,9 @@ public class MerchantServiceImpl implements IMerchantService {
     @Override
     public VaultsResponse<UserSearchBack> merchantQuery(String phone, String merchantId){
         UserSearch userSearch = new UserSearch();
+        BasicConfiguration bc = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        userSearch.setSystem_id(bc.getSystemId());
+        userSearch.setIsspid(bc.getPid());
         UserSearchDetail detail = new UserSearchDetail();
         detail.setPhone(phone);
         detail.setMerchant_id(merchantId);

+ 26 - 10
src/main/java/com/poteviohealth/ym/ipos/service/impl/PaymentServiceImpl.java

@@ -7,6 +7,8 @@ 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.ym.ipos.common.Basic;
+import com.poteviohealth.ym.ipos.model.BasicConfiguration;
 import com.poteviohealth.ym.ipos.model.payment.*;
 import com.poteviohealth.ym.ipos.model.payment.back.*;
 import com.poteviohealth.ym.ipos.model.payment.detail.*;
@@ -31,11 +33,8 @@ 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;
+    @Value("${pay.field.url}")
+    private String url;
 
     @Resource
     private IPaymentRecordsService paymentRecordsService;
@@ -45,8 +44,11 @@ public class PaymentServiceImpl implements IPaymentService {
 
     @Override
     public VaultsResponse bindPos(BindDto dto) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
         BindPos pos = new BindPos();
         pos.setPos_id(dto.getPosId());
+        pos.setSystem_id(basicConfig.getSystemId());
+        pos.setIsspid(basicConfig.getPid());
         StoreInfo storeInfo = new StoreInfo();
         storeInfo.setStore_id(dto.getStoreId());
         storeInfo.setStore_name(dto.getName());
@@ -54,6 +56,7 @@ public class PaymentServiceImpl implements IPaymentService {
 
         PayParams payParams = new PayParams();
         Wxapp app = new Wxapp();
+        app.setMch_id(basicConfig.getMchId());
         app.setAppid(dto.getAppId());
         payParams.setWxapp(app);
         pos.setPay_params(payParams);
@@ -76,6 +79,9 @@ public class PaymentServiceImpl implements IPaymentService {
     public VaultsResponse changeBindPos(BindDto dto) {
         ChangeBindPos pos = new ChangeBindPos();
         pos.setStore_id(dto.getStoreId());
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        pos.setSystem_id(basicConfig.getSystemId());
+        pos.setIsspid(basicConfig.getPid());
         StoreInfoChange storeInfo = new StoreInfoChange();
         storeInfo.setStore_name(dto.getName());
         pos.setStore_info(storeInfo);
@@ -97,7 +103,8 @@ public class PaymentServiceImpl implements IPaymentService {
 
     @Override
     public VaultsResponse<PayQueryBack> barcodeQuery(String transactionId) {
-
+        //此方法暂不可用,没有operatorId
+        //BasicConfiguration basicConfig = Basic.getSystemParameter(records.getOperatorId());
         PayQuery payQuery = new PayQuery();
         payQuery.setPos_id(TokenContext.curePosId());
         payQuery.setStore_id(TokenContext.cureStoreId());
@@ -121,8 +128,11 @@ public class PaymentServiceImpl implements IPaymentService {
 
     @Override
     public VaultsResponse barcodeReverse(RefundReceive refundReceive) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(refundReceive.getOperatorId());
         PayReverse payReverse = new PayReverse();
-        payReverse.setPos_id(code);
+        payReverse.setSystem_id(basicConfig.getSystemId());
+        payReverse.setIsspid(basicConfig.getPid());
+        payReverse.setPos_id(basicConfig.getCode());
         payReverse.setStore_id(refundReceive.getOperatorId().toString());
         payReverse.setPos_seq(refundReceive.getRefundId().toString());
         PayReverseDetail detail = new PayReverseDetail();
@@ -146,9 +156,12 @@ public class PaymentServiceImpl implements IPaymentService {
 
     @Override
     public VaultsResponse barcodeRefundQuery(String transactionId,String operatorId) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(Integer.parseInt(operatorId));
         PayRefundQuery payRefundQuery = new PayRefundQuery();
-        payRefundQuery.setPos_id(code);
+        payRefundQuery.setPos_id(basicConfig.getCode());
         payRefundQuery.setStore_id(operatorId);
+        payRefundQuery.setSystem_id(basicConfig.getSystemId());
+        payRefundQuery.setIsspid(basicConfig.getPid());
         PayQueryDetail detail = new PayQueryDetail();
         detail.setOrg_pos_seq(transactionId);
         payRefundQuery.setBarcode_refundquery_request(detail);
@@ -170,16 +183,19 @@ public class PaymentServiceImpl implements IPaymentService {
 
     @Override
     public VaultsResponse<PayInfoAppOutDTO> unifiedOrder(PaymentRecords records) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(records.getOperatorId());
         PayInfoAppOutDTO dto = new PayInfoAppOutDTO();
         PayOrder payOrder = new PayOrder();
         payOrder.setPos_seq(records.getPayId().toString());
-        payOrder.setPos_id(code);
+        payOrder.setPos_id(basicConfig.getCode());
         payOrder.setStore_id(records.getOperatorId().toString());
         payOrder.setDevice_ip(ip);
+        payOrder.setSystem_id(basicConfig.getSystemId());
+        payOrder.setIsspid(basicConfig.getPid());
         PayDetail detail = new PayDetail();
         detail.setBuyer_id(records.getOpenid());
         detail.setTx_amt(records.getTxAmt());
-        detail.setNotify_url(notifyUrl);
+        detail.setNotify_url(url+"/payNotify");
         ExtendParams extendParams = new ExtendParams();
         extendParams.setPlan_split_date(records.getPlanSplitDate());
         detail.setExtend_params(extendParams);

+ 70 - 6
src/main/java/com/poteviohealth/ym/ipos/service/impl/SplitServiceImpl.java

@@ -8,6 +8,8 @@ import com.google.common.collect.Lists;
 import com.poteviohealth.cgp.common.filter.TokenContext;
 import com.poteviohealth.cgp.common.model.VaultsResponse;
 import com.poteviohealth.cgp.common.utils.CgpTool;
+import com.poteviohealth.ym.ipos.common.Basic;
+import com.poteviohealth.ym.ipos.model.BasicConfiguration;
 import com.poteviohealth.ym.ipos.model.back.BaseBack;
 import com.poteviohealth.ym.ipos.model.payment.PayRefundQuery;
 import com.poteviohealth.ym.ipos.model.split.*;
@@ -35,9 +37,8 @@ import java.util.stream.Collectors;
 @Service
 public class SplitServiceImpl implements ISplitService {
 
-    @Value("${pay.field.code}")
-    private String code;
-
+    @Value("${pay.field.url}")
+    private String url;
     @Resource
     private ISplitRecordsService splitRecordsService;
     @Resource
@@ -47,12 +48,16 @@ public class SplitServiceImpl implements ISplitService {
 
     @Override
     public VaultsResponse delayConfirm(SplitRecords records, List<SplitRecordsDetail> details) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(records.getOperatorId());
         PayConfirm payConfirm = new PayConfirm();
-        payConfirm.setPos_id(code);
+        payConfirm.setPos_id(basicConfig.getCode());
+        payConfirm.setSystem_id(basicConfig.getSystemId());
+        payConfirm.setIsspid(basicConfig.getPid());
         payConfirm.setPos_seq(records.getSplitId().toString());
         payConfirm.setStore_id(records.getOperatorId().toString());
         PayConfirmDetail detail = new PayConfirmDetail();
         detail.setOrg_pos_seq(records.getPayId().toString());
+        detail.setNotify_url(url+"/delayConfirmNotify");
         ExtendParamsConfirm extendParamsConfirm = new ExtendParamsConfirm();
         SplitInfoConfirm splitInfoConfirm = new SplitInfoConfirm();
         List<SplitListConfirm> list = Lists.newArrayList();
@@ -91,8 +96,11 @@ public class SplitServiceImpl implements ISplitService {
 
     @Override
     public VaultsResponse delayConfirmQuery(String splitId,String operatorId) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(Integer.parseInt(operatorId));
         PayConfirmQuery paymentQuery =  new PayConfirmQuery();
-        paymentQuery.setPos_id(code);
+        paymentQuery.setPos_id(basicConfig.getCode());
+        paymentQuery.setSystem_id(basicConfig.getSystemId());
+        paymentQuery.setIsspid(basicConfig.getPid());
         paymentQuery.setStore_id(operatorId);
         DelayConfirmQueryRequest detail = new DelayConfirmQueryRequest();
         detail.setOrg_pos_seq(splitId);
@@ -114,15 +122,20 @@ public class SplitServiceImpl implements ISplitService {
 
     @Override
     public VaultsResponse delayConfirmRefund(Long splitId) {
+
         QueryWrapper queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("split_id",splitId);
         SplitRecords splitRecords = splitRecordsService.getOne(queryWrapper);
+        BasicConfiguration basicConfig = Basic.getSystemParameter(splitRecords.getOperatorId());
         List<SplitRecordsDetail> list = splitRecordsDetailService.list(queryWrapper);
         PayConfirmRefund payConfirmRefund =  new PayConfirmRefund();
-        payConfirmRefund.setPos_id(code);
+        payConfirmRefund.setPos_id(basicConfig.getCode());
+        payConfirmRefund.setSystem_id(basicConfig.getSystemId());
+        payConfirmRefund.setIsspid(basicConfig.getPid());
         payConfirmRefund.setStore_id(splitRecords.getOperatorId().toString());
         PayConfirmDetail detail = new PayConfirmDetail();
         detail.setOrg_pos_seq(splitId.toString());
+        detail.setNotify_url(url+"/delayConfirmNotify");
         ExtendParamsConfirm extendParamsConfirm = new ExtendParamsConfirm();
         SplitInfoConfirm splitInfoConfirm = new SplitInfoConfirm();
         List<SplitListConfirm> split_list = Lists.newArrayList();
@@ -164,6 +177,9 @@ public class SplitServiceImpl implements ISplitService {
     @Override
     public VaultsResponse<SettlementQueryBack> merchantSettlementQuery(SettlementQueryDetail detail) {
         SettlementQuery settlementQuery =  new SettlementQuery();
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
+        settlementQuery.setSystem_id(basicConfig.getSystemId());
+        settlementQuery.setIsspid(basicConfig.getPid());
         settlementQuery.setMerchant_settlementquery_request(detail);
         SettlementQueryBack back = null;
 
@@ -190,8 +206,11 @@ public class SplitServiceImpl implements ISplitService {
 
     @Override
     public VaultsResponse<AccountBalanceBack> accountBalanceQuery(String merchantId) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
         AccountBalance accountBalance =  new AccountBalance();
         accountBalance.setMerchant_id(merchantId);
+        accountBalance.setSystem_id(basicConfig.getSystemId());
+        accountBalance.setIsspid(basicConfig.getPid());
         AccountBalanceBack back = null;
 
         try {
@@ -218,7 +237,10 @@ public class SplitServiceImpl implements ISplitService {
     @Override
     public VaultsResponse<WithdrawBack> withdraw(WithdrawDto dto) {
         Long withdrawId = CgpTool.generateKey();
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
         Withdraw withdraw =  new Withdraw();
+        withdraw.setSystem_id(basicConfig.getSystemId());
+        withdraw.setIsspid(basicConfig.getPid());
         withdraw.setPos_seq(withdrawId.toString());
         WithdrawDetail detail = new WithdrawDetail();
         detail.setMerchant_id(dto.getMerchantId());
@@ -254,7 +276,10 @@ public class SplitServiceImpl implements ISplitService {
 
     @Override
     public VaultsResponse<WithdrawBack> withdrawQuery(String withdrawSeq) {
+        BasicConfiguration basicConfig = Basic.getSystemParameter(TokenContext.cureOperatorId());
         WithdrawQuery withdraw =  new WithdrawQuery();
+        withdraw.setSystem_id(basicConfig.getSystemId());
+        withdraw.setIsspid(basicConfig.getPid());
         WithdrawQueryDetail detail = new WithdrawQueryDetail();
         detail.setWithdraw_seq(withdrawSeq);
         withdraw.setMerchant_withdrawquery_request(detail);
@@ -279,4 +304,43 @@ public class SplitServiceImpl implements ISplitService {
 
         return VaultsResponse.failed(back.getResult().getComment());
     }
+
+    @Override
+    public String delayConfirmNotify(DelayConfirmNotification delayConfirmNotification) {
+        try{
+            QueryWrapper<SplitRecords> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("split_id",delayConfirmNotification.getSplit_seq());
+            List<SplitRecords> list = splitRecordsService.list(queryWrapper);
+            for (SplitRecords splitRecords : list) {
+                splitRecords.setType(delayConfirmNotification.getType());
+                splitRecords.setErrorDesc(delayConfirmNotification.getError_desc());
+                splitRecords.setTradeState(delayConfirmNotification.getTrade_state());
+                if(splitRecords.getTradeState().equals("s")){
+                    splitRecords.setStatus(1);
+                }
+                QueryWrapper<SplitRecordsDetail> queryWrapper2 = new QueryWrapper<>();
+                queryWrapper2.eq("split_id",splitRecords.getSplitId());
+                List<SplitRecordsDetail> list2 = splitRecordsDetailService.list(queryWrapper2);
+                for (SplitRecordsDetail detail : list2) {
+                    for (SplitConfirmDetail confirmDetail : delayConfirmNotification.getSplit_detail()) {
+                        if(detail.getMerchantId().equals(confirmDetail.getMerchant_id())){
+                            detail.setAmount(confirmDetail.getAmount());
+                            detail.setSellerAccount(confirmDetail.getSeller_account());
+                            detail.setTradeState(confirmDetail.getTrade_state());
+                            detail.setType(confirmDetail.getType());
+                            detail.setMchType(confirmDetail.getMch_type());
+                        }
+                    }
+                }
+                splitRecordsDetailService.updateBatchById(list2);
+            }
+            splitRecordsService.updateBatchById(list);
+
+        }catch (Exception e){
+            e.printStackTrace();
+            return "fail";
+        }
+
+        return "success";
+    }
 }

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

@@ -46,10 +46,8 @@ logging:
 
 pay:
   field:
-    code: CHECG
     ip: 101.201.117.73
-    split: 0.007
-    notifyUrl : https://dev.poteviohealth.com/gateway/ipos/receive/payNotify
+    url : https://dev.poteviohealth.com/gateway/ipos/receive
 
 ribbon:
   ReadTimeout: 50000

+ 1 - 3
src/main/resources/zky/application.yml

@@ -46,10 +46,8 @@ logging:
 
 pay:
   field:
-    code: CHECG
     ip: 106.37.165.111
-    split: 0.007
-    notifyUrl : https://jjyl.cy.checg.cn/gateway/ipos/receive/payNotify
+    url : https://jjyl.cy.checg.cn/gateway/ipos/receive
 
 ribbon:
   ReadTimeout: 50000