From: kaixiang.xia Date: Tue, 6 Apr 2021 02:35:23 +0000 (+0800) Subject: 新接口完善和其他修改 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=a39d7e87361acccea224ad2d512dc5284a87bc5f;p=epayment%2Ffood_payapi.git 新接口完善和其他修改 --- diff --git a/config/application-devel-pg-xkx.properties b/config/application-devel-pg-xkx.properties index 16830f55..15cf70af 100644 --- a/config/application-devel-pg-xkx.properties +++ b/config/application-devel-pg-xkx.properties @@ -12,7 +12,12 @@ spring.datasource.username=supwisdom spring.datasource.password=123456 database.dbtype=postgresql +# logging settings +spring.jpa.show-sql = false logging.level.org.hibernate.SQL=ERROR +logging.level.com.mascloud=ERROR +logging.level.root=info + # Redis settings spring.redis.host=localhost spring.redis.port=6379 diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserMessageData.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserMessageData.java new file mode 100644 index 00000000..666c6772 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserMessageData.java @@ -0,0 +1,20 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class UserMessageData { + private String msgid; //tb_msg的id + private String content; //tb_msg的content + private String lastupdate; //tb_msg的lastupdate + private String refno; //tb_msg的refno + private String transdesc; //refno对应流水的交易描述 + private Double amount; //refno对应流水的交易金额 + private String userid; //tb_msg的userid +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageParam.java new file mode 100644 index 00000000..d9a01e31 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageParam.java @@ -0,0 +1,28 @@ +package com.supwisdom.dlpay.api.bean; + +import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.Sign; +import com.supwisdom.dlpay.api.exception.RequestParamCheckException; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotEmpty; + +@Getter +@Setter +public class UserQueryMessageParam extends APIRequestParam { + @Sign + @NotEmpty(message = "用户ID不能为空") + private String userid; + + @Sign + private Integer pageNo; //可以为空,默认1 + + @Sign + private Integer pageSize; //可以为空,默认10 + + @Override + public boolean checkParam() throws RequestParamCheckException { + return true; + } +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageResponse.java new file mode 100644 index 00000000..b5e40286 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/UserQueryMessageResponse.java @@ -0,0 +1,20 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class UserQueryMessageResponse extends ApiResponse { + private int pageNo = 1; + private int pageSize = 10; + private int totalCount = 0; + private int totalPages = 0; + private List data; +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayConfirmParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayConfirmParam.java index 678c24e6..0b5851f8 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayConfirmParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayConfirmParam.java @@ -6,21 +6,22 @@ import com.supwisdom.dlpay.api.exception.RequestParamCheckException; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @Setter public class YnrccPayConfirmParam extends APIRequestParam { @Sign - @NotNull(message = "交易参考号不能为空") + @NotBlank(message = "交易参考号不能为空") private String refno; @Sign - @NotNull(message = "参数Plain不能为空") + @NotBlank(message = "参数Plain不能为空") private String plain; //农商行快捷支付参数 @Sign - @NotNull(message = "参数Signature不能为空") + @NotBlank(message = "参数Signature不能为空") private String signature; //农商行快捷支付参数 @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayLimitModifyParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayLimitModifyParam.java index 6845d83a..bd6e0006 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayLimitModifyParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayLimitModifyParam.java @@ -7,21 +7,22 @@ import lombok.Getter; import lombok.Setter; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @Getter @Setter public class YnrccPayLimitModifyParam extends APIRequestParam { @Sign - @NotEmpty(message = "用户ID不能为空") + @NotBlank(message = "用户ID不能为空") private String userid; @Sign - @NotEmpty(message = "银行卡号不能为空") + @NotBlank(message = "银行卡号不能为空") private String bankcardno; @Sign - @NotEmpty(message = "签约商户不能为空") + @NotBlank(message = "签约商户不能为空") private String shopaccno; @Sign diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayOrderParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayOrderParam.java index 6e66c41a..a497a13a 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayOrderParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayOrderParam.java @@ -7,6 +7,7 @@ import com.supwisdom.dlpay.api.util.DateUtil; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Positive; @@ -14,15 +15,15 @@ import javax.validation.constraints.Positive; @Setter public class YnrccPayOrderParam extends APIRequestParam { @Sign - @NotNull(message = "用户唯一号不能为空") + @NotBlank(message = "用户唯一号不能为空") private String userid; //用户userid @Sign - @NotNull(message = "银行卡号不能为空") + @NotBlank(message = "银行卡号不能为空") private String bankcardno; @Sign - @NotNull(message = "对接系统唯一订单号不能为空") + @NotBlank(message = "对接系统唯一订单号不能为空") private String billno; @Sign @@ -31,18 +32,18 @@ public class YnrccPayOrderParam extends APIRequestParam { private Integer amount; @Sign - @NotNull(message = "请指定交易商户") + @NotBlank(message = "请指定交易商户") private String shopaccno; @Sign - @NotNull(message = "交易日期不能为空") + @NotBlank(message = "交易日期不能为空") private String transdate; @Sign - @NotNull(message = "交易时间不能为空") + @NotBlank(message = "交易时间不能为空") private String transtime; @Sign - @NotNull(message = "流水类型不能为空") + @NotBlank(message = "流水类型不能为空") private String dtltype; @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayRefundParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayRefundParam.java index decc341c..73095ce2 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayRefundParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayRefundParam.java @@ -9,6 +9,7 @@ import lombok.Setter; import org.apache.commons.lang3.StringUtils; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Getter @@ -26,13 +27,13 @@ public class YnrccPayRefundParam extends APIRequestParam { private Integer refundAmount; @Sign - @NotNull(message = "撤销或退款流水号不能为空") + @NotBlank(message = "撤销或退款流水号不能为空") private String requestbillno; @Sign - @NotNull(message = "交易日期不能为空") + @NotBlank(message = "交易日期不能为空") private String transdate; @Sign - @NotNull(message = "交易时间不能为空") + @NotBlank(message = "交易时间不能为空") private String transtime; @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignApplyParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignApplyParam.java index 581316b8..da80b3a8 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignApplyParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignApplyParam.java @@ -6,21 +6,22 @@ import com.supwisdom.dlpay.api.exception.RequestParamCheckException; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @Getter @Setter public class YnrccPaySignApplyParam extends APIRequestParam { @Sign - @NotEmpty(message = "用户ID不能为空") + @NotBlank(message = "用户ID不能为空") private String userid; @Sign - @NotEmpty(message = "银行卡号不能为空") + @NotBlank(message = "银行卡号不能为空") private String bankcardno; @Sign - @NotEmpty(message = "签约商户不能为空") + @NotBlank(message = "签约商户不能为空") private String shopaccno; @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignCancelParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignCancelParam.java index 17e3b57b..9d83bafc 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignCancelParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignCancelParam.java @@ -6,21 +6,22 @@ import com.supwisdom.dlpay.api.exception.RequestParamCheckException; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @Getter @Setter public class YnrccPaySignCancelParam extends APIRequestParam { @Sign - @NotEmpty(message = "用户ID不能为空") + @NotBlank(message = "用户ID不能为空") private String userid; @Sign - @NotEmpty(message = "银行卡号不能为空") + @NotBlank(message = "银行卡号不能为空") private String bankcardno; @Sign - @NotEmpty(message = "签约商户不能为空") + @NotBlank(message = "签约商户不能为空") private String shopaccno; @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignConfirmParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignConfirmParam.java index 136bc588..aa85cb69 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignConfirmParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignConfirmParam.java @@ -6,6 +6,7 @@ import com.supwisdom.dlpay.api.exception.RequestParamCheckException; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotNull; @@ -13,15 +14,15 @@ import javax.validation.constraints.NotNull; @Setter public class YnrccPaySignConfirmParam extends APIRequestParam { @Sign - @NotEmpty(message = "签约号不能为空") + @NotBlank(message = "签约号不能为空") private String signNo; //申请时返回的签约号 @Sign - @NotNull(message = "参数Plain不能为空") + @NotBlank(message = "参数Plain不能为空") private String plain; //农商行快捷支付参数 @Sign - @NotNull(message = "参数Signature不能为空") + @NotBlank(message = "参数Signature不能为空") private String signature; //农商行快捷支付参数 @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignInfo.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignInfo.java new file mode 100644 index 00000000..785d5566 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignInfo.java @@ -0,0 +1,19 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +@Setter +public class YnrccPaySignInfo { + private String signNo; //申请时返回的签约号 + private String bankcardno; //签约银行卡号 + private String shopaccno; //核心平台商户账号 + private String shopname; //核心平台商户名称 + private String signtime; //签约时间 yyyyMMddHHmmss + private String userid; //核心平台用户ID +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryParam.java new file mode 100644 index 00000000..3a923d9c --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryParam.java @@ -0,0 +1,26 @@ +package com.supwisdom.dlpay.api.bean; + +import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.Sign; +import com.supwisdom.dlpay.api.exception.RequestParamCheckException; +import lombok.Getter; +import lombok.Setter; +import org.apache.commons.lang3.StringUtils; + +@Getter +@Setter +public class YnrccPaySignListQueryParam extends APIRequestParam { + @Sign + private String userid; //可二选一 + + @Sign + private String bankcardno; //可二选一 + + @Override + public boolean checkParam() throws RequestParamCheckException { + if (StringUtils.isEmpty(userid) && StringUtils.isEmpty(bankcardno)) { + throw new RequestParamCheckException("未指定要查询的签约用户!"); + } + return true; + } +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryResponse.java new file mode 100644 index 00000000..526f979a --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignListQueryResponse.java @@ -0,0 +1,14 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class YnrccPaySignListQueryResponse extends ApiResponse { + private List data; +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignQueryParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignQueryParam.java index 5d52f382..d18e016c 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignQueryParam.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPaySignQueryParam.java @@ -6,21 +6,22 @@ import com.supwisdom.dlpay.api.exception.RequestParamCheckException; import lombok.Getter; import lombok.Setter; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotEmpty; @Getter @Setter public class YnrccPaySignQueryParam extends APIRequestParam { @Sign - @NotEmpty(message = "用户ID不能为空") + @NotBlank(message = "用户ID不能为空") private String userid; @Sign - @NotEmpty(message = "银行卡号不能为空") + @NotBlank(message = "银行卡号不能为空") private String bankcardno; @Sign - @NotEmpty(message = "签约商户不能为空") + @NotBlank(message = "签约商户不能为空") private String shopaccno; @Override diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthParam.java new file mode 100644 index 00000000..5f225e45 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthParam.java @@ -0,0 +1,30 @@ +package com.supwisdom.dlpay.api.bean; + +import com.supwisdom.dlpay.api.APIRequestParam; +import com.supwisdom.dlpay.api.annotation.Sign; +import com.supwisdom.dlpay.api.exception.RequestParamCheckException; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +public class YnrccPayThirdAuthParam extends APIRequestParam { + @Sign + @NotBlank(message = "第三方服务标识不能为空") + private String thirdservice; + + @Sign + @NotBlank(message = "用户ID不能为空") + private String userid; + + @Sign + @NotBlank(message = "银行卡号不能为空") + private String bankcardno; + + @Override + public boolean checkParam() throws RequestParamCheckException { + return true; + } +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthResponse.java new file mode 100644 index 00000000..eb1babb7 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/YnrccPayThirdAuthResponse.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.api.bean; + +import lombok.*; + +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@ToString +public class YnrccPayThirdAuthResponse extends ApiResponse{ + private String sdkConfigData; + private String access2ServiceData; +} diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java index 18f1521d..9eb32fb4 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/ConsumePropxy.java @@ -34,4 +34,6 @@ public interface ConsumePropxy { @PostMapping("/ynrccpay/refund") YnrccPayRefundResponse ynrccPayRefund(@RequestBody YnrccPayRefundParam param); + @PostMapping("/ynrccpay/thirdAuth") + YnrccPayThirdAuthResponse ynrccPayThirdAuth(@RequestBody YnrccPayThirdAuthParam param); } diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java index 01f8fd40..1fb815fe 100644 --- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java +++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java @@ -93,4 +93,10 @@ public interface UserProxy { @PostMapping("/api/user/ynrccpayModifyLimit") YnrccPayLimitModifyResponse modifyYnrccPayLimit(@RequestBody YnrccPayLimitModifyParam param); + + @PostMapping("/api/user/queryMessage") + UserQueryMessageResponse queryUserMessage(@RequestBody UserQueryMessageParam param); + + @PostMapping("/api/user/ynrccpaySignList") + YnrccPaySignListQueryResponse queryYnrccPaySignList(@RequestBody YnrccPaySignListQueryParam param); } diff --git a/payapi/build.gradle b/payapi/build.gradle index a24b7188..2c788089 100644 --- a/payapi/build.gradle +++ b/payapi/build.gradle @@ -115,7 +115,11 @@ dependencies { // implementation files('libs/ojdbc6.jar') implementation 'commons-dbcp:commons-dbcp:1.4' implementation 'commons-beanutils:commons-beanutils:1.9.3' - implementation files('libs/ynrcc-mbp-1.1.0-RELEASE.jar') + implementation files('libs/ynrcc-openapi-sdk-1.1.2-RELEASE.jar') + + //大理农商行sdk需求jar + implementation 'cn.hutool:hutool-crypto:5.4.7' + implementation 'org.bouncycastle:bcprov-jdk15on:1.64' implementation 'log4j:log4j:1.2.17' implementation 'com.alibaba:fastjson:1.2.60' diff --git a/payapi/libs/ynrcc-mbp-1.1.0-RELEASE.jar b/payapi/libs/ynrcc-mbp-1.1.0-RELEASE.jar deleted file mode 100644 index 0aee6efe..00000000 Binary files a/payapi/libs/ynrcc-mbp-1.1.0-RELEASE.jar and /dev/null differ diff --git a/payapi/libs/ynrcc-openapi-sdk-1.1.2-RELEASE.jar b/payapi/libs/ynrcc-openapi-sdk-1.1.2-RELEASE.jar new file mode 100644 index 00000000..c3d54eec Binary files /dev/null and b/payapi/libs/ynrcc-openapi-sdk-1.1.2-RELEASE.jar differ diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/ynrccpay/YnrccPayUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/ynrccpay/YnrccPayUtil.java index d0a34747..38a6982a 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/agent/ynrccpay/YnrccPayUtil.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/ynrccpay/YnrccPayUtil.java @@ -20,6 +20,7 @@ public class YnrccPayUtil { public static final String SUCCESS = "ZF0000"; public static final String WAIT_FOR_QUERY = "ZF0098"; //等待查询结果 + public static final String NO_RECORDS_TODAY = "0406"; //当日无交易明细 public static String toJson(Object obj) { diff --git a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/YnrccPaySignDao.java b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/YnrccPaySignDao.java index d8b0949a..adc6075c 100644 --- a/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/YnrccPaySignDao.java +++ b/payapi/src/main/java/com/supwisdom/dlpay/citizencard/dao/YnrccPaySignDao.java @@ -5,6 +5,8 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface YnrccPaySignDao extends JpaRepository { @Query("from TYnrccPaySign t where t.bankcardno=?1 and t.shopaccno=?2 and t.status='normal'") @@ -13,5 +15,17 @@ public interface YnrccPaySignDao extends JpaRepository { @Query("select count(t.id) from TYnrccPaySign t where t.bankcardno=?1 and t.shopaccno<>?2 and t.status='normal' and t.signFlag is true ") int countByBankcardnoAndSignStatus(String bankcardno, String shopaccno); + @Query("from TYnrccPaySign t where t.bankcardno=?1 and t.shopaccno<>?2 and t.status='normal' and t.signFlag is true") + List queryOtherShopSign(String bankcardno, String shopaccno); + TYnrccPaySign getById(String id); + + @Query("from TYnrccPaySign t where t.userid=?1 and t.status='normal' and t.signFlag is true") + List queryActiveSignsByUserid(String userid); + + @Query("from TYnrccPaySign t where t.bankcardno=?1 and t.status='normal' and t.signFlag is true") + List queryActiveSignsByBankcardno(String bankcardno); + + @Query("from TYnrccPaySign t where t.userid=?1 and t.bankcardno=?2 and t.status='normal' and t.signFlag is true") + List queryActiveSignsByUseridAndBankcardno(String userid, String bankcardno); } diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageRes.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageRes.java new file mode 100644 index 00000000..03467f9d --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/PageRes.java @@ -0,0 +1,51 @@ +package com.supwisdom.dlpay.framework.util; + +import java.util.List; + +public class PageRes { + private int pageNo = 1; + private int pageSize = 10; + private int totalCount = 0; + private int totalPages = 0; + private List data; + + public int getPageNo() { + return pageNo; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public int getPageSize() { + return pageSize; + } + + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + + public int getTotalCount() { + return totalCount; + } + + public void setTotalCount(int totalCount) { + this.totalCount = totalCount; + } + + public int getTotalPages() { + return totalPages; + } + + public void setTotalPages(int totalPages) { + this.totalPages = totalPages; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserMessageService.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserMessageService.java new file mode 100644 index 00000000..842b9d90 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/UserMessageService.java @@ -0,0 +1,11 @@ +package com.supwisdom.dlpay.system.service; + +import com.supwisdom.dlpay.api.bean.UserMessageData; +import com.supwisdom.dlpay.framework.util.PageRes; +import org.springframework.transaction.annotation.Transactional; + +public interface UserMessageService { + @Transactional(rollbackFor = Exception.class, readOnly = true) + PageRes queryMessageByUserid(String userid, int pageNo, int pageSize); + +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserMessageServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserMessageServiceImpl.java new file mode 100644 index 00000000..b5fa9ce0 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/system/service/impl/UserMessageServiceImpl.java @@ -0,0 +1,49 @@ +package com.supwisdom.dlpay.system.service.impl; + +import com.supwisdom.dlpay.api.bean.UserMessageData; +import com.supwisdom.dlpay.framework.util.PageRes; +import com.supwisdom.dlpay.framework.util.PageResult; +import com.supwisdom.dlpay.framework.util.StringUtil; +import com.supwisdom.dlpay.system.bean.CitizenCardShowBean; +import com.supwisdom.dlpay.system.service.UserMessageService; +import org.hibernate.query.internal.NativeQueryImpl; +import org.hibernate.transform.Transformers; +import org.springframework.stereotype.Service; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; +import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; + +@Service +public class UserMessageServiceImpl implements UserMessageService { + @PersistenceContext + private EntityManager entityManager; + + @Override + public PageRes queryMessageByUserid(String userid, int pageNo, int pageSize) { + StringBuffer querySql = new StringBuffer("select a.msgid,a.content,a.lastupdate,a.refno,b.transdesc,b.amount,a.userid " + + " from tb_msg a left join tb_persondtl b on a.refno=b.refno where a.userid=:userid order by a.lastupdate desc"); + StringBuffer countSql = new StringBuffer("select count(a.msgid) as cnt " + + " from tb_msg a left join tb_persondtl b on a.refno=b.refno where a.userid=:userid "); + + Query query = entityManager.createNativeQuery(querySql.toString()); + Query countQuery = entityManager.createNativeQuery(countSql.toString()); + query.setParameter("userid", userid.trim()); + countQuery.setParameter("userid", userid.trim()); + query.setFirstResult((pageNo - 1) * pageSize); + query.setMaxResults(pageSize); //分页显示 + query.unwrap(NativeQueryImpl.class).setResultTransformer(Transformers.aliasToBean(UserMessageData.class)); + List list = query.getResultList(); + BigInteger cnt = (BigInteger) countQuery.getSingleResult(); + PageRes page = new PageRes<>(); + page.setPageNo(pageNo); + page.setPageSize(pageSize); + page.setTotalCount(cnt == null ? 0 : cnt.intValue()); + page.setTotalPages(page.getTotalCount() % page.getPageSize() > 0 ? (page.getTotalCount() / page.getPageSize() + 1) : (page.getTotalCount() / page.getPageSize())); + page.setData(list == null ? new ArrayList<>(0) : list); + return page; + } +} diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/ynrcc_netpay_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/ynrcc_netpay_service_impl.kt index c1e037b0..3949c553 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/ynrcc_netpay_service_impl.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/ynrcc_netpay_service_impl.kt @@ -1,32 +1,22 @@ package com.supwisdom.dlpay.agent.service.impl import com.csii.ynrcc.open.api.pay.YNRCCFastGateWayPayApi +import com.csii.ynrcc.open.api.service.User +import com.csii.ynrcc.open.api.service.YNRCCOpenServiceApi import com.google.gson.Gson import com.supwisdom.dlpay.agent.service.YnrccNetPayService import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayCommonResp import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayResp import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayUtil -import com.supwisdom.dlpay.api.bean.YnrccPaySignApplyParam -import com.supwisdom.dlpay.api.bean.YnrccPaySignApplyResponse -import com.supwisdom.dlpay.api.dao.CardDao -import com.supwisdom.dlpay.api.dao.PersonDao -import com.supwisdom.dlpay.api.repositories.ShopaccService +import com.supwisdom.dlpay.api.domain.TPerson import com.supwisdom.dlpay.api.service.SourceTypeService -import com.supwisdom.dlpay.citizencard.dao.YnrccPaySignDao -import com.supwisdom.dlpay.citizencard.domain.TYnrccPaySign import com.supwisdom.dlpay.exception.TransactionProcessException -import com.supwisdom.dlpay.framework.dao.ShopaccDao import com.supwisdom.dlpay.framework.service.SystemUtilService -import com.supwisdom.dlpay.framework.util.MoneyUtil -import com.supwisdom.dlpay.framework.util.StringUtil -import com.supwisdom.dlpay.framework.util.TradeDict -import com.supwisdom.dlpay.framework.util.TradeErrorCode -import com.supwisdom.dlpay.util.ConstantUtil +import com.supwisdom.dlpay.framework.util.* import mu.KotlinLogging import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.MediaType -import org.springframework.http.ResponseEntity import org.springframework.http.converter.StringHttpMessageConverter import org.springframework.stereotype.Service import org.springframework.util.LinkedMultiValueMap @@ -72,9 +62,49 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, params["TransId"] = "IFSR" params["Mer_Id"] = merId.trim() params["MerURL"] = merUrl.trim() + params["PAY_MODE"] = "QS" //调SDK生成签名 val signData = YNRCCFastGateWayPayApi.sign(params) + if (signData["Plain"].isNullOrEmpty() || signData["Signature"].isNullOrEmpty()) { + resp.code = "ZE0002" + resp.message = "签名计算错误!" + logger.error("签名后[Plain]和[Signature]参数为空!") + return resp + } + + resp.code = YnrccPayUtil.SUCCESS + resp.message = "SUCCESS" + resp.plain = signData["Plain"] + resp.signature = signData["Signature"] + return resp + } + + override fun doApplyAuthYnrccPaySign(shopaccno: String, oldCustomerSignNo: String): YnrccPayResp { + val resp = YnrccPayResp() + val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_YNRCC_PAY, shopaccno, false, false) + val merId = config[YnrccPayUtil.MER_ID] + if (merId.isNullOrEmpty()) { + resp.code = "ZE0001" + resp.message = "系统参数未配置[Mer_Id]" + logger.error(resp.error()) + return resp + } + + val params = hashMapOf() + params["TransId"] = "IFSR" + params["Mer_Id"] = merId.trim() + params["CustomerSignNo"] = oldCustomerSignNo.trim() + params["PAY_MODE"] = "QS" + + //调SDK生成签名 + val signData = YNRCCFastGateWayPayApi.sign(params) + if (signData["Plain"].isNullOrEmpty() || signData["Signature"].isNullOrEmpty()) { + resp.code = "ZE0002" + resp.message = "签名计算错误!" + logger.error("签名后[Plain]和[Signature]参数为空!") + return resp + } resp.code = YnrccPayUtil.SUCCESS resp.message = "SUCCESS" @@ -106,6 +136,7 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, params["TransId"] = "IFCR" params["Mer_Id"] = merId.trim() params["CustomerSignNo"] = customerSignNo + params["PAY_MODE"] = "Q" val signData = YNRCCFastGateWayPayApi.sign(params) //调SDK生成签名 val plain = signData["Plain"] @@ -149,22 +180,25 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, val result = restTemplate.postForEntity(url, httpEntity, String::class.java) if (200 == result.statusCodeValue) { //请求成功 + logger.info("农商行网关快捷支付请求【$opt】返回:\nurl=[$url]\nResponse Body=[" + result.body + "]") val resJson = Gson().fromJson(result.body, YnrccPayCommonResp::class.java) if (null == resJson || StringUtil.isEmpty(resJson.plain) || StringUtil.isEmpty(resJson.signature)) { return error("ZE0098", "请求农商行网关【$opt】返回数据为空!") } val resData = YNRCCFastGateWayPayApi.verify(resJson.signature, resJson.plain) //调SDK验证签名 - logger.info("农商行网关快捷支付请求【$opt】返回:\nurl=[$url]\nResponse=[" + YnrccPayUtil.toJson(resData) + "]") - return if (YnrccPayUtil.SUCCESS == resData["RespCode"]) { + logger.info("农商行网关快捷支付请求【$opt】返回:\nurl=[$url]\nResponse Plain=[" + YnrccPayUtil.toJson(resData) + "]") + val respCode = resData["RespCode"]?.trim()?.replace("\r\n", "") + return if (YnrccPayUtil.SUCCESS == respCode) { + resData["RespCode"] = respCode resData["RespDesc"] = "SUCCESS" resData } else { - val errcode = resData["RespCode"] val errmsg = YnrccPayUtil.errcode.firstOrNull { - it.second.code == errcode + it.second.code == respCode }?.second?.msg - resData["RespDesc"] = "$errcode $errmsg" //设置失败信息 + resData["RespCode"] = respCode + resData["RespDesc"] = "$respCode $errmsg" //设置失败信息 resData } } else { @@ -211,9 +245,16 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, params["CustomerSignNo"] = customerSignNo params["MerURL"] = merUrl params["MsgExt"] = extData + params["PAY_MODE"] = "QS" //调SDK生成签名 val signData = YNRCCFastGateWayPayApi.sign(params) + if (signData["Plain"].isNullOrEmpty() || signData["Signature"].isNullOrEmpty()) { + resp.code = "ZE0002" + resp.message = "签名计算错误!" + logger.error("签名后[Plain]和[Signature]参数为空!") + return resp + } resp.code = YnrccPayUtil.SUCCESS resp.message = "SUCCESS" @@ -247,6 +288,7 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, params["OrgMerchantSeqNo"] = orignRefno params["Amount"] = MoneyUtil.formatYuanToString(amount / 100.0) params["OrgMerchantDate"] = orignTransDate + params["PAY_MODE"] = "Q" val signData = YNRCCFastGateWayPayApi.sign(params) //调SDK生成签名 val plain = signData["Plain"] @@ -306,6 +348,7 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, params["Mer_IdName"] = merIdName.trim() params["OrderNo"] = orignRefno params["OrderDate"] = orignTransDate + params["PAY_MODE"] = "Q" val signData = YNRCCFastGateWayPayApi.sign(params) //调SDK生成签名 val plain = signData["Plain"] @@ -339,4 +382,48 @@ class YnrccNetPayServiceImpl(val restTemplate: RestTemplate, return resp } + override fun doQueryYnrccPayChkfile(checkDate: String, shopaccno: String): YnrccPayResp { + val resp = YnrccPayResp() + val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_YNRCC_PAY, shopaccno, false, false) + val gateWay = config[YnrccPayUtil.GATEWAY] + val merId = config[YnrccPayUtil.MER_ID] + if (gateWay.isNullOrEmpty()) { + resp.code = "ZE0001" + resp.message = "系统参数未配置[网关地址]" + logger.error(resp.error()) + return resp + } + if (merId.isNullOrEmpty()) { + resp.code = "ZE0001" + resp.message = "系统参数未配置[Mer_Id]" + logger.error(resp.error()) + return resp + } + + val url = String.format(gateWay, "MerchantCheckFileQry.do") //赋予接口名 + val params = hashMapOf() + params["TransId"] = "IDFR" + params["Mer_Id"] = merId.trim() + params["ClearDate"] = checkDate + params["PAY_MODE"] = "Q" + + val signData = YNRCCFastGateWayPayApi.sign(params) //调SDK生成签名 + val plain = signData["Plain"] + val signature = signData["Signature"] + if (plain.isNullOrEmpty() || signature.isNullOrEmpty()) { + resp.code = "ZE0002" + resp.message = "签名计算错误!" + logger.error(resp.error()) + return resp + } + + val result = postForm(url, plain, signature, "对账") //发起表单提交 + resp.code = result["RespCode"] + resp.message = result["RespDesc"] + if (YnrccPayUtil.SUCCESS == result["RespCode"]) { + resp.plain = result["Plain"] //对账单 + } + return resp + } + } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrcc_netpay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrcc_netpay_service.kt index f2e5bdc5..127e319e 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrcc_netpay_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrcc_netpay_service.kt @@ -8,15 +8,20 @@ import com.supwisdom.dlpay.agent.citizencard.YnrccRespCode import com.supwisdom.dlpay.agent.citizencard.YnrccUtil import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayResp import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayUtil +import com.supwisdom.dlpay.api.dao.TransactionMainDao import com.supwisdom.dlpay.api.domain.TTransactionMain +import com.supwisdom.dlpay.exception.TransactionProcessException import com.supwisdom.dlpay.framework.util.MoneyUtil +import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Component interface YnrccNetPayService { fun doAnalysisSignature(shopaccno: String, plain: String, signature: String): Map - fun doApplyYnrccPaySign(shopaccno: String): YnrccPayResp + fun doApplyYnrccPaySign(shopaccno: String): YnrccPayResp //首次签约 + + fun doApplyAuthYnrccPaySign(shopaccno: String, oldCustomerSignNo: String): YnrccPayResp //授权签约 fun doCancelYnrccPaySign(shopaccno: String, customerSignNo: String): YnrccPayResp @@ -26,12 +31,16 @@ interface YnrccNetPayService { fun doYnrccPayRefund(shopaccno: String, orignRefno: String, amount: Int, orignTransDate: String): YnrccPayResp fun doQueryYnrccPayResult(shopaccno: String, orignRefno: String, orignTransDate: String): YnrccPayResp + + fun doQueryYnrccPayChkfile(checkDate: String, shopaccno: String): YnrccPayResp } @Component("ynrccpayAgent") class YnrccNetPayAgent: AgentPayService{ @Autowired private lateinit var ynrccNetPayService: YnrccNetPayService + @Autowired + lateinit var transactionMainDao: TransactionMainDao private fun agentCode(code: String, msg: String?): org.springframework.data.util.Pair { return YnrccPayUtil.errcode.firstOrNull { @@ -61,8 +70,12 @@ class YnrccNetPayAgent: AgentPayService{ } override fun refund(transaction: TTransactionMain): AgentResponse { + val originalDtl = transactionMainDao.findByRefno(transaction.reverseRefno)?: + throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "原始流水<${transaction.reverseRefno}>不存在") + + //fixme:必须找原流水获取下单日期 val resp = ynrccNetPayService.doYnrccPayRefund(transaction.shopDtl.shopaccno, transaction.reverseRefno, - MoneyUtil.YuanToFen(transaction.personDtl.amount), transaction.shopDtl.accdate) + MoneyUtil.YuanToFen(transaction.personDtl.amount), originalDtl.shopDtl.accdate) return AgentResponse().also { val code = agentCode(resp.code, resp.message) it.code = code.first diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrccpay_checkfile_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrccpay_checkfile_service.kt new file mode 100644 index 00000000..0c7126e6 --- /dev/null +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/ynrccpay_checkfile_service.kt @@ -0,0 +1,157 @@ +package com.supwisdom.dlpay.agent.service + +import com.supwisdom.dlpay.agent.AgentCode +import com.supwisdom.dlpay.agent.AgentResponse +import com.supwisdom.dlpay.agent.CheckFileProvider +import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayUtil +import com.supwisdom.dlpay.api.domain.TSourceTypeCheckStatus +import com.supwisdom.dlpay.api.domain.TTransactionChkfile +import com.supwisdom.dlpay.api.service.SourceTypeService +import com.supwisdom.dlpay.api.service.TransactionReconciliationService +import com.supwisdom.dlpay.exception.TransactionException +import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.util.ConstantUtil +import mu.KotlinLogging +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.stereotype.Component + +@Component("ynrccpayCheckFileProvider") +class YnrccpayCheckFileProvider : CheckFileProvider { + @Autowired + private lateinit var systemUtilService: SystemUtilService + @Autowired + private lateinit var transactionReconciliationService: TransactionReconciliationService + @Autowired + private lateinit var sourceTypeService: SourceTypeService + @Autowired + private lateinit var ynrccNetPayService:YnrccNetPayService + + private val logger = KotlinLogging.logger { } + + override fun acquireCheckFile(checkStatus: TSourceTypeCheckStatus): AgentResponse { + try { + val billDate = checkStatus.checkAccdate + logger.info("【农商行网关快捷支付】对账单下载:download checkdate=【$billDate】") + + val chkfile: TTransactionChkfile = transactionReconciliationService + .getTransactionChkfile(billDate, checkStatus.sourceType)?.let { file -> + when (file.status) { + ConstantUtil.CHKFILE_STATUS_INIT -> file //初始化直接返回 + ConstantUtil.CHKFILE_STATUS_ERROR -> reinitCheckFile(file) //错误或未对账的直接重新拉取 + else -> { + when (checkStatus.forceRecheck) { + true -> reinitCheckFile(file) //对账已完成但强制重新对账 + false -> { + if (file.status == ConstantUtil.CHKFILE_STATUS_UNCHECK) { + file + } else { + throw TransactionException(-1, "【农商行网关快捷支付】该天[$billDate]已对账完成") + } + } //对账已完成报错 + } + } + } + } + ?: transactionReconciliationService.saveInitTransactionChkfile(billDate, checkStatus.sourceType) + + if (chkfile.status == ConstantUtil.CHKFILE_STATUS_UNCHECK) { + return successDownload("[$billDate]日对账数据已入库成功", checkStatus) + } + + val shopaccno = "" + val resp = ynrccNetPayService.doQueryYnrccPayChkfile(billDate, shopaccno) + when (resp.code) { + YnrccPayUtil.SUCCESS -> { + //TODO: 农商行网关快捷支付 对账文件解析 + val agentUrl = "" + + //成功 + return AgentResponse().also { + it.code = AgentCode.FAIL + it.agentMsg = "获取对账文件逻辑暂缺" +// it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply { +// this.checkFileOk = false +// this.chkfileUrl = agentUrl +// }) + } + + } + YnrccPayUtil.NO_RECORDS_TODAY -> { + //当日无交易明细,也创建空记录 + transactionReconciliationService.doSuccessTransactionChkfile(chkfile, "请求银行返回:当日无交易明细") + //成功 + return successDownload("当日无交易明细", checkStatus.apply { + this.chkfileUrl = "none" + }) + } + else -> { + //报错,退出对账单拉取 + logger.error("农商行网关快捷支付对账单下载[$billDate]报错:${resp.message}") + chkfile.status = ConstantUtil.CHKFILE_STATUS_ERROR + chkfile.remark = "请求获取对账文件报错:${resp.message}" + transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile) + + //失败 + return AgentResponse().also { + it.code = AgentCode.FAIL + it.agentMsg = chkfile.remark + it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply { + this.remark = chkfile.remark + }) + } + } + } + } catch (et: TransactionException) { + return AgentResponse().also { + it.code = AgentCode.FAIL + it.agentMsg = et.message + it.agentCode = "${et.code()}" + it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply { + this.remark = et.message + }) + } + } + + } + + override fun queryCheckFile(checkStatus: TSourceTypeCheckStatus?): AgentResponse { + return AgentResponse().also { + it.code = AgentCode.SUCCESS + it.agentMsg = "OK" + it.payload = checkStatus + } + } + + override fun downloadCheckFile(checkStatus: TSourceTypeCheckStatus?): AgentResponse { + return AgentResponse().also { + it.code = AgentCode.SUCCESS + it.agentMsg = "OK" + it.payload = checkStatus + } + } + + private fun reinitCheckFile(chkfile: TTransactionChkfile): TTransactionChkfile { + transactionReconciliationService.deleteTransactionChkdtls(chkfile.id) //删除明细 + return transactionReconciliationService.saveOrUpdateTransactionChkfile(chkfile.apply { + this.status = ConstantUtil.CHKFILE_STATUS_INIT + this.result = ConstantUtil.CHKFILE_RESULT_NONE + this.remark = null + this.othercnt = 0 + this.otheramt = 0.00 + this.localcnt = 0 + this.localamt = 0.00 + }) //初始化chkfile + } + + private fun successDownload(message: String, checkStatus: TSourceTypeCheckStatus): AgentResponse { + return AgentResponse().also { + it.code = AgentCode.SUCCESS + it.agentMsg = message + it.payload = sourceTypeService.saveOrUpdateSourceTypeCheckStatus(checkStatus.apply { + this.checkFileOk = true + this.remark = message + }) + } + } + +} \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt index 1fda9f02..17d1d2e7 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/advices.kt @@ -48,6 +48,7 @@ class RestControllerAdvice { .exception(undeclared.code(), undeclared, "业务处理错误")) } + ex.printStackTrace() return ResponseEntity.ok().body(ResponseBodyBuilder.create() .exception(TradeErrorCode.BUSINESS_DEAL_ERROR, undeclared, "业务处理报错")) } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt index 16ceadb9..c9a69459 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt @@ -983,4 +983,37 @@ class ConsumeAPIController { .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在")) } + /** + * 直接调第三方查询流水结果 (方便测试) + * */ + @PostMapping("/thirdquery") + fun thirdToQueryResult(refno: String): ResponseEntity { + consumePayService.getTransactionMainDtl(refno, null, null)?.let { + agentQueryResultTask.queryResult(it, 0) + return ResponseEntity.ok( + ResponseBodyBuilder.create() + .success("已成功进入查询异步查询队列") + ) + } ?: return ResponseEntity.ok( + ResponseBodyBuilder.create() + .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在") + ) + } + + /** + * ============================================================================ + * 农商行网关快捷支付【第三方开放能力】 + * ============================================================================ + * */ + @PostMapping("/ynrccpay/thirdAuth") + fun ynrccPayThirdAuth(@Valid @RequestBody param: YnrccPayThirdAuthParam): ResponseEntity { + val ret = ynrccNetPayBusinessService.doYnrccPayThirdAuth(param.thirdservice,param.bankcardno,param.userid) + return if (ret.retcode == 0) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .success(ret, "成功")) + } else { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(ret.retcode, ret.retmsg)) + } + } } diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt index 1c6750c6..8d8fb8fe 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt @@ -2,7 +2,6 @@ package com.supwisdom.dlpay.api.controller import com.supwisdom.dlpay.agent.citizencard.YnrccUtil import com.supwisdom.dlpay.agent.service.CitizencardPayService -import com.supwisdom.dlpay.agent.service.YnrccNetPayService import com.supwisdom.dlpay.api.bean.* import com.supwisdom.dlpay.api.exception.RequestParamCheckException import com.supwisdom.dlpay.api.service.* @@ -13,9 +12,11 @@ import com.supwisdom.dlpay.framework.util.TradeErrorCode import com.supwisdom.dlpay.mobile.service.MobileApiService import com.supwisdom.dlpay.system.bean.LevelBean import com.supwisdom.dlpay.system.service.PointsService +import com.supwisdom.dlpay.system.service.UserMessageService import org.apache.commons.beanutils.BeanUtils import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity +import org.springframework.validation.annotation.Validated import org.springframework.web.bind.annotation.* import java.net.URLDecoder import javax.validation.Valid @@ -41,6 +42,8 @@ class UserAPIController { private lateinit var qrcodeService: QRCodeService @Autowired private lateinit var ynrccNetPayBusinessService: YnrccNetPayBusinessService + @Autowired + private lateinit var userMessageService: UserMessageService @PostMapping("/open") fun openAccount(@RequestBody param: OpenUserParam): ResponseEntity { @@ -446,6 +449,26 @@ class UserAPIController { } } + /** + * 查询用户消息 + * */ + @PostMapping("/queryMessage") + fun queryUserMessage(@Valid @RequestBody param: UserQueryMessageParam): ResponseEntity { + val userid = param.userid ?: throw RequestParamCheckException("用户ID不能为空") + val pageNo = param.pageNo ?: 1 + val pageSize = param.pageSize ?: 10 + val page = userMessageService.queryMessageByUserid(userid, pageNo, pageSize) + return ResponseEntity.ok(ResponseBodyBuilder.create() + .success(UserQueryMessageResponse().apply { + this.pageNo = page.pageNo + this.pageSize = page.pageSize + this.totalCount = page.totalCount + this.totalPages = page.totalPages + this.data = page.data + }, "success") + ) + } + /** * ============================================================================ * 农商行快捷支付【签约状态查询】 @@ -458,6 +481,23 @@ class UserAPIController { .success(YnrccPaySignQueryResponse(signFlag), "查询成功")) } + /** + * ============================================================================ + * 农商行快捷支付【签约列表查询】 + * ============================================================================ + * */ + @PostMapping("/ynrccpaySignList") + fun queryYnrccPaySignList(@Valid @RequestBody param: YnrccPaySignListQueryParam): ResponseEntity { + val resp = ynrccNetPayBusinessService.doQueryYnrccPaySignList(param.userid, param.bankcardno) + return if (0 == resp.retcode) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .success(resp, "success")) + } else { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(resp.retcode, resp.retmsg)) + } + } + /** * ============================================================================ * 农商行快捷支付【签约申请】 @@ -466,8 +506,13 @@ class UserAPIController { @PostMapping("/ynrccpaySignApply") fun applyYnrccPaySign(@Valid @RequestBody param: YnrccPaySignApplyParam): ResponseEntity { val resp = ynrccNetPayBusinessService.applyUserYnrccPaySign(param) - return ResponseEntity.ok(ResponseBodyBuilder.create() + return if (0 == resp.retcode) { + ResponseEntity.ok(ResponseBodyBuilder.create() .success(resp, "success")) + } else { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(resp.retcode, resp.retmsg)) + } } /** diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/ynrcc_netpay_business_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/ynrcc_netpay_business_service.kt index 61e590bb..da5f5ac1 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/ynrcc_netpay_business_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/ynrcc_netpay_business_service.kt @@ -1,10 +1,13 @@ package com.supwisdom.dlpay.api.service.impl +import com.csii.ynrcc.open.api.service.User +import com.csii.ynrcc.open.api.service.YNRCCOpenServiceApi import com.supwisdom.dlpay.agent.AgentCode import com.supwisdom.dlpay.agent.AgentResponse import com.supwisdom.dlpay.agent.DtlStatus import com.supwisdom.dlpay.agent.citizencard.YnrccRespCode import com.supwisdom.dlpay.agent.service.YnrccNetPayService +import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayResp import com.supwisdom.dlpay.agent.ynrccpay.YnrccPayUtil import com.supwisdom.dlpay.api.bean.* import com.supwisdom.dlpay.api.dao.CardDao @@ -28,6 +31,7 @@ import com.supwisdom.dlpay.framework.util.TradeErrorCode import com.supwisdom.dlpay.util.ConstantUtil import mu.KotlinLogging import org.springframework.stereotype.Service +import java.util.ArrayList @Service class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, @@ -42,6 +46,7 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, private val logger = KotlinLogging.logger { } override fun checkUserYnrccPaySignStatus(userid: String, bankcardno: String, shopaccno: String): Boolean { + logger.info("查询签约状态:userid=[$userid],bankcardno=[$bankcardno],shopaccno=[$shopaccno]") val person = personDao.findByUserid(userid) ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户<$userid>不存在") val shopacc = shopaccDao.findByShopaccno(shopaccno) @@ -60,21 +65,26 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } override fun applyUserYnrccPaySign(param: YnrccPaySignApplyParam): YnrccPaySignApplyResponse { + logger.info("申请签约参数:" + YnrccPayUtil.toJson(param)) + val resp = YnrccPaySignApplyResponse() val person = personDao.findByUserid(param.userid?.trim()) ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户<${param.userid}>不存在") val shopacc = shopaccDao.findByShopaccno(param.shopaccno?.trim()) ?: throw TransactionProcessException(TradeErrorCode.SHOP_NOT_EXISTS, "商户<${param.shopaccno}>不存在") val bankCard = cardDao.findCardByCardnoAndCardtype(param.bankcardno.trim(), ConstantUtil.CARDTYPE_BANKCARD) if (null != bankCard && person.userid != bankCard.userid) { - throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "银行卡持有人错误!") + resp.retcode = 99 + resp.retmsg = "银行卡持有人错误!" + return resp } val idType = IDTypes.findByValue(person.idtype) if (idType < 0) { - throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "证件类型未识别[${person.idtype}]!") + resp.retcode = 99 + resp.retmsg = "证件类型未识别[${person.idtype}]!" + return resp } sourceTypeService.checkShopSourceType(shopacc.shopaccno, TradeDict.PAYTYPE_YNRCC_PAY, false) - val isAuthSign = ynrccPaySignDao.countByBankcardnoAndSignStatus(param.bankcardno, shopacc.shopaccno) > 0 var userSign = ynrccPaySignDao.getUserSign(param.bankcardno, shopacc.shopaccno) ?: TYnrccPaySign().apply { this.bankcardno = param.bankcardno.trim() this.shopaccno = shopacc.shopaccno @@ -84,20 +94,38 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, this.createtime = systemUtilService.sysdatetime.hostdatetime } if (person.userid != userSign.userid) { - throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "银行卡持有人不匹配!") + resp.retcode = 99 + resp.retmsg = "银行卡持有人不匹配!" + return resp } else if (userSign.isSignFlag) { - throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该卡已签约!") - } - if (StringUtil.isEmpty(userSign.id)) { - ynrccPaySignDao.save(userSign) //新创建的保存申请记录 + resp.retcode = 99 + resp.retmsg = "该卡已签约!" + return resp } - val signDataResp = ynrccNetPayService.doApplyYnrccPaySign(shopacc.shopaccno) + var isAuthSign = false + var signDataResp = YnrccPayResp() + val existSigns = ynrccPaySignDao.queryOtherShopSign(param.bankcardno, shopacc.shopaccno) + if (null != existSigns && existSigns.size > 0) { + //已签约过,则是授权签约 + logger.info("进入授权签约申请!") + isAuthSign = true + val oldCustomerSignNo = existSigns[0].customerSignNo + signDataResp = ynrccNetPayService.doApplyAuthYnrccPaySign(shopacc.shopaccno, oldCustomerSignNo) //授权签约 + } else { + //首次签约 + signDataResp = ynrccNetPayService.doApplyYnrccPaySign(shopacc.shopaccno) //初次签约 + } if (YnrccPayUtil.SUCCESS != signDataResp.code) { - throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, signDataResp.message) + resp.retcode = 99 + resp.retmsg = signDataResp.message + return resp + } + + if (StringUtil.isEmpty(userSign.id)) { + ynrccPaySignDao.save(userSign) //新创建的保存申请记录 } - val resp = YnrccPaySignApplyResponse() resp.retcode = 0 resp.retmsg = "success" resp.signNo = userSign.id @@ -115,6 +143,7 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } override fun confirmUserYnrccPaySign(param: YnrccPaySignConfirmParam): YnrccPaySignConfirmResponse { + logger.info("确认签约参数:" + YnrccPayUtil.toJson(param)) val userSign = ynrccPaySignDao.getById(param.signNo.toString()) ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "签约申请记录<${param.signNo}>不存在!") @@ -129,9 +158,10 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } //签约成功 - if (data["CustomerAcNo"] != userSign.bankcardno) { - throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "支付账号与签约号不匹配!") - } else if (userSign.isSignFlag && data["CustomerSignNo"] != userSign.customerSignNo) { +// if (data["CustomerAcNo"] != userSign.bankcardno) { +// throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "支付账号与签约号不匹配!") // CustomerAcNo 是脱敏返回的,不判断。 6210****6743 +// } + if (userSign.isSignFlag && data["CustomerSignNo"] != userSign.customerSignNo) { throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "用户已签约且快捷支付协议号不一致!") } @@ -151,6 +181,7 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } override fun cancelUserYnrccPaySign(param: YnrccPaySignCancelParam): YnrccPaySignCancelResponse { + logger.info("申请解约参数:" + YnrccPayUtil.toJson(param)) val userSign = ynrccPaySignDao.getUserSign(param.bankcardno.trim(), param.shopaccno) ?: throw TransactionProcessException(TradeErrorCode.BUSINESS_DEAL_ERROR, "签约记录不存在或已解约!") if (userSign.userid != param.userid) { @@ -196,7 +227,8 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, val refno = transdtl.refno val shopaccno = transdtl.shopDtl.shopaccno val amount = MoneyUtil.YuanToFen(transdtl.shopDtl.amount) - val transDateTime = "${transdtl.shopDtl.transdate}${transdtl.shopDtl.transtime}" + val hosttime = systemUtilService.sysdatetime.hosttime + val transDateTime = "${transdtl.shopDtl.accdate}$hosttime" //下单日期(记账日期,退款时用到)+下单时间 val billno = transdtl.outTradeNo //billno放附加信息 val productInfo = "农商行网关快捷支付[${transdtl.shopDtl.transdesc}]"; //商品描述 val person = personDao.findByUserid(userSign.userid) @@ -222,6 +254,7 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } override fun doYnrccPayConfirm(transaction: TTransactionMain, plain: String, signature: String): AgentResponse { + logger.info("支付确认参数: refno=[${transaction.refno}],plain=[$plain],signature=[$signature]") if (TradeDict.DTL_STATUS_SUCCESS == transaction.status) { throw TransactionProcessException(TradeErrorCode.TRANSACTION_IS_FINISHED, "流水已入账!") } @@ -252,5 +285,64 @@ class YnrccNetPayBusinessServiceImpl(val personDao: PersonDao, } } + override fun doQueryYnrccPaySignList(userid: String?, bankcardno: String?): YnrccPaySignListQueryResponse { + val resp = YnrccPaySignListQueryResponse() + val signList = when (userid.isNullOrBlank()) { + true -> ynrccPaySignDao.queryActiveSignsByBankcardno(bankcardno?.trim()) + false -> when (bankcardno.isNullOrBlank()) { + true -> ynrccPaySignDao.queryActiveSignsByUserid(userid?.trim()) + false -> ynrccPaySignDao.queryActiveSignsByUseridAndBankcardno(userid?.trim(), bankcardno?.trim()) + } + } + if (signList.isNullOrEmpty()) { + resp.retcode = 99 + resp.retmsg = "无签约信息" + return resp + } + + val data = ArrayList() + for (sign in signList) { + data.add(YnrccPaySignInfo().apply { + this.signNo = sign.id + this.bankcardno = sign.bankcardno + this.shopaccno = sign.shopaccno + this.shopname = shopaccDao.getByShopaccno(sign.shopaccno)?.shopname ?: "" + this.signtime = sign.signTime + this.userid = sign.userid + }) + } + + resp.retcode = 0 + resp.retmsg = "success" + resp.data = data + return resp + } + + override fun doYnrccPayThirdAuth(thirdSrv: String, bankcardno: String, userid: String): YnrccPayThirdAuthResponse { + val resp = YnrccPayThirdAuthResponse() + resp.retcode = 99 + + //TODO: 根据第三方服务标识thirdSrv获取配置信息 + val mchId = "" + val appId = "" + val token = "" + val pubKey = "" + val handler = YNRCCOpenServiceApi.getInstance(mchId, appId, token, pubKey) + + //获取客户端sdk配置信息 + val sdkConfigData = handler.getSDKConfigData() + + //获取客户端SDK访问开放服务所需参数 + val person = personDao.findByUserid(userid) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户不存在!") + //TODO: 判断bankcard是否该userid所有 + val user = User(person.name, person.idno, person.mobile, bankcardno) + val access2ServiceData = handler.getAccess2ServiceData(user) + resp.retcode = 0 + resp.retmsg = "success" + resp.sdkConfigData = sdkConfigData + resp.access2ServiceData = access2ServiceData + return resp + } } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/ynrcc_netpay_business_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/ynrcc_netpay_business_service.kt index ad3527ce..aa2ddecc 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/ynrcc_netpay_business_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/ynrcc_netpay_business_service.kt @@ -28,4 +28,10 @@ interface YnrccNetPayBusinessService { @Transactional(rollbackFor = [Exception::class]) fun doYnrccPayConfirm(transaction: TTransactionMain, plain: String, signature: String): AgentResponse + + @Transactional(rollbackFor = [Exception::class]) + fun doQueryYnrccPaySignList(userid: String?, bankcardno: String?): YnrccPaySignListQueryResponse + + @Transactional(rollbackFor = [Exception::class]) + fun doYnrccPayThirdAuth(thirdSrv: String, bankcardno: String, userid: String): YnrccPayThirdAuthResponse } \ No newline at end of file diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt index 64293838..a55845fb 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/framework/controller/framework_controller.kt @@ -1,13 +1,8 @@ package com.supwisdom.dlpay.framework.controller -import com.google.gson.Gson import com.jcabi.manifests.Manifests -import com.supwisdom.dlpay.agent.service.YnrccNetPayService import com.supwisdom.dlpay.api.bean.ApiVersionResponse import com.supwisdom.dlpay.framework.ResponseBodyBuilder -import com.supwisdom.dlpay.framework.util.DateUtil -import com.supwisdom.dlpay.framework.util.RandomUtils -import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping @@ -17,9 +12,6 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/common") class AboutController { - @Autowired - private lateinit var ynrccNetPayService: YnrccNetPayService - @GetMapping("/version") fun version(): ResponseEntity { return try { @@ -32,31 +24,4 @@ class AboutController { .success(ApiVersionResponse("unknown"))) } } - - @GetMapping("/resttest") - fun test(): ResponseEntity { - return try { - val shopaccno="2000000013" - val transDateTime = DateUtil.getNow("yyyyMMddHHmmss") - val refno = transDateTime + RandomUtils.randomNumber(6) - val amount = 1 - val productInfo = "农商行快捷支付测试" - val extData = refno - val custname = "" - val email="" - val customerSignNo="12345678" - - val resp = ynrccNetPayService.doApplyYnrccPaySign(shopaccno) - -// val resp = ynrccNetPayService.doYnrccPayInit(shopaccno,refno,amount,transDateTime, -// productInfo,extData,custname,email,customerSignNo); - - ResponseEntity.ok(ResponseBodyBuilder.create() - .success(Gson().toJson(resp))) - } catch (e: Exception) { - e.printStackTrace() - ResponseEntity.ok(ResponseBodyBuilder.create() - .success(e.message ?: "error!")) - } - } } \ No newline at end of file diff --git a/payapi/src/main/resources/payment_merchant.properties b/payapi/src/main/resources/payment_merchant.properties index f07cdea2..6a10fe5b 100644 --- a/payapi/src/main/resources/payment_merchant.properties +++ b/payapi/src/main/resources/payment_merchant.properties @@ -1,11 +1,13 @@ development=no # \u8BC1\u4E66\u8DEF\u5F84,\u5FC5\u987B\u6307\u5B9A\u670D\u52A1\u5668\u7AEF\u8BC1\u4E66\u5BB9\u5668\u7EDD\u5BF9\u8DEF\u5F84 -cafile=D:/ynrccpay/merchant.jks +cafile=D:/ynrcc_test/merchant.jks # \u8BC1\u4E66\u5E93\u5BC6\u7801 store_password=111111 # \u7528\u4E8E\u5546\u6237\u7B7E\u540D\u7684\u79D8\u94A5\u522B\u540D -key_alias=merchant_key +#key_alias=merchant_key +key_alias=ynrcc # \u79D8\u94A5\u5BC6\u7801 -key_password=881220 +#key_password=881220 +key_password=111111 # \u9A8C\u7B7E\u79D8\u94A5\u522B\u540D alias_paygate=alias_paygate \ No newline at end of file