From 98aff17254f2273f33dcb674265c08f01e6bcd4f Mon Sep 17 00:00:00 2001 From: Tang Cheng Date: Fri, 19 Jul 2019 14:14:45 +0800 Subject: [PATCH] =?utf8?q?=E5=A2=9E=E5=8A=A0=20qrcode=20=E8=81=9A=E5=90=88?= =?utf8?q?=E4=BB=98=E6=B5=81=E7=A8=8B=E6=A1=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/api/bean/QrcodePayParam.java | 90 +++++++++++++++++++ .../dlpay/api/bean/QrcodePayResponse.java | 40 +++++++++ .../dlpay/agent/dao/QrcodePatternDao.java | 7 ++ .../dlpay/agent/dao/QrcodePayTransDao.java | 13 +++ .../dlpay/agent/domain/QrcodePattern.java | 46 ++++++++++ .../dlpay/agent/domain/QrcodePayTrans.java | 77 ++++++++++++++++ .../agent/service/AgentServiceProxy.java | 65 ++++++++++++++ .../agent/service/QrcodePatternService.java | 9 ++ .../impl/QrcodePatternServiceImpl.java | 25 ++++++ .../dlpay/agent/service/alipay_service.kt | 8 +- .../api/controller/consume_api_controller.kt | 16 ++++ .../controller/YnrccApiControllerTest.java | 7 ++ .../src/test/resources/bank_20190718.txt | 4 + 13 files changed, 403 insertions(+), 4 deletions(-) create mode 100644 payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayParam.java create mode 100644 payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayResponse.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePatternDao.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePattern.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/service/QrcodePatternService.java create mode 100644 payapi/src/main/java/com/supwisdom/dlpay/agent/service/impl/QrcodePatternServiceImpl.java create mode 100644 ynrcc-agent/src/test/java/com/supwisdom/agent/api/controller/YnrccApiControllerTest.java create mode 100644 ynrcc-agent/src/test/resources/bank_20190718.txt diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayParam.java new file mode 100644 index 00000000..d7eecb2d --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayParam.java @@ -0,0 +1,90 @@ +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 javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +public class QrcodePayParam extends APIRequestParam { + @Sign + private String billno; + @Sign + private String refno; + @Sign + @NotEmpty(message = "支付码不能为空") + private String qrcoode; + @Sign + @NotEmpty(message = "交易日期不能为空") + private String transdate; + @Sign + @NotEmpty(message = "交易时间不能为空") + private String transtime; + @Sign + @NotNull(message = "交易金额不能为空") + private Integer amount; + @Sign + private String shopaccno; + + public String getBillno() { + return billno; + } + + public void setBillno(String billno) { + this.billno = billno; + } + + public String getRefno() { + return refno; + } + + public void setRefno(String refno) { + this.refno = refno; + } + + public String getQrcoode() { + return qrcoode; + } + + public void setQrcoode(String qrcoode) { + this.qrcoode = qrcoode; + } + + public String getTransdate() { + return transdate; + } + + public void setTransdate(String transdate) { + this.transdate = transdate; + } + + public String getTranstime() { + return transtime; + } + + public void setTranstime(String transtime) { + this.transtime = transtime; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } + + public String getShopaccno() { + return shopaccno; + } + + public void setShopaccno(String shopaccno) { + this.shopaccno = shopaccno; + } + + @Override + public boolean checkParam() throws RequestParamCheckException { + return true; + } +} diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayResponse.java new file mode 100644 index 00000000..b6aae8f1 --- /dev/null +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodePayResponse.java @@ -0,0 +1,40 @@ +package com.supwisdom.dlpay.api.bean; + +public class QrcodePayResponse extends ApiResponse { + private String refno; + private String userid; + private Boolean anonymous; + private Integer amount; + + public String getRefno() { + return refno; + } + + public void setRefno(String refno) { + this.refno = refno; + } + + public String getUserid() { + return userid; + } + + public void setUserid(String userid) { + this.userid = userid; + } + + public Boolean getAnonymous() { + return anonymous; + } + + public void setAnonymous(Boolean anonymous) { + this.anonymous = anonymous; + } + + public Integer getAmount() { + return amount; + } + + public void setAmount(Integer amount) { + this.amount = amount; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePatternDao.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePatternDao.java new file mode 100644 index 00000000..54da64e1 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePatternDao.java @@ -0,0 +1,7 @@ +package com.supwisdom.dlpay.agent.dao; + +import com.supwisdom.dlpay.agent.domain.QrcodePattern; +import org.springframework.data.repository.CrudRepository; + +public interface QrcodePatternDao extends CrudRepository { +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java new file mode 100644 index 00000000..1db85a80 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/dao/QrcodePayTransDao.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.agent.dao; + +import com.supwisdom.dlpay.agent.domain.QrcodePayTrans; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + + +@Repository +public interface QrcodePayTransDao extends CrudRepository { + QrcodePayTrans findByRefnoAndTenantid(String refno, String tenantid); + + void deleteByRefnoAndTenantid(String refno, String tenantid); +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePattern.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePattern.java new file mode 100644 index 00000000..2949c61b --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePattern.java @@ -0,0 +1,46 @@ +package com.supwisdom.dlpay.agent.domain; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; + +@Table(name = "tb_qrcode_pattern") +@Entity +public class QrcodePattern { + @SequenceGenerator(name = "qrcode_pattern_id", sequenceName = "SEQ_QRCODE_PATTERN", allocationSize = 1, initialValue = 10) + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "qrcode_pattern_id") + @Id + @Column(name = "id") + private Integer id; + + @Column(name = "sourcetype", length = 20) + @NotNull + private String sourceType; + + @Column(name = "pattern", length = 300) + @NotNull + private String pattern; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } + + public String getPattern() { + return pattern; + } + + public void setPattern(String pattern) { + this.pattern = pattern; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java new file mode 100644 index 00000000..e5ccb696 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/domain/QrcodePayTrans.java @@ -0,0 +1,77 @@ +package com.supwisdom.dlpay.agent.domain; + +import javax.persistence.*; +import javax.validation.constraints.NotNull; +import java.sql.Timestamp; + +@Entity +@Table(name = "tb_qrcode_pay_trans", + indexes = {@Index(name = "qrcode_pay_trans_idx", columnList = "qrcode, sourcetype"), + @Index(name = "qrcode_pay_trans_idx2", columnList = "tenantid")}) +public class QrcodePayTrans { + @Id + @NotNull + private String refno; + @Column(name = "agent_user_id", length = 200) + private String agentUserId; + @Column(name = "qrcode", length = 256) + @NotNull + private String qrcode; + @Column(name = "sourcetype", length = 30) + @NotNull + private String sourceType; + @NotNull + @Column(name = "create_time") + private Timestamp create_time; + @NotNull + @Column(name = "tenantid", length = 20) + private String tenantid; + + public String getRefno() { + return refno; + } + + public void setRefno(String refno) { + this.refno = refno; + } + + public String getAgentUserId() { + return agentUserId; + } + + public void setAgentUserId(String agentUserId) { + this.agentUserId = agentUserId; + } + + public String getQrcode() { + return qrcode; + } + + public void setQrcode(String qrcode) { + this.qrcode = qrcode; + } + + public Timestamp getCreate_time() { + return create_time; + } + + public void setCreate_time(Timestamp create_time) { + this.create_time = create_time; + } + + public String getTenantid() { + return tenantid; + } + + public void setTenantid(String tenantid) { + this.tenantid = tenantid; + } + + public String getSourceType() { + return sourceType; + } + + public void setSourceType(String sourceType) { + this.sourceType = sourceType; + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java new file mode 100644 index 00000000..d3fb4f4b --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/AgentServiceProxy.java @@ -0,0 +1,65 @@ +package com.supwisdom.dlpay.agent.service; + +import com.supwisdom.dlpay.agent.dao.QrcodePayTransDao; +import com.supwisdom.dlpay.agent.domain.QrcodePattern; +import com.supwisdom.dlpay.agent.domain.QrcodePayTrans; +import com.supwisdom.dlpay.framework.tenant.TenantContext; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.regex.Pattern; + +@Service +public class AgentServiceProxy { + private final QrcodePayTransDao alipayTransDao; + private final QrcodePatternService qrcodePatternService; + + public AgentServiceProxy(QrcodePayTransDao alipayTransDao, + QrcodePatternService qrcodePatternService) { + this.alipayTransDao = alipayTransDao; + this.qrcodePatternService = qrcodePatternService; + } + + public QrcodePayTrans qrcodePayTransFindByRefno(String refno) { + return alipayTransDao.findByRefnoAndTenantid(refno, TenantContext.getTenantSchema()); + } + + public QrcodePayTrans qrcodePayTransSaveOrUpdate(QrcodePayTrans bean) { + if (bean.getTenantid().isEmpty()) { + bean.setTenantid(TenantContext.getTenantSchema()); + } + return alipayTransDao.save(bean); + } + + public void qrcodePayTransDelete(String refno) { + alipayTransDao.deleteByRefnoAndTenantid(refno, TenantContext.getTenantSchema()); + } + + public QrcodePattern qrcodeMatch(String code) { + List pattern = qrcodePatternService.getAllQrCodePattern(); + List found = new ArrayList<>(); + for (QrcodePattern item : pattern) { + if (Pattern.matches(item.getPattern(), code)) { + found.add(item); + } + } + if (found.size() == 0) { + throw new IllegalArgumentException("不支持的Qrcode"); + } + if (found.size() > 1) { + Set foundST = new HashSet<>(); + for (QrcodePattern item : found) { + if (!foundST.contains(item.getSourceType())) { + foundST.add(item.getSourceType()); + } + } + if (foundST.size() > 1) { + throw new IllegalArgumentException("Qrcode匹配错误,找到多个sourcetype"); + } + } + return found.get(0); + } +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/service/QrcodePatternService.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/QrcodePatternService.java new file mode 100644 index 00000000..d3a03971 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/QrcodePatternService.java @@ -0,0 +1,9 @@ +package com.supwisdom.dlpay.agent.service; + +import com.supwisdom.dlpay.agent.domain.QrcodePattern; + +import java.util.List; + +public interface QrcodePatternService { + List getAllQrCodePattern(); +} diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/service/impl/QrcodePatternServiceImpl.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/impl/QrcodePatternServiceImpl.java new file mode 100644 index 00000000..d2ad3919 --- /dev/null +++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/service/impl/QrcodePatternServiceImpl.java @@ -0,0 +1,25 @@ +package com.supwisdom.dlpay.agent.service.impl; + +import com.supwisdom.dlpay.agent.dao.QrcodePatternDao; +import com.supwisdom.dlpay.agent.domain.QrcodePattern; +import com.supwisdom.dlpay.agent.service.QrcodePatternService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; + +@Service +public class QrcodePatternServiceImpl implements QrcodePatternService { + @Autowired + private QrcodePatternDao qrcodePatternDao; + + @Override + @Cacheable(cacheNames = "qrcode_pattern_cache") + public List getAllQrCodePattern() { + List list = new ArrayList<>(); + qrcodePatternDao.findAll().forEach(list::add); + return list; + } +} diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt index eeecae9d..e32f7d8b 100644 --- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt +++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/alipay_service.kt @@ -7,19 +7,19 @@ import org.springframework.stereotype.Component @Component("alipayAgent") class AlipayAgentService : AgentPayService { - override fun pay(transaction: TTransactionMain?): AgentResponse { + override fun pay(transaction: TTransactionMain): AgentResponse { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun cancel(transaction: TTransactionMain?): AgentResponse { + override fun cancel(transaction: TTransactionMain): AgentResponse { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun refund(transaction: TTransactionMain?): AgentResponse { + override fun refund(transaction: TTransactionMain): AgentResponse { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } - override fun query(transaction: TTransactionMain?): AgentResponse { + override fun query(transaction: TTransactionMain): AgentResponse { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } } \ No newline at end of file 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 1f32d89f..a8b6e05a 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 @@ -434,6 +434,22 @@ class ConsumeAPIController { .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败")) } + @PostMapping("/qrcodepay/init") + fun qrcodePayInit(@Valid @RequestBody param: QrcodePayParam): ResponseEntity { + //1. 识别qrcode + //2. 初始化交易流水 + //3. 调用第三方检查身份信息 + TODO("") + } + + @PostMapping("/qrcodepay/confirm") + fun qrcodePayConfirm(@Valid @RequestBody param: QrcodePayParam): ResponseEntity { + //1. 检查交易流水状态,并 wip + //2. 请求第三方交易 + //3. 根据第三方返回处理业务流程 + TODO("") + } + // ============================================== // // // @GetMapping("/account/payinit") diff --git a/ynrcc-agent/src/test/java/com/supwisdom/agent/api/controller/YnrccApiControllerTest.java b/ynrcc-agent/src/test/java/com/supwisdom/agent/api/controller/YnrccApiControllerTest.java new file mode 100644 index 00000000..25746e01 --- /dev/null +++ b/ynrcc-agent/src/test/java/com/supwisdom/agent/api/controller/YnrccApiControllerTest.java @@ -0,0 +1,7 @@ +package com.supwisdom.agent.api.controller; + +import static org.junit.Assert.*; + +public class YnrccApiControllerTest { + +} \ No newline at end of file diff --git a/ynrcc-agent/src/test/resources/bank_20190718.txt b/ynrcc-agent/src/test/resources/bank_20190718.txt new file mode 100644 index 00000000..1831d7ac --- /dev/null +++ b/ynrcc-agent/src/test/resources/bank_20190718.txt @@ -0,0 +1,4 @@ +3|600|2|300|1|300| +20190701|132234|BC5512|20190614135011000011|20190701132234BK00001|6223900000000000001|6321980000000000002|20190701|100|市民卡代扣消费| +20190701|134434|BC5512|20190614135011000012|20190701132234BK00002|6223900000000000001|6321980000000000002|20190702|200|市民卡代扣消费| +20190701|142234|BC5513|20190614135011000013|20190701132234BK00003|6223900000000000001|6321980000000000002|20190701|300|退款| \ No newline at end of file -- 2.17.1