Commit 7008142a authored by Administrator's avatar Administrator

创建项目

parent 9398f372
......@@ -16,6 +16,18 @@
<dependencies>
<dependency>
<groupId>com.ctrip.framework.apollo</groupId>
<artifactId>apollo-client</artifactId>
<version>1.8.0</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.quant.baa.pay</groupId>
<artifactId>baa-pay-api</artifactId>
......
package cn.quant.baa.pay;
import java.time.Duration;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.Date;
......@@ -17,4 +18,9 @@ public class Constant {
*/
public static final LocalDate MINI_LOCAL_DATE = LocalDate.of(1970, 1, 1);
public static final Date MINI_DATE = Date.from(MINI_LOCAL_DATE.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
public static final String REDIS_NAMESPACE_PAY = "BAAPAY:PAY:P";
@Deprecated
public static final Duration PAY_DUE_TIME = Duration.ofMinutes(30);
}
package cn.quant.baa.pay.acquirer;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import com.fasterxml.jackson.databind.JsonNode;
/**
......@@ -8,6 +9,8 @@ import com.fasterxml.jackson.databind.JsonNode;
public class ChannelResponse {
private boolean success;
private String orderNo;
private String code;
private String message;
......@@ -22,9 +25,7 @@ public class ChannelResponse {
//微信平台签名
private String signature;
private String payUrl;
private String prepayId;
private String notification;
private JsonNode node;
......@@ -36,6 +37,14 @@ public class ChannelResponse {
this.success = success;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getCode() {
return code;
}
......@@ -92,20 +101,12 @@ public class ChannelResponse {
this.signature = signature;
}
public String getPayUrl() {
return payUrl;
}
public void setPayUrl(String payUrl) {
this.payUrl = payUrl;
}
public String getPrepayId() {
return prepayId;
public String getNotification() {
return notification;
}
public void setPrepayId(String prepayId) {
this.prepayId = prepayId;
public void setNotification(String notification) {
this.notification = notification;
}
public JsonNode getNode() {
......@@ -127,8 +128,7 @@ public class ChannelResponse {
sb.append(", timestamp='").append(timestamp).append('\'');
sb.append(", nonce='").append(nonce).append('\'');
sb.append(", signature='").append(signature).append('\'');
sb.append(", payUrl='").append(payUrl).append('\'');
sb.append(", prepayId='").append(prepayId).append('\'');
sb.append(", notification='").append(notification).append('\'');
sb.append(", node=").append(node);
sb.append('}');
return sb.toString();
......
......@@ -64,27 +64,29 @@ public class MerchantAcquirer implements Acquirer {
}
@Override
public ChannelResponse pay(PayRequestData payRequestData, PayHistoryEntity payHistoryEntity) throws Exception {
return acquirers.get(payRequestData.getChanId()).pay(payRequestData, payHistoryEntity);
public ChannelResponse pay(PayRequestData request, PayHistoryEntity history) throws Exception {
ChannelResponse response = acquirers.get(request.getChanId()).pay(request, history);
response.setOrderNo(String.valueOf(history.getTransactionId()));
return response;
}
@Override
public ChannelResponse refund(RefundRequestData refundRequestData) throws Exception {
return acquirers.get(refundRequestData.getChanId()).refund(refundRequestData);
public ChannelResponse refund(RefundRequestData request) throws Exception {
return acquirers.get(request.getChanId()).refund(request);
}
@Override
public ChannelResponse checkPay(CheckPayRequestData checkPayRequestData) throws Exception {
return acquirers.get(checkPayRequestData.getChanId()).checkPay(checkPayRequestData);
public ChannelResponse checkPay(CheckPayRequestData request) throws Exception {
return acquirers.get(request.getChanId()).checkPay(request);
}
@Override
public ChannelResponse checkRefund(CheckRefundRequestData checkRefundRequestData) throws Exception {
return acquirers.get(checkRefundRequestData.getChanId()).checkRefund(checkRefundRequestData);
public ChannelResponse checkRefund(CheckRefundRequestData request) throws Exception {
return acquirers.get(request.getChanId()).checkRefund(request);
}
@Override
public ChannelResponse close(CloseRequestData closeRequestData) throws Exception {
return acquirers.get(closeRequestData.getChanId()).close(closeRequestData);
public ChannelResponse close(CloseRequestData request) throws Exception {
return acquirers.get(request.getChanId()).close(request);
}
}
......@@ -100,15 +100,15 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
}
@Override
public ChannelResponse pay(PayRequestData payRequestData, PayHistoryEntity history) throws Exception {
public ChannelResponse pay(PayRequestData request, PayHistoryEntity history) throws Exception {
ObjectNode bodyNode = objectMapper.createObjectNode();
// 转换金额为分
BigInteger amount = new BigDecimal(payRequestData.getAmount()).multiply(new BigDecimal(100)).toBigInteger();
BigInteger amount = new BigDecimal(request.getAmount()).multiply(new BigDecimal(100)).toBigInteger();
bodyNode.put("mchid", properties.getPayAcctId())
.put("appid", properties.getPayAppId())
.put("attach", payRequestData.getAttach())
.put("description", payRequestData.getSubject())
.put("notify_url", payRequestData.getNotifyUrl())
.put("attach", request.getAttach())
.put("description", request.getSubject())
.put("notify_url", request.getNotifyUrl())
.put("out_trade_no", history.getTransactionId().toString());
bodyNode.putObject("amount")
.put("total", amount);
......@@ -127,16 +127,16 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
}
bodyNode.set("scene_info", sceneInfo);
String payAccess = properties.getPayAccess();
ChannelResponse response = doExecute(EXECUTE_PAY, payAccess, history.getIds(), bodyNode);
ChannelResponse response = doExecute(EXECUTE_PAY, payAccess, request, bodyNode);
JsonNode node = response.getNode();
if (node != null) {
node = response.getNode().get("h5_url");
if (node != null) {
response.setPayUrl(node.asText());
response.setNotification(node.asText());
}
node = response.getNode().get("prepay_id");
if (node != null) {
response.setPrepayId(node.asText());
response.setNotification(node.asText());
}
//TODO:he APP、小程序、H5、JS不同的方式设置对应的返回参数
}
......@@ -187,7 +187,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
* @param bodyNode
* @return
*/
private ChannelResponse doExecute(String execute, String access, PayHistoryIds ids, ObjectNode bodyNode) throws Exception {
private ChannelResponse doExecute(String execute, String access, Object request, ObjectNode bodyNode) throws Exception {
ChannelResponse response = null;
......@@ -238,7 +238,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
// if (null == body) {
// throw new NullException("http response body is null.");
// } else {
response = response(execute, access, ids, clientResponse);
response = response(execute, access, request, clientResponse);
//签名信息
// String wsSignText = joining("\n", wxTimestamp, nonce, body);
......@@ -267,17 +267,17 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
response.setCode(COMMON_ERROR_CODE);
response.setMessage(COMMON_ERROR_CODE);
} else {
response.setCode(itemDTO.getCode());
response.setCode(itemDTO.getValue());
response.setMessage(itemDTO.getText());
}
}
return response;
}
private ChannelResponse response(String execute, String access, PayHistoryIds ids, ClientResponse response) {
private ChannelResponse response(String execute, String access, Object request, ClientResponse response) {
if (response == null) {
throw new NullException(StringUtils.format("Client response is null : {}; {}; {};", execute, access, ids));
throw new NullException(StringUtils.format("Client response is null : {}; {}; {};", execute, access, request));
}
ChannelResponse responseData = new ChannelResponse();
......@@ -314,18 +314,18 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
} else {
responseData.setSuccess(false);
responseData.setCode(codeNode.asText(COMMON_ERROR_CODE));
responseData.setMessage(StringUtils.format("Client response http status : {}; {}; {}; {};", execute, access, ids, httpStatus));
responseData.setMessage(StringUtils.format("Client response http status : {}; {}; {}; {};", execute, access, request, httpStatus));
logger.warn(responseData.getMessage());
}
} else {
responseData.setSuccess(false);
responseData.setCode(codeNode.asText(COMMON_ERROR_CODE));
responseData.setMessage(jsonNode.get("message").asText(""));
logger.warn("Client response body code : {}; {}; {}; {};", execute, access, ids, responseData);
logger.warn("Client response body code : {}; {}; {}; {};", execute, access, request, responseData);
}
} catch (Exception e) {
logger.warn(StringUtils.format("Object mapper read response : {}; {}; {};", execute, access, ids), e);
logger.warn(StringUtils.format("Object mapper read response : {}; {}; {};", execute, access, request), e);
responseData.setSuccess(false);
responseData.setCode(COMMON_ERROR_CODE);
responseData.setMessage(e.getMessage());
......
......@@ -48,5 +48,6 @@ public class ServerConfiguration {
PersistentEntityInvoker invoker = new PersistentEntityInvoker(repositories);
return invoker;
}
}
......@@ -4,7 +4,7 @@ package cn.quant.baa.pay.dict;
* Created by Administrator on 2021/8/24 0024.
*/
public enum MessageEnum {
EMPTY_REQ_DATA("2000000"),
ILLEGAL_REQ_DATA("2000000"),
ILLEGAL_REQ_SUBJECT("2000000"),
ILLEGAL_REQ_MCH_ID("2000000"),
ILLEGAL_REQ_CHAN_ID("2000000"),
......
......@@ -7,14 +7,11 @@ import cn.quant.baa.pay.jpa.entity.*;
import cn.quant.baa.pay.model.web.GoodsDetail;
import cn.quant.baa.pay.model.web.PayRequestData;
import cn.quant.spring.util.DateUtils;
import org.hibernate.engine.jdbc.batch.spi.Batch;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import static cn.quant.baa.pay.Constant.MINI_DATE;
import static cn.quant.baa.pay.Constant.MINI_LOCAL_DATE;
/**
......@@ -63,7 +60,7 @@ public class EntityBuilder {
return account;
}
public static PayHistoryEntity payHistory(AccountEntity account, PayHistoryIds ids, long historyId, PayRequestData data, AcquirerProperties profile
public static PayHistoryEntity payHistory(AccountEntity account, PayHistoryIds ids, long historyId, PayRequestData data, AcquirerProperties properties
, TransactionSession session) {
BigDecimal discount = new BigDecimal(data.getDiscounts());
......@@ -81,22 +78,17 @@ public class EntityBuilder {
entity.setCreditDebitFlag(CreditDebitFlag.C);
entity.setCurrencyCode(CurrencyCode.CNY);
entity.setCustomerGenFlag(true);
entity.setChannelId(properties.getMchChanId());
entity.setDiscAmount(discount);
entity.setGenFeeAmount(BigDecimal.ZERO);
entity.setGoodsSigner(signer);
entity.setShopName(data.getShopName());
entity.setMobilePhone(data.getPhoneNo());
entity.setNotifyUrl(data.getNotifyUrl());
entity.setOriginalTxnAmount(origAmt);
entity.setPayDueTime(LocalDateTime.now().plusMinutes(30));
entity.setPayAcctId(profile.getPayAcctId());
entity.setPayChanCode(profile.getPayChanCode());
entity.setPayAppId(profile.getPayAppId());
entity.setPayMethod(PayMethod.DRST);
entity.setPostCashAmount(cash);
entity.setPostCreditAmount(credit);
entity.setPartitionKey(account.getPartitionKey());
entity.setRequestId(session.getRequestId());
entity.setRequestTime(session.getRequestTime());
entity.setShopName(data.getShopName());
entity.setStatementeFlag(true);
......@@ -139,7 +131,7 @@ public class EntityBuilder {
return entity;
}
public static BatchCycleTriggerEntity payTrigger(Long triggerId, PayHistoryEntity history){
public static BatchCycleTriggerEntity payTrigger(Long triggerId, PayHistoryEntity history) {
Date now = DateUtils.now();
BatchCycleTriggerEntity entity = new BatchCycleTriggerEntity();
entity.setAccountId(history.getAccountId());
......
......@@ -36,6 +36,9 @@ public class BatchCycleTriggerEntity extends PartitionEntity implements Serializ
@Column(name = "PAY_DUE_TIME", nullable = false)
private LocalDateTime payDueTime;
@Column(name = "NOTIFY_URL", nullable = true, length = 1000)
private String notifyUrl;
@Enumerated(EnumType.STRING)
@Column(name = "CHAN_NOTIFY_STATUS", nullable = false, length = 4)
private StatusCode chanNotifyStatus;
......@@ -50,6 +53,9 @@ public class BatchCycleTriggerEntity extends PartitionEntity implements Serializ
@Column(name = "MCH_NOTIFY_TIME", nullable = true)
private Date mchNotifyTime;
@Column(name = "REQUEST_ID", nullable = true, length = 64)
private String requestId;
public long getTriggerId() {
return triggerId;
}
......@@ -90,6 +96,14 @@ public class BatchCycleTriggerEntity extends PartitionEntity implements Serializ
this.payDueTime = payDueTime;
}
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
public StatusCode getChanNotifyStatus() {
return chanNotifyStatus;
}
......@@ -122,6 +136,14 @@ public class BatchCycleTriggerEntity extends PartitionEntity implements Serializ
this.mchNotifyTime = mchNotifyTime;
}
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
@Override
public String getPersistentKey() {
return StringUtils.toDelimitedString(CLASS_NAME, triggerId);
......@@ -143,10 +165,12 @@ public class BatchCycleTriggerEntity extends PartitionEntity implements Serializ
sb.append(", targetId=").append(targetId);
sb.append(", accountId=").append(accountId);
sb.append(", payDueTime=").append(payDueTime);
sb.append(", chanNotifyStatus='").append(chanNotifyStatus).append('\'');
sb.append(", notifyUrl='").append(notifyUrl).append('\'');
sb.append(", chanNotifyStatus=").append(chanNotifyStatus);
sb.append(", chanNotifyTime=").append(chanNotifyTime);
sb.append(", mchNotifyStatus='").append(mchNotifyStatus).append('\'');
sb.append(", mchNotifyStatus=").append(mchNotifyStatus);
sb.append(", mchNotifyTime=").append(mchNotifyTime);
sb.append(", requestId='").append(requestId).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
......
......@@ -33,14 +33,8 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
@Column(name = "ACCOUNT_ID", nullable = false, updatable = false)
private Long accountId;
@Column(name = "PAY_APP_ID", nullable = false, updatable = false, length = 32)
private String payAppId;
@Column(name = "PAY_CHAN_CODE", nullable = false, updatable = false, length = 4)
private String payChanCode;
@Column(name = "PAY_ACCT_ID", nullable = false, updatable = false, length = 4)
private String payAcctId;
@Column(name = "CHANNEL_ID", nullable = false, updatable = false)
private Long channelId;
@Column(name = "SUBJECT", nullable = false, updatable = false, length = 128)
private String subject;
......@@ -125,9 +119,6 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
@Column(name = "ADDRESS", nullable = true, length = 500)
private String address;
@Column(name = "NOTIFY_URL", nullable = true, length = 1000)
private String notifyUrl;
@Column(name = "ATTACH_TEXT", nullable = true, length = 512)
private String attachText;
......@@ -155,28 +146,12 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
this.accountId = accountId;
}
public String getPayAppId() {
return payAppId;
}
public void setPayAppId(String payAppId) {
this.payAppId = payAppId;
}
public String getPayChanCode() {
return payChanCode;
public Long getChannelId() {
return channelId;
}
public void setPayChanCode(String payChanCode) {
this.payChanCode = payChanCode;
}
public String getPayAcctId() {
return payAcctId;
}
public void setPayAcctId(String payAcctId) {
this.payAcctId = payAcctId;
public void setChannelId(Long channelId) {
this.channelId = channelId;
}
public String getSubject() {
......@@ -387,14 +362,6 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
this.address = address;
}
public String getNotifyUrl() {
return notifyUrl;
}
public void setNotifyUrl(String notifyUrl) {
this.notifyUrl = notifyUrl;
}
public String getAttachText() {
return attachText;
}
......@@ -422,9 +389,7 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
sb.append("ids=").append(ids);
sb.append(", transactionId=").append(transactionId);
sb.append(", accountId=").append(accountId);
sb.append(", payAppId='").append(payAppId).append('\'');
sb.append(", payChanCode='").append(payChanCode).append('\'');
sb.append(", payAcctId='").append(payAcctId).append('\'');
sb.append(", channelId=").append(channelId);
sb.append(", subject='").append(subject).append('\'');
sb.append(", statusCode=").append(statusCode);
sb.append(", currencyCode=").append(currencyCode);
......@@ -451,7 +416,6 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
sb.append(", mobilePhone='").append(mobilePhone).append('\'');
sb.append(", goodsSigner='").append(goodsSigner).append('\'');
sb.append(", address='").append(address).append('\'');
sb.append(", notifyUrl='").append(notifyUrl).append('\'');
sb.append(", attachText='").append(attachText).append('\'');
sb.append(',').append(super.toString());
sb.append('}');
......
package cn.quant.baa.pay.model.web;
/**
* Created by Administrator on 2021/9/24 0024.
*/
public interface ChannelRequestData {
String getChanId();
}
......@@ -9,7 +9,7 @@ import java.util.Arrays;
/**
* Created by Administrator on 2021/8/24 0024.
*/
public class PayRequestData implements Serializable{
public class PayRequestData implements ChannelRequestData, Serializable{
private static final long serialVersionUID = -8274612481658761761L;
......@@ -25,10 +25,6 @@ public class PayRequestData implements Serializable{
@NotNull(message = "ILLEGAL_REQ_MCH_ID")
private String mchId;
/**
* 支付通道ID
*/
@NotNull(message = "ILLEGAL_REQ_CHAN_ID")
private String chanId;
/**
......
package cn.quant.baa.pay.model.web;
/**
* Created by Administrator on 2021/9/24 0024.
*/
public class PayResponseData {
private String orderNo;
private String prepay;
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getPrepay() {
return prepay;
}
public void setPrepay(String prepay) {
this.prepay = prepay;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayResponseData{");
sb.append("orderNo='").append(orderNo).append('\'');
sb.append(", prepay='").append(prepay).append('\'');
sb.append('}');
return sb.toString();
}
}
EMPTY_REQ_DATA=Illegal request data.
ILLEGAL_REQ_DATA=Illegal request data.
ILLEGAL_REQ_MCH_ID=Illegal merchant id - {0}.
ILLEGAL_REQ_CHAN_ID=Illegal pay channel id - {0}.
ILLEGAL_REQ_BUYER_ID=Illegal payer id - {0}.
......
EMPTY_REQ_DATA=Illegal request data.
ILLEGAL_REQ_DATA=Illegal request data.
ILLEGAL_REQ_MCH_ID=Illegal merchant id - {0}.
ILLEGAL_REQ_CHAN_ID=Illegal pay channel id - {0}.
ILLEGAL_REQ_BUYER_ID=Illegal payer id - {0}.
......
EMPTY_REQ_DATA=\u8BF7\u6C42\u6570\u636E\u683C\u5F0F\u9519\u8BEF
ILLEGAL_REQ_DATA=\u8BF7\u6C42\u6570\u636E"data"\u683C\u5F0F\u9519\u8BEF
ILLEGAL_REQ_SUBJECT={0}-\u8BA2\u5355\u6807\u9898\u9519\u8BEF
ILLEGAL_REQ_MCH_ID={0}-\u5546\u6237ID\u9519\u8BEF
ILLEGAL_REQ_CHAN_ID={0}-\u652F\u4ED8\u901A\u9053ID\u9519\u8BEF
......
......@@ -2,6 +2,7 @@ package cn.quant.baa.pay;
import cn.quant.spring.util.IdentitySequencer;
import cn.quant.spring.util.ServerUtils;
import com.ctrip.framework.apollo.spring.annotation.EnableApolloConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
......@@ -21,10 +22,11 @@ import java.time.format.DateTimeFormatter;
/**
* <p><b>Application VM Option:</b><br/>
* <code>--spring.config.file=${project.build.directory}/target/config/application-dev.properties </code><br/>
* <code>-Dlogging.config=${project.build.directory}/target/config/logback-spring.xml</code></p>
* <code>-Dlogging.config=${project.build.directory}/target/config/logback-pro.xml</code></p>
* <p><b>Enable Dubbo Annotation: </b><br/>
* <code>@org.springframework.context.annotation.ImportResource(locations = {"classpath:application-dubbo.xml"})</code></p>
*/
@EnableApolloConfig
@ComponentScan
@SpringBootApplication
@EnableAutoConfiguration
......
package cn.quant.baa.pay.rest;
import cn.quant.baa.pay.acquirer.ChannelResponse;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.model.web.PayResponseData;
import cn.quant.spring.http.HttpResponseData;
import cn.quant.spring.rest.AbstractController;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.Map;
/**
* Created by Administrator on 2021/8/28 0028.
*/
public abstract class BusinessController extends AbstractController {
private final static ObjectMapper objectMapper = new ObjectMapper();
public BusinessController() {
SimpleModule simpleModule = new SimpleModule();
simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
simpleModule.addSerializer(LocalDateTime.class, LocalDateTimeSerializer.INSTANCE);
simpleModule.addDeserializer(LocalDateTime.class, LocalDateTimeDeserializer.INSTANCE);
simpleModule.addSerializer(LocalDate.class, LocalDateSerializer.INSTANCE);
simpleModule.addDeserializer(LocalDate.class, LocalDateDeserializer.INSTANCE);
simpleModule.addSerializer(ZonedDateTime.class, ZonedDateTimeSerializer.INSTANCE);
objectMapper.registerModule(simpleModule);
objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
}
public Map deserialize(String value) throws IOException {
return objectMapper.readValue(value.getBytes(), Map.class);
}
public String serialize(HttpResponseData value) throws JsonProcessingException {
return objectMapper.writeValueAsString(value);
}
public HttpResponseData response(ChannelResponse response) {
TransactionSession session = TransactionSession.session();
PayResponseData data = new PayResponseData();
data.setOrderNo(response.getOrderNo());
data.setPrepay(response.getNotification());
HttpResponseData responseData = new HttpResponseData(data);
responseData.setSuccess(response.getSuccess());
responseData.setMessage(response.getMessage());
responseData.setStatus(response.getCode());
responseData.setRequestId(session.getRequestId());
return responseData;
}
}
......@@ -45,7 +45,7 @@ public class MerchantController extends AbstractController {
MerchantChannelRequestData data = request.getData();
if (data == null) {
AssertUtils.throwMessage(EMPTY_REQ_DATA);
AssertUtils.throwMessage(ILLEGAL_REQ_DATA);
}
Map<String, MerchantChannelResponseData> channels = merchantStorageService.getChannels(data);
......@@ -63,7 +63,7 @@ public class MerchantController extends AbstractController {
MerchantChannelRequestData data = request.getData();
if (data == null) {
AssertUtils.throwMessage(EMPTY_REQ_DATA);
AssertUtils.throwMessage(ILLEGAL_REQ_DATA);
}
MerchantAcquirerProperties channel = merchantStorageService.getChannel(Long.parseLong(data.getChanId()));
......
//package cn.quant.baa.pay.rest;
//
//import cn.quant.baa.pay.annotation.BusinessMapping;
//import cn.quant.baa.pay.component.Sequencer;
//import cn.quant.baa.pay.context.TransactionSession;
//import cn.quant.baa.pay.model.BusinessRequest;
//import cn.quant.baa.pay.model.web.CheckPayRequestData;
//import cn.quant.baa.pay.model.web.CheckRefundRequestData;
//import cn.quant.baa.pay.model.web.PayRequestData;
//import cn.quant.baa.pay.service.TransactionService;
//import cn.quant.spring.context.ServerApplicationContext;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.DeserializationFeature;
//import com.fasterxml.jackson.databind.JsonNode;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import com.fasterxml.jackson.databind.PropertyNamingStrategy;
//import com.fasterxml.jackson.databind.json.JsonMapper;
//import com.fasterxml.jackson.databind.node.ObjectNode;
//import org.json.JSONObject;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.ui.Model;
//import org.springframework.web.bind.annotation.*;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.HashMap;
//import java.util.Map;
//
///**
// * Created with IntelliJ IDEA.
// * Author: Lipeng Liu
// * Date: 2021/9/9
// * Time: 上午9:51
// * Description: No Description
// */
//@Controller
////@RestController
//@RequestMapping("pay")
//public class PayTestController {
//
// ObjectMapper objectMapper = new ObjectMapper();
//
// @Autowired
// private TransactionService transactionService;
//
// @Autowired
// private ServerApplicationContext serverApplicationContext;
//
// @Autowired
// private Sequencer sequencer;
//
// @GetMapping("")
// public String getPay(Model model) {
// return "pay/index";
// }
//
// @RequestMapping("h5")
// public String getH5(Model model) {
// return "pay/h5";
// }
//
// @RequestMapping("checkPay")
// public String checkPay(CheckPayRequestData data, Model model, HttpServletRequest servletRequest) {
// String res = "";
// if (servletRequest.getMethod().equals("POST")) {
// res = transactionService.checkPay(data).toString();
// }
// model.addAttribute("res", res);
// return "pay/checkPay";
// }
//
// @RequestMapping("checkRefund")
// public String checkRefund(CheckRefundRequestData data, Model model, HttpServletRequest servletRequest) {
//
// String res = "";
// if (servletRequest.getMethod().equals("POST")) {
// res = transactionService.checkRefund(data).toString();
// }
// model.addAttribute("res", res);
// return "pay/checkRefund";
// }
//
//
package cn.quant.baa.pay.rest;
import cn.quant.baa.pay.acquirer.ChannelResponse;
import cn.quant.baa.pay.annotation.BusinessMapping;
import cn.quant.baa.pay.component.Sequencer;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.baa.pay.model.web.CheckPayRequestData;
import cn.quant.baa.pay.model.web.CheckRefundRequestData;
import cn.quant.baa.pay.model.web.PayRequestData;
import cn.quant.baa.pay.service.TransactionService;
import cn.quant.spring.context.ServerApplicationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
/**
* Created with IntelliJ IDEA.
* Author: Lipeng Liu
* Date: 2021/9/9
* Time: 上午9:51
* Description: No Description
*/
@Controller
//@RestController
@RequestMapping("pay")
public class PayTestController {
ObjectMapper objectMapper = new ObjectMapper();
@Autowired
private TransactionService transactionService;
@Autowired
private ServerApplicationContext serverApplicationContext;
@Autowired
private Sequencer sequencer;
@GetMapping("")
public String getPay(Model model) {
return "pay/index";
}
@RequestMapping("h5")
public String getH5(Model model) {
return "pay/h5";
}
@RequestMapping("checkPay")
public String checkPay(CheckPayRequestData data, Model model, HttpServletRequest servletRequest) throws Exception {
String res = "";
if (servletRequest.getMethod().equals("POST")) {
res = transactionService.checkPay(data).toString();
}
model.addAttribute("res", res);
return "pay/checkPay";
}
@RequestMapping("checkRefund")
public String checkRefund(CheckRefundRequestData data, Model model, HttpServletRequest servletRequest) throws Exception {
String res = "";
if (servletRequest.getMethod().equals("POST")) {
res = transactionService.checkRefund(data).toString();
}
model.addAttribute("res", res);
return "pay/checkRefund";
}
// @PostMapping("goPay")
// @BusinessMapping(session = 1)
// @ResponseBody
// public JsonNode goPay(@RequestBody(required = false) BusinessRequest<PayRequestData> requestData) {
// public ChannelResponse goPay(@RequestBody(required = false) BusinessRequest<PayRequestData> requestData) throws Exception {
// PayRequestData data = requestData.getData();
// String str = "{\"subject\":\"测试订单1\",\"mchId\":\"wx2f44c7fe7b08458d\",\"chanId\":\"75772285618946307\",\"outTradeNo\":\"11111111223\",\"originalAmount\":\"110.00\",\"amount\":0.01,\"discounts\":\"10.00\",\"notifyUrl\":\"http://127.0.0.1:8080/notifyUrl\",\"buyerId\":\"777777\",\"attach\":\"AAAA-BBBB-1111-2222\",\"creditAmount\":\"10.00\",\"cashAmount\":\"10\",\"goodsDetail\":[{\"goodsNo\":\"123123\",\"goodsId\":\"11111\",\"goodsName\":\"商品1\",\"quantity\":2,\"price\":\"10.00\",\"discounts\":\"2.5\",\"amount\":\"17.5\",\"attach\":\"---\",\"creditAmount\":123,\"cashAmount\":123}]}";
// try {
// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// PayRequestData payRequestData = objectMapper.readValue(str, PayRequestData.class);
// String[] temp = data.getChanId().split("_");
// payRequestData.setChanId(temp[0]);
// payRequestData.setMchId(temp[1]);
// payRequestData.setOutTradeNo(data.getOutTradeNo());
// payRequestData.setSubject(data.getSubject());
// payRequestData.setAmount(data.getAmount());
// payRequestData.setNotifyUrl("http://127.0.0.1:8080/notifyUrl");
// JsonNode res = transactionService.pay(payRequestData);
// return res;
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// }
// return objectMapper.createObjectNode();
// }
//
//}
\ No newline at end of file
// objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// PayRequestData payRequestData = objectMapper.readValue(str, PayRequestData.class);
// String[] temp = data.getChanId().split("_");
// payRequestData.setChanId(temp[0]);
// payRequestData.setMchId(temp[1]);
// payRequestData.setOutTradeNo(data.getOutTradeNo());
// payRequestData.setSubject(data.getSubject());
// payRequestData.setAmount(data.getAmount());
// payRequestData.setNotifyUrl("http://127.0.0.1:8080/notifyUrl");
// ChannelResponse response = transactionService.pay(payRequestData);
// return response;
//
// }
}
\ No newline at end of file
package cn.quant.baa.pay.rest;
import cn.quant.baa.pay.acquirer.AcquirerProperties;
import cn.quant.baa.pay.acquirer.AcquirerPropertiesSource;
import cn.quant.baa.pay.acquirer.ChannelResponse;
import cn.quant.baa.pay.annotation.BusinessMapping;
import cn.quant.baa.pay.model.BusinessRequest;
import cn.quant.baa.pay.model.web.*;
import cn.quant.baa.pay.service.TransactionService;
import cn.quant.baa.pay.util.AssertUtils;
import cn.quant.spring.http.HttpResponseData;
import cn.quant.spring.util.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import static cn.quant.baa.pay.Constant.PAY_DUE_TIME;
import static cn.quant.baa.pay.Constant.REDIS_NAMESPACE_PAY;
import static cn.quant.baa.pay.dict.MessageEnum.*;
/**
* Created by Administrator on 2021/8/24 0024.
*/
......@@ -20,22 +29,52 @@ public class TransactionController extends BusinessController {
@Autowired
private TransactionService transactionService;
@Autowired
private AcquirerPropertiesSource acquirerPropertiesSource;
@Autowired
private StringRedisTemplate stringRedisTemplate;
public AcquirerProperties check(ChannelRequestData data) {
if (data == null) {
AssertUtils.throwMessage(ILLEGAL_REQ_DATA);
}
String chanId = data.getChanId();
if (chanId == null) {
AssertUtils.throwMessage(ILLEGAL_REQ_CHAN_ID, chanId);
}
AcquirerProperties properties = acquirerPropertiesSource.get(Long.valueOf(chanId));
if (properties == null) {
AssertUtils.throwMessage(ACQUIRER_NOSUCH, chanId);
}
return properties;
}
@ResponseBody
@BusinessMapping(session = 1)
@PostMapping("/pay")
public ResponseEntity pay(@RequestBody BusinessRequest<PayRequestData> request) {
public ResponseEntity pay(@RequestBody BusinessRequest<PayRequestData> request) throws Exception {
PayRequestData requestData = request.getData();
ChannelResponse responseData = null;
try {
responseData = transactionService.pay(requestData);
} catch (Exception e) {
e.printStackTrace();
AcquirerProperties properties = check(requestData);
String institutionId = properties.getInstitutionId();
String productId = properties.getProductId();
String buyerId = requestData.getBuyerId();
String outTradeNo = requestData.getOutTradeNo();
String redisKey = StringUtils.toDelimitedString(REDIS_NAMESPACE_PAY, institutionId, productId, buyerId, outTradeNo);
String redisValue = stringRedisTemplate.opsForValue().get(redisKey);
if (redisValue != null) {
return ResponseEntity.ok(deserialize(redisValue));
}
ResponseEntity<HttpResponseData> responseEntity = succeed(responseData);
return responseEntity;
ChannelResponse channelResponse = transactionService.pay(properties, requestData);
HttpResponseData response = response(channelResponse);
if (channelResponse.getSuccess()) {
stringRedisTemplate.opsForValue().set(redisKey, serialize(response), PAY_DUE_TIME);
}
return ResponseEntity.ok(response);
}
@ResponseBody
......
package cn.quant.baa.pay.service;
import cn.quant.baa.pay.acquirer.AcquirerPropertiesSource;
import cn.quant.baa.pay.acquirer.AcquirerProperties;
import cn.quant.baa.pay.acquirer.ChannelResponse;
import cn.quant.baa.pay.acquirer.MerchantAcquirer;
import cn.quant.baa.pay.config.DictionaryViewer;
import cn.quant.baa.pay.context.TransactionSession;
import cn.quant.baa.pay.jpa.EntityBuilder;
import cn.quant.baa.pay.jpa.entity.*;
import cn.quant.baa.pay.model.web.*;
import cn.quant.baa.pay.util.AssertUtils;
import cn.quant.spring.util.StringUtils;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.ZonedDateTimeSerializer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -17,10 +26,16 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.LinkedList;
import java.util.List;
import static cn.quant.baa.pay.dict.MessageEnum.*;
import static cn.quant.baa.pay.Constant.PAY_DUE_TIME;
import static cn.quant.baa.pay.dict.MessageEnum.ACQUIRER_NOMATCH;
import static cn.quant.baa.pay.dict.MessageEnum.EXIST_ORDER;
/**
* Created by Administrator on 2021/8/24 0024.
......@@ -30,15 +45,10 @@ public class TransactionService extends BusinessService {
private static final Logger logger = LoggerFactory.getLogger(TransactionService.class);
@Autowired
private AcquirerPropertiesSource acquirerPropertiesSource;
@Autowired
private MerchantAcquirer acquirer;
@Autowired
private DictionaryViewer dictionaryViewer;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void check(PayHistoryIds ids, TransactionSession session) {
PayHistoryEntity historyEntity = session.findOne(PayHistoryEntity.class, ids);
......@@ -48,22 +58,18 @@ public class TransactionService extends BusinessService {
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public ChannelResponse pay(PayRequestData data) throws Exception {
public ChannelResponse pay(AcquirerProperties properties, PayRequestData data) throws Exception {
validate(data);
String chanId = data.getChanId();
AcquirerProperties profile = acquirerPropertiesSource.get(Long.valueOf(chanId));
if (profile == null) {
AssertUtils.throwMessage(ACQUIRER_NOSUCH, chanId);
}
String institutionId = profile.getInstitutionId();
String productId = profile.getProductId();
String buyerId = data.getBuyerId();
TransactionSession session = TransactionSession.session();
Long chanId = properties.getMchChanId();
String institutionId = properties.getInstitutionId();
String productId = properties.getProductId();
String buyerId = data.getBuyerId();
String outTradeNo = data.getOutTradeNo();
PayHistoryIds ids = new PayHistoryIds();
ids.setInstitutionId(institutionId);
ids.setProductId(productId);
......@@ -73,7 +79,7 @@ public class TransactionService extends BusinessService {
prepare(institutionId, productId, buyerId, session);
String mchId = data.getMchId();
if (!mchId.equals(profile.getPayAppId())) {
if (!mchId.equals(properties.getPayAppId())) {
AssertUtils.throwMessage(ACQUIRER_NOMATCH, chanId, mchId);
}
......@@ -90,24 +96,23 @@ public class TransactionService extends BusinessService {
details.add(detailEntity);
}
PayHistoryEntity history = EntityBuilder.payHistory(account, ids, historyId, data, profile, session);
long triggerId = session.nextId();
PayHistoryEntity history = EntityBuilder.payHistory(account, ids, historyId, data, properties, session);
ChannelResponse responseData = acquirer.pay(data, history);
if(responseData.getSuccess()){
if (responseData.getSuccess()) {
EntityBuilder.nextTxnNo(account, history);
BatchCycleTriggerEntity trigger = EntityBuilder.payTrigger(triggerId, history);
session.pushEntity(history);
session.pushEntity(trigger);
session.pushEntity(details);
history.setPayDueTime(LocalDateTime.now().plus(PAY_DUE_TIME));
history.setRequestId(responseData.getRequestId());
history.setDescText(responseData.getNotification());
session.commit();
session.addProperty(PayHistoryEntity.class, history);
session.addProperty(PayGoodsDetailEntity.class, details);
BatchCycleTriggerEntity trigger = EntityBuilder.payTrigger(session.nextId(), history);
trigger.setRequestId(session.getRequestId());
trigger.setNotifyUrl(data.getNotifyUrl());
session.pushEntity(history, trigger);
session.pushEntity(details);
session.commit();
}
return responseData;
......
app.id=baa-pay-server
apollo.meta=http://apollo-dev.quantgroups.com
\ No newline at end of file
......@@ -7,10 +7,10 @@ spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
#Server
server.port=8080
#server.port=8080
server.servlet.context-path=/
#quant
quant.server.number=1
#quant.server.number=1
quant.server.sequencer.operator=TWEPOCH_PLUS
quant.server.sequencer.sequence-bits=8
#Database
......
......@@ -21,4 +21,4 @@ spring:
cloud:
task:
initialize:
enable: false
\ No newline at end of file
enable: false
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<contextListener class="ch.qos.logback.classic.jul.LevelChangePropagator">
<resetJUL>true</resetJUL>
</contextListener>
<appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.dir}/${project.name}/${project.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logging.dir}/${project.name}/${project.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<maxHistory>90</maxHistory>
<maxFileSize>512MB</maxFileSize>
<totalSizeCap>10GB</totalSizeCap>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
</rollingPolicy>
<encoder>
<charset>utf-8</charset>
<Pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t|%logger{1.}|%M] - %msg %ex{full}%n</Pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--<pattern>%-4relative [%thread] %-5level %logger{35} - %msg %ex{full}%n</pattern>-->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}][%p][%t|%logger{1.}|%M] - %msg %ex{full}%n</pattern>
</encoder>
</appender>
<logger name="cn.quant.baa.pay" level="DEBUG"/>
<logger name="javax.activation" level="ERROR"/>
<logger name="org.quartz.core" level="ERROR"/>
<logger name="org.quartz.simpl" level="ERROR"/>
<logger name="io.lettuce.core" level="ERROR"/>
<logger name="io.netty" level="ERROR"/>
<logger name="com.zaxxer.hikari.pool" level="ERROR"/>
<logger name="com.alibaba.dubbo.common.extension" level="ERROR"/>
<logger name="sun.net.www.protocol.http" level="ERROR"/>
<logger name="com.ctrip.framework.apollo.internals" level="ERROR"/>
<logger name="org.apache.zookeeper" level="ERROR"/>
<logger name="org.apache.curator" level="ERROR"/>
<logger name="org.apache.coyote" level="ERROR"/>
<logger name="org.apache.catalina" level="ERROR"/>
<logger name="org.hibernate.hql" level="ERROR"/>
<logger name="org.hibernate.loader" level="ERROR"/>
<logger name="org.hibernate.type" level="ERROR"/>
<logger name="org.hibernate.persister" level="ERROR"/>
<logger name="org.hibernate.cfg" level="ERROR"/>
<logger name="org.hibernate.mapping" level="ERROR"/>
<logger name="org.hibernate.jpa.event" level="ERROR"/>
<logger name="org.hibernate.validator.internal" level="ERROR"/>
<logger name="org.hibernate.engine.internal" level="ERROR"/>
<logger name="org.hibernate.boot.model" level="ERROR"/>
<logger name="org.hibernate.boot.internal" level="ERROR"/>
<logger name="org.apache.tomcat.util" level="ERROR"/>
<logger name="org.springframework.orm" level="ERROR"/>
<logger name="org.springframework.jmx" level="ERROR"/>
<logger name="org.springframework.jndi" level="ERROR"/>
<logger name="org.springframework.aop" level="ERROR"/>
<logger name="org.springframework.web" level="ERROR"/>
<logger name="org.springframework.context" level="ERROR"/>
<logger name="org.springframework.core" level="ERROR"/>
<logger name="org.springframework.beans" level="ERROR"/>
<logger name="org.springframework.boot.web" level="ERROR"/>
<logger name="org.springframework.boot.actuate" level="ERROR"/>
<logger name="org.springframework.boot.context" level="ERROR"/>
<logger name="org.springframework.boot.autoconfigure.logging" level="ERROR"/>
<logger name="org.springframework.data.redis" level="ERROR"/>
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="ERROR"/>
<logger name="org.hibernate.engine.QueryParameters" level="ERROR"/>
<logger name="org.hibernate.SQL" level="ERROR" />
<root level="DEBUG">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLINGFILE"/>
</root>
</configuration>
\ No newline at end of file
......@@ -7,9 +7,9 @@
</contextListener>
<appender name="ROLLINGFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logging.dir}/${project.name}/${project.name}.log</file>
<file>/home/quant_group/logs/${project.name}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${logging.dir}/${project.name}/${project.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<fileNamePattern>/home/quant_group/logs/${project.name}.%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<maxHistory>90</maxHistory>
<maxFileSize>512MB</maxFileSize>
<totalSizeCap>10GB</totalSizeCap>
......@@ -67,7 +67,7 @@
<logger name="org.hibernate.engine.QueryParameters" level="ERROR"/>
<logger name="org.hibernate.SQL" level="ERROR" />
<root level="${logging.level}">
<root level="WARN">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLINGFILE"/>
</root>
......
/*
Navicat MySQL Data Transfer
Source Server : test1
Source Server Version : 50643
Source Host : 172.17.5.17:31548
Source Database : baa_pay_1.0
Target Server Type : MYSQL
Target Server Version : 50643
File Encoding : 65001
Date: 2021-09-24 20:16:46
*/
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for account
-- ----------------------------
DROP TABLE IF EXISTS `account`;
CREATE TABLE `account` (
`ACCOUNT_ID` bigint(19) NOT NULL COMMENT '账户ID',
`INSTITUTION_ID` char(4) NOT NULL COMMENT '机构ID',
`PRODUCT_ID` char(4) NOT NULL COMMENT '产品ID',
`PROTOCOL_RULE` char(4) DEFAULT NULL COMMENT '方案规则',
`ACCT_TYPE_ID` char(4) NOT NULL COMMENT '账户类型',
`CURRENT_CYCLE_NO` smallint(4) NOT NULL COMMENT '当前周期号',
`CURRENCY_CODE` char(3) NOT NULL COMMENT '币种',
`MANUAL_STATUS` char(4) DEFAULT NULL COMMENT '手动状态码',
`MANUAL_STATUS_DATE` int(8) DEFAULT NULL COMMENT '手动状态设置时间',
`AUTO_STATUS` char(4) NOT NULL COMMENT '自动状态码',
`AUTO_STATUS_DATE` int(8) NOT NULL COMMENT '自动状态设置时间',
`OPEN_DATE` int(8) NOT NULL COMMENT '开户日期',
`CORPOTATE_ACCT_FLAG` char(1) NOT NULL COMMENT '公司账户标志(Y/N)',
`ACCOUNT_REF_NO` char(32) NOT NULL COMMENT '账户参考号(无特殊使用ACCOUNT_ID)',
`EXTERNAL_ACCT_NO` varchar(32) DEFAULT NULL COMMENT '外部系统账户号',
`AUTO_PAYMENT_FLAG` char(1) NOT NULL COMMENT '自动还款标志(Y/N)',
`AUTO_PAYMENT_WARN_DATE` int(8) NOT NULL COMMENT '自动还款提示日期(19700101:默认)',
`TXN_NO` int(11) NOT NULL COMMENT '交易号',
`NEXT_TXN_NO` int(8) NOT NULL COMMENT '下一个交易号',
`TOTAL_CREDIT` decimal(17,2) NOT NULL COMMENT '贷记总计金额(0:默认)',
`TOTAL_DEBIT` decimal(17,2) NOT NULL COMMENT '借记总计金额(0:默认)',
`CREDIT_TXN_COUNT` int(9) NOT NULL COMMENT '贷记交易笔数(0:默认值)',
`DEBIT_TXT_COUNT` int(9) NOT NULL COMMENT '借记交易笔数(0:默认值)',
`DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述',
`CREATED_BY` varchar(72) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(72) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`ACCOUNT_ID`),
UNIQUE KEY `UK_IDS` (`INSTITUTION_ID`,`ACCOUNT_REF_NO`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='账户\r\n\r\nSTATEMENT_FREQ_NO:指定n个周期出账单。STATEMENT_FREQ为''NCYC'',该项必须有值,否则为0。\r\nLAST_DLQ_DAYS:不包括当期,从LAST_DLQ_DATE开始算起。\r\nFIXED_PAYMENT_AMOUNT:如果FIXED_PAYMENT_UNTIL_DATE 大于今天,Min Payment.MIN_PAY_CALC_METHOD为''FMIN'',使用FIXED_PAYMENT_AMOUNT代替最小还款金额。\r\nMULTIPLE_ACCOUNTS_FLG:如果Min Payment.MIN_PAY_CALC_METHOD为''%-HI'',取此值为余额计算基数。如果此值为''N''只同步当前账户最高余额。';
-- ----------------------------
-- Records of account
-- ----------------------------
INSERT INTO `account` VALUES ('75956717762838633', 'YXM', 'LDW', null, 'EMPS', '1', 'CNY', null, null, 'NORM', '20210923', '20210923', 'N', '777777', '777777', 'N', '19700101', '4', '5', '0.00', '0.00', '0', '0', null, 'SYS', '2021-09-23 10:32:15', 'SYS', '2021-09-23 11:55:02', '4', '105', null, null, null);
INSERT INTO `account` VALUES ('75958421027815495', 'YXM', 'LDW', null, 'EMPS', '1', 'CNY', null, null, 'NORM', '20210923', '20210923', 'N', '000008', '000008', 'N', '19700101', '10', '11', '0.00', '0.00', '0', '0', null, 'SYS', '2021-09-23 17:45:34', 'SYS', '2021-09-24 20:03:34', '10', '71', null, null, null);
-- ----------------------------
-- Table structure for batch_cycle_trigger
-- ----------------------------
DROP TABLE IF EXISTS `batch_cycle_trigger`;
CREATE TABLE `batch_cycle_trigger` (
`TRIGGER_ID` bigint(19) NOT NULL,
`TARGET_ID` bigint(19) NOT NULL,
`ENTITY_CODE` char(4) NOT NULL,
`ACCOUNT_ID` bigint(19) NOT NULL,
`PAY_DUE_TIME` bigint(14) NOT NULL,
`NOTIFY_URL` varchar(1000) NOT NULL,
`CHAN_NOTIFY_STATUS` char(4) NOT NULL,
`CHAN_NOTIFY_TIME` datetime DEFAULT NULL,
`MCH_NOTIFY_STATUS` char(4) NOT NULL,
`MCH_NOTIFY_TIME` datetime DEFAULT NULL,
`REQUEST_ID` char(64) DEFAULT NULL,
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`TRIGGER_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of batch_cycle_trigger
-- ----------------------------
INSERT INTO `batch_cycle_trigger` VALUES ('75752798662426628', '75752798661246978', 'PYMT', '75958421027815495', '20210924203333', 'http://127.0.0.1:8080/notifyUrl', 'PEND', null, 'PEND', null, '20210924722113463207861227310', '71', 'SYS', '2021-09-24 20:03:34', 'SYS', '2021-09-24 20:03:34', '1', null, null, null);
-- ----------------------------
-- Table structure for dictionary
-- ----------------------------
DROP TABLE IF EXISTS `dictionary`;
CREATE TABLE `dictionary` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT,
`TYPE` varchar(32) NOT NULL,
`CODE` varchar(32) NOT NULL,
`TEXT` varchar(64) NOT NULL,
`VALUE` varchar(500) NOT NULL,
`PARENT_ID` int(255) NOT NULL,
`IMAGE_URL` varchar(500) DEFAULT NULL,
`CREATED_BY` varchar(32) NOT NULL DEFAULT 'SYS' COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL DEFAULT 'SYS' COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of dictionary
-- ----------------------------
INSERT INTO `dictionary` VALUES ('1', 'PAY', 'ROOT', '支付通道商', '', '0', null, 'SYS', '2021-09-23 10:59:48', 'SYS', '2021-09-23 11:24:40', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('2', 'PAY', 'ALIP', '支付宝', '', '1', null, 'SYS', '2021-08-23 19:34:54', 'SYS', '2021-09-23 11:24:38', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('3', 'PAY', 'WXP', '微信', '', '1', null, 'SYS', '2021-08-23 19:33:58', 'SYS', '2021-09-23 11:24:35', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('4', 'WXP_STAT', 'ROOT', '状态码', 'ROOT', '0', null, 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-23 14:18:27', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('5', 'WXP_STAT', 'OUT_TRADE_NO_USED', '商户订单号重复', 'ORDER_NO_EXISTS', '4', null, 'SYS', '2021-09-23 14:06:13', 'SYS', '2021-09-23 14:15:35', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('6', 'WXP_STAT', 'APPID_MCHID_NOT_MATCH', '商户号与appid不匹配', 'APPID_MCHID_NOT_MATCH', '4', null, 'SYS', '2021-09-23 11:03:48', 'SYS', '2021-09-23 11:08:14', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('7', 'WXP_STAT', 'BANK_ERROR', '银行系统异常', 'BANK_ERROR', '4', null, 'SYS', '2021-09-23 11:06:49', 'SYS', '2021-09-23 14:10:15', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('8', 'WXP_STAT', 'REQUEST_BLOCKED', '请求受阻', 'REQUEST_BLOCKED', '4', null, 'SYS', '2021-09-23 11:06:49', 'SYS', '2021-09-23 14:05:51', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('9', 'WXP_STAT', 'BIZ_ERR_NEED_RETRY', '退款业务流程错误', 'REFUND_LOGIC_ERROR', '4', null, 'SYS', '2021-09-23 11:06:49', 'SYS', '2021-09-23 14:15:27', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('10', 'WXP_STAT', 'PARAM_ERROR', '参数错误', 'PARAM_ERROR', '4', '', 'SYS', '2021-09-23 11:06:49', 'SYS', '2021-09-23 14:05:51', '0', null, null, null);
INSERT INTO `dictionary` VALUES ('11', 'HTTP_STAT', 'ROOT', '状态码', '0', '0', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-23 14:18:23', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('12', 'HTTP_STAT', 'APPID_MCHID_NOT_MATCH', '商户号与appid不匹配', '500500101', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:28', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('13', 'HTTP_STAT', 'BANK_ERROR', '银行系统异常', '500500102', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:30', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('14', 'HTTP_STAT', 'REFUND_LOGIC_ERROR', '退款业务流程错误', '500500103', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:32', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('15', 'HTTP_STAT', 'ORDER_NO_EXISTS', '商户订单号重复', '500500104', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:34', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('16', 'HTTP_STAT', 'PARAM_ERROR', '参数错误', '500500105', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:35', '0', '', '', '');
INSERT INTO `dictionary` VALUES ('17', 'HTTP_STAT', 'REQUEST_BLOCKED', '请求受阻', '500500106', '11', '', 'SYS', '2021-09-23 10:58:49', 'SYS', '2021-09-24 14:29:40', '0', '', '', '');
-- ----------------------------
-- Table structure for mch_channel
-- ----------------------------
DROP TABLE IF EXISTS `mch_channel`;
CREATE TABLE `mch_channel` (
`ID` bigint(19) NOT NULL COMMENT '唯一标识',
`PAY_APP_ID` char(32) NOT NULL COMMENT '支付应用ID',
`PAY_CHAN_CODE` char(4) NOT NULL COMMENT '支付平台码',
`ACCESS_CODE` varchar(6) NOT NULL COMMENT '接入方法码',
`PAY_ACCT_ID` char(64) NOT NULL COMMENT '支付平台账户ID',
`DESC_TEXT` varchar(255) DEFAULT NULL COMMENT '描述',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `UK_IDS` (`PAY_APP_ID`,`PAY_CHAN_CODE`,`ACCESS_CODE`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商户通道';
-- ----------------------------
-- Records of mch_channel
-- ----------------------------
INSERT INTO `mch_channel` VALUES ('75772285618946308', 'wx75d5a207551d0b4d', 'WXP', 'APP', '1604055791', '小程序-狼大呜-APP', 'SYS', '2021-09-24 19:10:01', 'SYS', '2021-09-24 19:10:06', '0', null, null, null);
-- ----------------------------
-- Table structure for pay_account
-- ----------------------------
DROP TABLE IF EXISTS `pay_account`;
CREATE TABLE `pay_account` (
`PAY_CHAN_CODE` char(4) NOT NULL COMMENT '支付平台码',
`PAY_ACCT_ID` char(64) NOT NULL COMMENT '支付平台账户ID',
`PAY_CHAN_TYPE` char(4) NOT NULL COMMENT '支付平台类型',
`DOMAIN` varchar(255) NOT NULL COMMENT '支付平台域',
`NAME` varchar(255) NOT NULL COMMENT '账户名称',
`SECRET_KEY` char(64) NOT NULL COMMENT '加密秘钥',
`SECRET_TYPE` varchar(32) NOT NULL COMMENT '加密秘钥类型',
`SIGN_TYPE` varchar(32) NOT NULL,
`PRIVATE_KEY` varchar(2000) NOT NULL COMMENT '私钥',
`PAY_PUBLIC_KEY` varchar(2000) NOT NULL COMMENT '支付平台私钥',
`PAY_CERT_NO` char(65) DEFAULT NULL,
`PAY_CERT_KEY` text,
`PAY_ROOT_CERT_NO` char(65) DEFAULT NULL,
`PAY_ROOT_CERT_KEY` text,
`CREATED_BY` varchar(32) NOT NULL DEFAULT '' COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL DEFAULT '' COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`PAY_CHAN_CODE`,`PAY_ACCT_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付账户';
-- ----------------------------
-- Records of pay_account
-- ----------------------------
INSERT INTO `pay_account` VALUES ('ALIP', '2021002106644714', 'THRD', 'https://openapi.alipay.com', '支付宝', '2X0QoyhfCb1iqLQszkfHoQ==', 'AES/CBC/PKCS5Padding', 'SHA256WithRSA', 'MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC3rgHa/x67gaY08RJoeVWLghAiQooLG/dOojW+639RAuirhxLyeuawbcch291uj/90MPTQy86nNKKQBbet41MQtS8L6ts/5Bjp2GYgzsQlmPCRWE7Il94/6R18fg9ZZQ4rx280BrX60hKTFcM+rn6IuNAiT7wHMcsjonRLsbWW/ZaSmMwqJcfhRU2/8Slznw2AX8jHs3X/ZZtM8usm3Hd41U9m7DIRPgejo4wlgTmUrFJrgQIWdsuSCYm88a4BzFc3Wfa2No5stqkHZizsshx52UGOgvgJdxF6PUqC9af+qQSdldTcbOeQjgQbJOLfiZoPQzyO8DaszIzJkB8FB38DAgMBAAECggEBAIbZ7qzMjtCU3+SQdLZVFlQFGjk85sI/NvL5LkJL/T4Jx65eza9OQd2XyxH1rH1GpQK2CpbceozRnOPl/rNgaRSkILU8KNmgahYM9PXzN5huz3e2AKlOrjH3wNksZ7J2+c90bRUiNCrAXji0SpLTYzyXit8V8PLLQNuZoo4MG0iNCJy8riZwUn8ZQLJnCMv1VD0yUyGSr/6LAEJjJZTrrnpibw/99hqFO8Z6UvIs9JewfvjdzamT3UxF0gURSncieQwvsq3mYlq6ppcWqzBrEqJHZJOGzZrxtsOALmOFr7KCp6qRziareK/9vb9RLnZtBSrLZqhJF/MU1oFWpHixRoECgYEA3yKt0rT2v1rjaOlMQDF7pKKfnGmRHGps9214Smsj/wOwWdlwwixWZA2DUFLOUpPQRu3dPp3ZZQdcg21NejvEbtu4CcN0lrvnVlBIrExQmm9zqjDWijljtNvf+POqMkwyLumtNtdNxWLZxdiDClosShEX9kv4ttdlF5bEc2z3V8ECgYEA0rumR+zUnvT6OS6l6msUXgZ/f/XBgcW8BLdZV6pSJJVh3I9CVgc55MlTTGTd0yNfrDPVbwloDpjVVPSNI9YNL0h9i0vfMTHolWOR7RCcqBoquvt66NjtaV70PjBm1pxNVVDaUSgCva+oOFaRnoHjOSA+jyZkKRHjwnEWlcyRZ8MCgYBnZCtE6gM3cYbUEt35FLSk+ZGZqTTLBOlO0NOfL/vy6yOozl84KdEx9Sz2aBggHUuxwf/1RrD35ixQ3bG7xLvlXjvtkjqQqaqszPCPnaDvnlrq7kxKqgLwR72FHmqrebD7Gd3f/m2T25Tq3sMBZf0FqNwAjP1Gw5GdF4gZr9EAQQKBgQCQrWgxxTUMlOAd1hru3+kxzIBIl67sq5a0HjTmbPbMSwrO5EQE0B09J8NalX198bFDhqqn+utH6kG8e9FSoyiWJ8yZj9OB8OPffGa5PUhwWNaxXOo7ZoNIbnp9H7na6aBmTIY2ZaPMGwcA9t4u1rnrhGmu2gq176RQ4FdDLRk/BQKBgQDU+Oab3jL2MoDMtGk4ZGYQUcTMB/ILtG4O1bx8BhJZ/Rula3Rt7dYPrRng3uZ0sTVh7/QRSn02hLY72UoItge3POZMEbNQLb+gzhIuU4v4hLT3H6WK2MSaLftsb9mPyW9LX76xQS4ayf5xZqeKK2jOtIZCsiLmC/ALvIytcr2DHA==', '-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQICARFv38DKhJ31odYtzGpDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE\nBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0\naG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs\nYXNzIDIgUjEwHhcNMjAxMTE2MDcwMTMwWhcNMjIxMTE2MDcwMTMwWjCBjzELMAkGA1UEBhMCQ04x\nKjAoBgNVBAoMIeWMl+S6rOmHj+WMlua0vuenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UECwwGQWxp\ncGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWFrOWPuC0y\nMDg4OTMxOTU1NzA1MzIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm9LT+VzzI6Zy\nr7ePg67m+6AB593Mpz9Pu3mdaYqhyN1MsW5p9l7Fjj/PSKJrCW7FzclCdDMVJrIMdopUMrscaHY8\nddncLA3+E0r5XK5+2lBmb35SNNlsKfVgnt122AymK5mkdar7rqOtQ1QrXM8NtlcY3UdZTUaPWbz5\n0A/t2tlMoUSM9EANgqQbrT7wPIG+5bq6VWW2piVcyx+Qh0CLHLd9E3QSJKyYzYfJpLFjiQlSa8/S\naEHuBQTREyuO0/Kz/2Pxt5r7kkU80Yd0l4E1/oYPd3EhMbRpFNh79LxKjVtgxWq1hf2sdarvT9Ce\nOftxnDn3yXTFXa9CEQqtByoANQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZIhvcNAQEL\nBQADggEBAEiC3Dzm+oayzvSJoZZA3jrxdRJhJ6pQQ1vGcCe1mNfR7XKA0r4ht4J4weTryF9tmUVw\n6D+5UFdiA/2AfwOQ3rxmhc3TTN9xFDzm5koGfHFI9UV46PfBtugTUbgc+5HqsPPzcy6SvsQk3V17\n/3ua+c/wM4Db9S7JX0Ug2kfFYsGZ/IxRQYmTiHDcD4FYUKjAep0uPbVu0/Nc5gR2OKiGwwr8MvDQ\ndmozWdgJ42on5N7KkRNy0rRINQ9Z/QNMtQQ8GJB73rEbdty7q4psBsZ5Si2FuejNJSN4BuLybcM8\nIZRSYtUFCmzX9QoKfUMQO215f6bxMK9GZFu0TyWTxlXjvr0=\n-----END CERTIFICATE-----', '85ca16e8f3523e742f0f910f0d8444c4', '-----BEGIN CERTIFICATE-----\nMIIDrzCCApegAwIBAgIQICARFv38DKhJ31odYtzGpDANBgkqhkiG9w0BAQsFADCBgjELMAkGA1UE\nBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmljYXRpb24gQXV0\naG9yaXR5MTkwNwYDVQQDDDBBbnQgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IENs\nYXNzIDIgUjEwHhcNMjAxMTE2MDcwMTMwWhcNMjIxMTE2MDcwMTMwWjCBjzELMAkGA1UEBhMCQ04x\nKjAoBgNVBAoMIeWMl+S6rOmHj+WMlua0vuenkeaKgOaciemZkOWFrOWPuDEPMA0GA1UECwwGQWxp\ncGF5MUMwQQYDVQQDDDrmlK/ku5jlrp0o5Lit5Zu9Kee9kee7nOaKgOacr+aciemZkOWFrOWPuC0y\nMDg4OTMxOTU1NzA1MzIzMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAm9LT+VzzI6Zy\nr7ePg67m+6AB593Mpz9Pu3mdaYqhyN1MsW5p9l7Fjj/PSKJrCW7FzclCdDMVJrIMdopUMrscaHY8\nddncLA3+E0r5XK5+2lBmb35SNNlsKfVgnt122AymK5mkdar7rqOtQ1QrXM8NtlcY3UdZTUaPWbz5\n0A/t2tlMoUSM9EANgqQbrT7wPIG+5bq6VWW2piVcyx+Qh0CLHLd9E3QSJKyYzYfJpLFjiQlSa8/S\naEHuBQTREyuO0/Kz/2Pxt5r7kkU80Yd0l4E1/oYPd3EhMbRpFNh79LxKjVtgxWq1hf2sdarvT9Ce\nOftxnDn3yXTFXa9CEQqtByoANQIDAQABoxIwEDAOBgNVHQ8BAf8EBAMCA/gwDQYJKoZIhvcNAQEL\nBQADggEBAEiC3Dzm+oayzvSJoZZA3jrxdRJhJ6pQQ1vGcCe1mNfR7XKA0r4ht4J4weTryF9tmUVw\n6D+5UFdiA/2AfwOQ3rxmhc3TTN9xFDzm5koGfHFI9UV46PfBtugTUbgc+5HqsPPzcy6SvsQk3V17\n/3ua+c/wM4Db9S7JX0Ug2kfFYsGZ/IxRQYmTiHDcD4FYUKjAep0uPbVu0/Nc5gR2OKiGwwr8MvDQ\ndmozWdgJ42on5N7KkRNy0rRINQ9Z/QNMtQQ8GJB73rEbdty7q4psBsZ5Si2FuejNJSN4BuLybcM8\nIZRSYtUFCmzX9QoKfUMQO215f6bxMK9GZFu0TyWTxlXjvr0=\n-----END CERTIFICATE-----', '687b59193f3f462dd5336e5abf83c5d8_02941eef3187dddf3d3b83462e1dfcf6', '-----BEGIN CERTIFICATE-----\nMIIBszCCAVegAwIBAgIIaeL+wBcKxnswDAYIKoEcz1UBg3UFADAuMQswCQYDVQQG\nEwJDTjEOMAwGA1UECgwFTlJDQUMxDzANBgNVBAMMBlJPT1RDQTAeFw0xMjA3MTQw\nMzExNTlaFw00MjA3MDcwMzExNTlaMC4xCzAJBgNVBAYTAkNOMQ4wDAYDVQQKDAVO\nUkNBQzEPMA0GA1UEAwwGUk9PVENBMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAE\nMPCca6pmgcchsTf2UnBeL9rtp4nw+itk1Kzrmbnqo05lUwkwlWK+4OIrtFdAqnRT\nV7Q9v1htkv42TsIutzd126NdMFswHwYDVR0jBBgwFoAUTDKxl9kzG8SmBcHG5Yti\nW/CXdlgwDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAQYwHQYDVR0OBBYEFEwysZfZ\nMxvEpgXBxuWLYlvwl3ZYMAwGCCqBHM9VAYN1BQADSAAwRQIgG1bSLeOXp3oB8H7b\n53W+CKOPl2PknmWEq/lMhtn25HkCIQDaHDgWxWFtnCrBjH16/W3Ezn7/U/Vjo5xI\npDoiVhsLwg==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIF0zCCA7ugAwIBAgIIH8+hjWpIDREwDQYJKoZIhvcNAQELBQAwejELMAkGA1UE\nBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNVBAsMF0NlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5jaWFsIENlcnRpZmlj\nYXRpb24gQXV0aG9yaXR5IFIxMB4XDTE4MDMyMTEzNDg0MFoXDTM4MDIyODEzNDg0\nMFowejELMAkGA1UEBhMCQ04xFjAUBgNVBAoMDUFudCBGaW5hbmNpYWwxIDAeBgNV\nBAsMF0NlcnRpZmljYXRpb24gQXV0aG9yaXR5MTEwLwYDVQQDDChBbnQgRmluYW5j\naWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFIxMIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEAtytTRcBNuur5h8xuxnlKJetT65cHGemGi8oD+beHFPTk\nrUTlFt9Xn7fAVGo6QSsPb9uGLpUFGEdGmbsQ2q9cV4P89qkH04VzIPwT7AywJdt2\nxAvMs+MgHFJzOYfL1QkdOOVO7NwKxH8IvlQgFabWomWk2Ei9WfUyxFjVO1LVh0Bp\ndRBeWLMkdudx0tl3+21t1apnReFNQ5nfX29xeSxIhesaMHDZFViO/DXDNW2BcTs6\nvSWKyJ4YIIIzStumD8K1xMsoaZBMDxg4itjWFaKRgNuPiIn4kjDY3kC66Sl/6yTl\nYUz8AybbEsICZzssdZh7jcNb1VRfk79lgAprm/Ktl+mgrU1gaMGP1OE25JCbqli1\nPbw/BpPynyP9+XulE+2mxFwTYhKAwpDIDKuYsFUXuo8t261pCovI1CXFzAQM2w7H\nDtA2nOXSW6q0jGDJ5+WauH+K8ZSvA6x4sFo4u0KNCx0ROTBpLif6GTngqo3sj+98\nSZiMNLFMQoQkjkdN5Q5g9N6CFZPVZ6QpO0JcIc7S1le/g9z5iBKnifrKxy0TQjtG\nPsDwc8ubPnRm/F82RReCoyNyx63indpgFfhN7+KxUIQ9cOwwTvemmor0A+ZQamRe\n9LMuiEfEaWUDK+6O0Gl8lO571uI5onYdN1VIgOmwFbe+D8TcuzVjIZ/zvHrAGUcC\nAwEAAaNdMFswCwYDVR0PBAQDAgEGMAwGA1UdEwQFMAMBAf8wHQYDVR0OBBYEFF90\ntATATwda6uWx2yKjh0GynOEBMB8GA1UdIwQYMBaAFF90tATATwda6uWx2yKjh0Gy\nnOEBMA0GCSqGSIb3DQEBCwUAA4ICAQCVYaOtqOLIpsrEikE5lb+UARNSFJg6tpkf\ntJ2U8QF/DejemEHx5IClQu6ajxjtu0Aie4/3UnIXop8nH/Q57l+Wyt9T7N2WPiNq\nJSlYKYbJpPF8LXbuKYG3BTFTdOVFIeRe2NUyYh/xs6bXGr4WKTXb3qBmzR02FSy3\nIODQw5Q6zpXj8prYqFHYsOvGCEc1CwJaSaYwRhTkFedJUxiyhyB5GQwoFfExCVHW\n05ZFCAVYFldCJvUzfzrWubN6wX0DD2dwultgmldOn/W/n8at52mpPNvIdbZb2F41\nT0YZeoWnCJrYXjq/32oc1cmifIHqySnyMnavi75DxPCdZsCOpSAT4j4lAQRGsfgI\nkkLPGQieMfNNkMCKh7qjwdXAVtdqhf0RVtFILH3OyEodlk1HYXqX5iE5wlaKzDop\nPKwf2Q3BErq1xChYGGVS+dEvyXc/2nIBlt7uLWKp4XFjqekKbaGaLJdjYP5b2s7N\n1dM0MXQ/f8XoXKBkJNzEiM3hfsU6DOREgMc1DIsFKxfuMwX3EkVQM1If8ghb6x5Y\njXayv+NLbidOSzk4vl5QwngO/JYFMkoc6i9LNwEaEtR9PhnrdubxmrtM+RjfBm02\n77q3dSWFESFQ4QxYWew4pHE0DpWbWy/iMIKQ6UZ5RLvB8GEcgt8ON7BBJeMc+Dyi\nkT9qhqn+lw==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIICiDCCAgygAwIBAgIIQX76UsB/30owDAYIKoZIzj0EAwMFADB6MQswCQYDVQQG\nEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UECwwXQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNpYWwgQ2VydGlmaWNh\ndGlvbiBBdXRob3JpdHkgRTEwHhcNMTkwNDI4MTYyMDQ0WhcNNDkwNDIwMTYyMDQ0\nWjB6MQswCQYDVQQGEwJDTjEWMBQGA1UECgwNQW50IEZpbmFuY2lhbDEgMB4GA1UE\nCwwXQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxMTAvBgNVBAMMKEFudCBGaW5hbmNp\nYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgRTEwdjAQBgcqhkjOPQIBBgUrgQQA\nIgNiAASCCRa94QI0vR5Up9Yr9HEupz6hSoyjySYqo7v837KnmjveUIUNiuC9pWAU\nWP3jwLX3HkzeiNdeg22a0IZPoSUCpasufiLAnfXh6NInLiWBrjLJXDSGaY7vaokt\nrpZvAdmjXTBbMAsGA1UdDwQEAwIBBjAMBgNVHRMEBTADAQH/MB0GA1UdDgQWBBRZ\n4ZTgDpksHL2qcpkFkxD2zVd16TAfBgNVHSMEGDAWgBRZ4ZTgDpksHL2qcpkFkxD2\nzVd16TAMBggqhkjOPQQDAwUAA2gAMGUCMQD4IoqT2hTUn0jt7oXLdMJ8q4vLp6sg\nwHfPiOr9gxreb+e6Oidwd2LDnC4OUqCWiF8CMAzwKs4SnDJYcMLf2vpkbuVE4dTH\nRglz+HGcTLWsFs4KxLsq7MuU+vJTBUeDJeDjdA==\n-----END CERTIFICATE-----\n\n-----BEGIN CERTIFICATE-----\nMIIDxTCCAq2gAwIBAgIUEMdk6dVgOEIS2cCP0Q43P90Ps5YwDQYJKoZIhvcNAQEF\nBQAwajELMAkGA1UEBhMCQ04xEzARBgNVBAoMCmlUcnVzQ2hpbmExHDAaBgNVBAsM\nE0NoaW5hIFRydXN0IE5ldHdvcmsxKDAmBgNVBAMMH2lUcnVzQ2hpbmEgQ2xhc3Mg\nMiBSb290IENBIC0gRzMwHhcNMTMwNDE4MDkzNjU2WhcNMzMwNDE4MDkzNjU2WjBq\nMQswCQYDVQQGEwJDTjETMBEGA1UECgwKaVRydXNDaGluYTEcMBoGA1UECwwTQ2hp\nbmEgVHJ1c3QgTmV0d29yazEoMCYGA1UEAwwfaVRydXNDaGluYSBDbGFzcyAyIFJv\nb3QgQ0EgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAOPPShpV\nnJbMqqCw6Bz1kehnoPst9pkr0V9idOwU2oyS47/HjJXk9Rd5a9xfwkPO88trUpz5\n4GmmwspDXjVFu9L0eFaRuH3KMha1Ak01citbF7cQLJlS7XI+tpkTGHEY5pt3EsQg\nwykfZl/A1jrnSkspMS997r2Gim54cwz+mTMgDRhZsKK/lbOeBPpWtcFizjXYCqhw\nWktvQfZBYi6o4sHCshnOswi4yV1p+LuFcQ2ciYdWvULh1eZhLxHbGXyznYHi0dGN\nz+I9H8aXxqAQfHVhbdHNzi77hCxFjOy+hHrGsyzjrd2swVQ2iUWP8BfEQqGLqM1g\nKgWKYfcTGdbPB1MCAwEAAaNjMGEwHQYDVR0OBBYEFG/oAMxTVe7y0+408CTAK8hA\nuTyRMB8GA1UdIwQYMBaAFG/oAMxTVe7y0+408CTAK8hAuTyRMA8GA1UdEwEB/wQF\nMAMBAf8wDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQBLnUTfW7hp\nemMbuUGCk7RBswzOT83bDM6824EkUnf+X0iKS95SUNGeeSWK2o/3ALJo5hi7GZr3\nU8eLaWAcYizfO99UXMRBPw5PRR+gXGEronGUugLpxsjuynoLQu8GQAeysSXKbN1I\nUugDo9u8igJORYA+5ms0s5sCUySqbQ2R5z/GoceyI9LdxIVa1RjVX8pYOj8JFwtn\nDJN3ftSFvNMYwRuILKuqUYSHc2GPYiHVflDh5nDymCMOQFcFG3WsEuB+EYQPFgIU\n1DHmdZcz7Llx8UOZXX2JupWCYzK1XhJb+r4hK5ncf/w8qGtYlmyJpxk3hr1TfUJX\nYf4Zr0fJsGuv\n-----END CERTIFICATE-----', 'SYS', '2021-08-21 21:15:02', 'SYS', '2021-09-08 14:31:30', '0', null, null, null);
INSERT INTO `pay_account` VALUES ('WXP', '1604055791', 'THRD', 'https://api.mch.weixin.qq.com', '微信', '77f7565be7d8992ab882d4dc31271c72', 'AES/GCM/NoPadding', 'SHA256WithRSA', '-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDEPyU3bE+upacg\nFqhLCCFVFxP4mWgr5TtTVFw9/JaGIptgwnf4bKurZM9EQrioRyHQrbrN3boSJChj\nogQ4ii1//cElpSn/KwLFPWzgtSdRP3KNrsBJ+//UJ98EB/ybA0ugV/7Biviv5zIF\n7SwGTi9tVlI4pgsRBdPJD6MFIrmPga4PuuvJI4ex2TBfELVvw5OQo0EQnxajopzE\n/cJMIiuuzEM3moaTquNJzkBp/XigHMm62o6m3zjtK7x5pnSw/8VO6i4KrHwBcXAb\nSg43+Bg3IQQdzbMflbO2jXQ1nHt7f0cGOIZQ93N4EP8CrLOEwFcS6Ku0vorWVIIT\npp2MOk3BAgMBAAECggEAbDH0Ls5EUCF8NrDHMDbXSbZjiFfrmufTAWotQO+VfXZu\n+7W7tvcS3nfB3fx7Giu9dPOTXhS0lXPh4Kxeb12fIEWiy0J4GPp5mIz5DhpSBvVY\nDs0drqyEq08gIXTVzBDRDSH2jnY0DacFaUcNUpyggUNqKVlCGKyBywQX+KjgbUE1\n7wPts8D6vlRngrg9IyJ6u+qEto7Yam9Ci5+GYUsgckUVw8DB4qIdolMgmBeFx+Su\ngm1A14dgoI8HWqGSo0Wx+L6HWGzg5NfQslQO09TkKPKaJQ65kPtu5juKhl+wLqaz\nJN3rOZSnXOSDehj529xJiB6tZ60dqcZ/5d4Pisa90QKBgQDyf5LFocoom9kMy3sb\nkH5HazNHL6CIBxGPDXgIoKLUbxfESS4gHrIa3lvJDwxKvcvtHek2Zgkp/RGRWEJb\ndomrmm1ojtzdk2NGoLo1kD3P+zLxv8ecPcTJWbu1+t4qDbm9guTwx3m+8LMrBGpM\nrocL2nAeT6wmo4T8ddpBGKcOgwKBgQDPLFQLHnzki9/1nUdTVkZ5eV+IvGGr0lS1\nq7fRL88FpYWQTFN6L63ggYwfQASNBv/Y9qRnx0D1LUN2FFHIFVx4xS0piHpGtCou\nDgMn3iS6sD+OpJXmI3IWwqhqz0nvCtB+AoLiQiimCSrBfyYeQDPB76mgl8/WnfcL\njReCnsc/awKBgQCI7q7jeIOeQLrktbYzj3kvPQJ8rRE6Hru0iseAH60yxfSmuygX\nrR2nfG5Z72xifCA+Kgi51g5Qrn2QFEWMPjhpNU+Ynitr10FU7YeYnXW6Dr/qsP+3\nY03O4SPVE+8F0jBTKim7KPi/cE3L+bdIy7ioYdWz2At+2hFLOgVfgts6nwKBgAtJ\n3A57C80cPgjRGBjXY6Gs1mLJ+Px2ynzXrX1tgHdLTJrPPeEzheLszCjLwTO6BOja\nj5zEA6sYW0us0cP4PgCqpcpUkG0X1hCKXOuoNBIkFmJ8X1qZ5daNpsWjI+Etkqy7\nEEyp1DMv3q+KcRZG40sW9wQ0IXQNSW/MsVJBupOfAoGAH7w5K0syqmSkeICJjnVV\ndX7r2O4ubpcGBnwCpEDA+qAgBXyGIjbuViiJvFJ5VbchJHWf7snCiwSa18iY9Y9C\n7vj/rOK79HJzdN2zqLSknIu61gkxiCFJw94MwushKpqE86IK7DgvO8LDMXQTN1pA\nRtYI48ZY49OjmmAXClLzUAg=\n-----END PRIVATE KEY-----', '-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxD8lN2xPrqWnIBaoSwgh\nVRcT+JloK+U7U1RcPfyWhiKbYMJ3+Gyrq2TPREK4qEch0K26zd26EiQoY6IEOIot\nf/3BJaUp/ysCxT1s4LUnUT9yja7ASfv/1CffBAf8mwNLoFf+wYr4r+cyBe0sBk4v\nbVZSOKYLEQXTyQ+jBSK5j4GuD7rrySOHsdkwXxC1b8OTkKNBEJ8Wo6KcxP3CTCIr\nrsxDN5qGk6rjSc5Aaf14oBzJutqOpt847Su8eaZ0sP/FTuouCqx8AXFwG0oON/gY\nNyEEHc2zH5Wzto10NZx7e39HBjiGUPdzeBD/AqyzhMBXEuirtL6K1lSCE6adjDpN\nwQIDAQAB\n-----END PUBLIC KEY-----', '3CC988718902E1499FF060DE7E56F2380B933047', '-----BEGIN CERTIFICATE-----\nMIID3DCCAsSgAwIBAgIUKn3YUdDrNwyEHWXptd6VyQ6/rScwDQYJKoZIhvcNAQEL\nBQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT\nFFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg\nQ0EwHhcNMjAxMTExMDcwODU0WhcNMjUxMTEwMDcwODU0WjBuMRgwFgYDVQQDDA9U\nZW5wYXkuY29tIHNpZ24xEzARBgNVBAoMClRlbnBheS5jb20xHTAbBgNVBAsMFFRl\nbnBheS5jb20gQ0EgQ2VudGVyMQswCQYDVQQGDAJDTjERMA8GA1UEBwwIU2hlblpo\nZW4wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCdOrhA1eh7/GnfWmML\n1/ubOZQI9lVlCR2uAMu2yA2T6DY7fSc7TY7KCIFYQrv7puHIdePzBGNjIUe/ntTb\nMNN1Kbpno2hFr/2H40bOFGjmUyjPPUwuATh1yB+PQDsUt16fYS7nhETgPZwu4DOg\nwV9LzhonVsxxxd0Olx8LsmYDKUj1NZKm/4ufCnh1UaxSFtJpdYuGFnV1fUg3Brht\nWlbx9KlxnUrQ2HXs5D77x8c0rGtbMiKMySr/OMBypNKNFZgMQV7I43/ZjQDdNo/3\nntkml4z4+8ZBtYrdLyvUNI52TV1ggB5eijHd52NwsC5HhmiUj5WcHthy8rpGVdL5\n3tQbAgMBAAGjgYEwfzAJBgNVHRMEAjAAMAsGA1UdDwQEAwIE8DBlBgNVHR8EXjBc\nMFqgWKBWhlRodHRwOi8vZXZjYS5pdHJ1cy5jb20uY24vcHVibGljL2l0cnVzY3Js\nP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3NTQ5ODQ2QzAxQzNFOEVCRDIwDQYJ\nKoZIhvcNAQELBQADggEBAJbc/VUXit+/UZ9Tw1LOQtxSK4IT/Zf1dMvEYcGORmdu\n1pmLmwbgWhMQKrlVJGX/DXtbJFtGqTr6Dedfk3Scplt2SNGVBTXFEafCqhGLdiKq\nTHvTEGNf/iKEevCK3cyOm2dgSDbSAtJsNR81XsCV/lezigpa6ZyODW8k2B3uO12F\nu0OT5NH+g0Uo+Cejwuz5sePEBXVpIZbHdllPrX+hb5mwNflQjP4zeHp+T3D9C4qq\n2MoYNAhKreo68DV+P/TDfBZu7qy2oSr7E/hy7df71FVp/66w0b+Q6EJmODnjK6iW\nh/9FxORZwq0dHWN5bmUq1Jw/7EY+XJsc6xU4PvrIpjE=\n-----END CERTIFICATE-----', null, null, 'SYS', '2021-08-21 21:15:02', 'SYS', '2021-09-02 10:08:26', '0', null, null, null);
-- ----------------------------
-- Table structure for pay_app
-- ----------------------------
DROP TABLE IF EXISTS `pay_app`;
CREATE TABLE `pay_app` (
`PAY_APP_ID` char(32) NOT NULL COMMENT '支付应用ID',
`INSTITUTION_ID` char(4) NOT NULL COMMENT '机构ID',
`PRODUCT_ID` char(4) NOT NULL COMMENT '产品ID',
`PAY_APP_NAME` varchar(255) NOT NULL COMMENT '支付应用名称',
`SECURITY_KEY` varchar(64) NOT NULL COMMENT '安全秘钥',
`START_DATE` int(8) NOT NULL COMMENT '有效起始日',
`END_DATE` int(8) NOT NULL COMMENT '有效结束日',
`ACTIVATED_FLAG` char(1) NOT NULL,
`CREATED_BY` varchar(32) NOT NULL DEFAULT '' COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL DEFAULT '' COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`PAY_APP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付应用';
-- ----------------------------
-- Records of pay_app
-- ----------------------------
INSERT INTO `pay_app` VALUES ('wx2f44c7fe7b08458d', 'YXM', 'LDW', '小程序-狼大呜-H5', 'wx2f44c7fe7b08458d', '20210101', '20990101', 'Y', 'SYS', '2021-08-21 21:16:12', 'SYS', '2021-08-28 16:56:00', '0', null, null, null);
INSERT INTO `pay_app` VALUES ('wx75d5a207551d0b4d', 'YXM', 'LDW', '小程序-狼大呜-APP', 'wx75d5a207551d0b4d', '20210101', '20990101', 'Y', 'SYS', '2021-08-21 21:16:12', 'SYS', '2021-08-24 15:29:33', '0', null, null, null);
INSERT INTO `pay_app` VALUES ('wxd678efh567hg6787', 'YXM', 'LDW', '小程序-狼大呜', 'wqdv33g43fdfvwef2', '20210101', '20990101', 'Y', 'SYS', '2021-08-21 21:16:12', 'SYS', '2021-08-24 15:29:33', '0', null, null, null);
-- ----------------------------
-- Table structure for pay_feature
-- ----------------------------
DROP TABLE IF EXISTS `pay_feature`;
CREATE TABLE `pay_feature` (
`PAY_CHAN_CODE` char(4) NOT NULL COMMENT '支付渠道码',
`ACCESS_CODE` varchar(6) NOT NULL COMMENT '接入方法码(JS:小程序和网页; H5:h5页; APP:应用;)',
`ACCESS_TYPE` char(3) NOT NULL COMMENT '接入类型(API:接口; SDK:工具库;)',
`ACCESS_METHOD` varchar(255) DEFAULT NULL,
`PRODUCT_CODE` varchar(255) DEFAULT NULL,
`PAY_ACCESS` varchar(255) NOT NULL COMMENT '接入路径',
`REFUND_ACCESS` varchar(255) NOT NULL,
`CHECK_ACCESS` varchar(255) NOT NULL,
`VERSION` char(4) NOT NULL COMMENT '接入版本号',
`DESC_TEXT` varchar(255) DEFAULT NULL COMMENT '描述',
`CREATED_BY` varchar(32) NOT NULL DEFAULT 'SYS' COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL DEFAULT 'SYS' COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`PAY_CHAN_CODE`,`ACCESS_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='支付特征';
-- ----------------------------
-- Records of pay_feature
-- ----------------------------
INSERT INTO `pay_feature` VALUES ('ALIP', 'APP', 'API', 'alipay.trade.app.pay', 'QUICK_MSECURITY_PAY', '/gateway.do', '', '', '1.0', 'APP支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'CHKPAY', 'API', 'alipay.trade.query', null, '/gateway.do', '', '', '1.0', '查询订单', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'CHKRFD', 'API', 'alipay.trade.fastpay.refund.query', null, '/gateway.do', '', '', '1.0', '退款查询', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'CLOSE', 'API', 'alipay.trade.close', null, '/gateway.do', '', '', '1.0', '关闭订单', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'H5', 'API', 'alipay.trade.wap.pay', 'QUICK_WAP_PAY', '/gateway.do', '', '', '1.0', '手机网站支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'REFUND', 'API', 'alipay.trade.refund', null, '/gateway.do', '', '', '1.0', '退款', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('ALIP', 'WEB', 'API', 'alipay.trade.page.pay', 'FAST_INSTANT_TRADE_PAY', '/gateway.do', '', '', '1.0', '电脑网站支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'APP', 'API', 'POST', null, '/v3/pay/transactions/app', '', '', 'V3', '应用支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:39:40', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'CHKPAY', 'API', 'GET', null, '/v3/pay/transactions/out-trade-no/{out_trade_no}', '', '', 'V3', '查询订单', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:40:06', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'CHKRFD', 'API', 'GET', null, '/v3/refund/domestic/refunds/{out_refund_no}', '', '', 'V3', '退款查询', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-23 17:53:25', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'CLOSE', 'API', 'POST', null, '/v3/pay/transactions/out-trade-no/{out_trade_no}/close', '', '', 'V3', '关闭订单', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:40:29', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'H5', 'API', 'POST', null, '/v3/pay/transactions/h5', '', '', 'V3', 'H5页支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:39:48', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'JS', 'API', 'POST', null, '/v3/pay/transactions/jsapi', '', '', 'V3', '网页、小程序支付', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:39:51', '0', null, null, null);
INSERT INTO `pay_feature` VALUES ('WXP', 'REFUND', 'API', 'POST', null, '/v3/refund/domestic/refunds', '', '', 'V3', '退款', 'SYS', '2021-08-21 21:18:01', 'SYS', '2021-09-08 10:39:53', '0', null, null, null);
-- ----------------------------
-- Table structure for pay_goods_detail
-- ----------------------------
DROP TABLE IF EXISTS `pay_goods_detail`;
CREATE TABLE `pay_goods_detail` (
`GOODS_ID` bigint(19) NOT NULL,
`TRANSACTION_ID` bigint(19) NOT NULL,
`GOODS_ORDER_NO` varchar(64) NOT NULL,
`GOODS_NAME` varchar(512) NOT NULL,
`QUANTITY` smallint(255) NOT NULL,
`PRICE` decimal(19,2) NOT NULL,
`DISC_AMOUNT` decimal(19,2) NOT NULL,
`TXN_AMOUNT` decimal(19,2) NOT NULL,
`ATTACH_TEXT` varchar(512) DEFAULT NULL,
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`GOODS_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of pay_goods_detail
-- ----------------------------
INSERT INTO `pay_goods_detail` VALUES ('75752798662295555', '75752798661246978', '111111', '商品12', '1', '10.00', '2.50', '17.50', '---', '71', 'SYS', '2021-09-24 20:03:34', 'SYS', '2021-09-24 20:03:34', '1', null, null, null);
-- ----------------------------
-- Table structure for pay_history
-- ----------------------------
DROP TABLE IF EXISTS `pay_history`;
CREATE TABLE `pay_history` (
`TRANSACTION_ID` bigint(19) NOT NULL,
`INSTITUTION_ID` char(4) NOT NULL,
`PRODUCT_ID` char(4) NOT NULL,
`EXTERNAL_ORDER_NO` char(64) NOT NULL,
`ACCOUNT_ID` bigint(19) NOT NULL,
`CHANNEL_ID` bigint(19) NOT NULL,
`SUBJECT` varchar(128) NOT NULL,
`STATUS_CODE` char(4) NOT NULL COMMENT '状态码',
`CURRENCY_CODE` char(3) NOT NULL,
`PAY_METHOD` char(4) NOT NULL COMMENT '支付方式(AUTO:自动/DRST:主动/MANU:手动)',
`TXN_TYPE` char(4) NOT NULL,
`TXN_CODE` char(4) NOT NULL,
`TXN_NO` int(11) NOT NULL,
`STATISTICS_CODE` char(4) NOT NULL,
`CREDIT_DEBIT_FLAG` char(1) NOT NULL,
`CUSTOMER_GEN_FLAG` char(1) NOT NULL,
`ORIGINAL_TXN_AMOUNT` decimal(17,2) NOT NULL,
`TXN_AMOUNT` decimal(17,2) NOT NULL,
`DISC_AMOUNT` decimal(17,2) NOT NULL,
`GEN_FEE_AMOUNT` decimal(17,2) NOT NULL,
`POST_CASH_AMOUNT` decimal(17,2) NOT NULL,
`POST_CREDIT_AMOUNT` decimal(17,2) NOT NULL,
`STATEMENTE_FLAG` char(1) NOT NULL,
`TXN_DATE` int(8) NOT NULL,
`TXN_TIME` int(6) NOT NULL,
`PAY_DUE_TIME` bigint(14) NOT NULL,
`REQUEST_ID` char(64) NOT NULL,
`REQUEST_TIME` timestamp NOT NULL,
`SHOP_NAME` varchar(255) DEFAULT NULL,
`MOBILE_PHONE` char(13) DEFAULT NULL,
`GOODS_SIGNER` varchar(60) DEFAULT NULL,
`ADDRESS` varchar(500) DEFAULT NULL,
`ATTACH_TEXT` varchar(512) DEFAULT NULL,
`DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述',
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`CREATED_BY` varchar(32) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(32) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`TRANSACTION_ID`),
UNIQUE KEY `UK_EXT_IDS` (`INSTITUTION_ID`,`PRODUCT_ID`,`EXTERNAL_ORDER_NO`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of pay_history
-- ----------------------------
INSERT INTO `pay_history` VALUES ('75752798661246978', 'YXM', 'LDW', '1111111111111111111111111', '75958421027815495', '75772285618946308', '测试订单1', 'PEND', 'CNY', 'DRST', 'PYMT', 'R001', '10', 'PYMT', 'C', 'Y', '110.00', '100.00', '10.00', '0.00', '100.00', '0.00', '1', '20210924', '200331', '20210924203332', '08F2FCB68A0610A4071899DBEEA30620FD1828B19602-0', '2021-09-24 20:03:32', '测试店铺', '13718656985', '测试员', '测试收货地址', 'AAAA-BBBB-1111-2222', 'wx242002589937965a1a667c37b8fbde0000', '71', 'SYS', '2021-09-24 20:03:34', 'SYS', '2021-09-24 20:03:34', '1', null, null, null);
-- ----------------------------
-- Table structure for status_code
-- ----------------------------
DROP TABLE IF EXISTS `status_code`;
CREATE TABLE `status_code` (
`INSTITUTION_ID` char(4) NOT NULL COMMENT '机构ID',
`ENTITY` char(4) NOT NULL COMMENT '实体码(ACCT:账户)',
`CODE` char(4) NOT NULL COMMENT '状态码',
`PRIORITY` smallint(4) NOT NULL COMMENT '优先值(0:最低)',
`CODE_TYPE` char(4) NOT NULL COMMENT '状态类型(AUTO:自动/MANU:手动)',
`POSTING_CODE` char(4) NOT NULL COMMENT '交易入账码(NORM:所有交易不能入账/ASUS:所有交易都可入账/DSUS:只有借记和非现金交易能入账)',
`SEND_NOTICE_FLAG` char(1) NOT NULL COMMENT '发送给催收标记(Y/N)',
`REGR_CODE` char(4) DEFAULT NULL COMMENT '回归码',
`FAILED_CODE` char(4) NOT NULL,
`NEXT_CODE` char(4) DEFAULT NULL COMMENT '下一个码值',
`MESSAGE_CODE` char(4) DEFAULT NULL COMMENT '给用户的消息码',
`DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述',
`CREATED_BY` varchar(72) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(72) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`INSTITUTION_ID`,`ENTITY`,`CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of status_code
-- ----------------------------
INSERT INTO `status_code` VALUES ('YXM', 'PYMT', 'CLOS', '3', 'AUTO', 'NORM', 'Y', null, 'FAIL', null, null, '交易关闭', 'SYS', '2021-09-13 18:27:19', 'SYS', '2021-09-13 18:27:19', '0', null, null, null);
INSERT INTO `status_code` VALUES ('YXM', 'PYMT', 'FAIL', '4', 'AUTO', 'NORM', 'Y', null, 'FAIL', null, null, '交易失败', 'SYS', '2021-09-13 18:27:19', 'SYS', '2021-09-13 18:27:19', '0', null, null, null);
INSERT INTO `status_code` VALUES ('YXM', 'PYMT', 'PEND', '1', 'AUTO', 'NORM', 'N', null, 'FAIL', 'SUCC', null, '等待中', 'SYS', '2021-09-13 18:27:19', 'SYS', '2021-09-13 18:27:19', '0', null, null, null);
INSERT INTO `status_code` VALUES ('YXM', 'PYMT', 'SUCC', '2', 'AUTO', 'NORM', 'Y', null, 'FAIL', null, null, '交易成功', 'SYS', '2021-09-13 18:27:19', 'SYS', '2021-09-13 18:27:19', '0', null, null, null);
-- ----------------------------
-- Table structure for transaction_summary
-- ----------------------------
DROP TABLE IF EXISTS `transaction_summary`;
CREATE TABLE `transaction_summary` (
`TXN_ID` bigint(19) NOT NULL COMMENT '交易ID',
`ACCOUNT_ID` bigint(19) NOT NULL COMMENT '账户ID',
`SUMMARY_NO` int(8) NOT NULL COMMENT '交易序号(0:默认值)',
`INSTITUTION_ID` char(4) NOT NULL COMMENT '机构ID',
`PRODUCT_ID` char(4) NOT NULL COMMENT '产品ID',
`TXN_CODE` char(4) NOT NULL COMMENT '交易码',
`TXN_TYPE_CODE` char(4) NOT NULL COMMENT '交易类型码',
`STATISTICS_CODE` char(4) NOT NULL COMMENT '统计码',
`GEN_SUMMARY_NO` int(8) NOT NULL COMMENT '产生交易的源交易号(0:默认值)',
`TXN_UUID` char(32) NOT NULL COMMENT '交易全局唯一号',
`EXTERNAL_ORDER_NO` varchar(64) NOT NULL COMMENT '外部系统订单号',
`REFERENCE_NO` varchar(64) NOT NULL COMMENT '参考号',
`CREDIT_DEBIT_FLAG` char(1) NOT NULL COMMENT '借贷记标记',
`CUSTOMER_GEN_FLAG` char(1) NOT NULL COMMENT '用户发起标记(Y:是/N:否)',
`ORIGINAL_TXN_AMOUNT` decimal(9,2) NOT NULL COMMENT '原交易金额',
`TXN_AMOUNT` decimal(9,2) NOT NULL DEFAULT '0.00' COMMENT '交易金额',
`POSTING_DATE` int(8) NOT NULL COMMENT '入账日期',
`POSTING_AMOUNT` decimal(9,2) NOT NULL DEFAULT '0.00' COMMENT '入账金额',
`INSTITUTION_FEE_AMOUNT` decimal(9,2) NOT NULL COMMENT '机构扣除费用',
`GEN_FEE_AMOUNT` decimal(9,2) NOT NULL DEFAULT '0.00' COMMENT '产生的费用金额',
`EXCHANGE_RATE` decimal(9,5) NOT NULL DEFAULT '0.00000' COMMENT '兑换费率',
`MERCHANT_NAME` varchar(72) NOT NULL COMMENT '商户名称("":默认)',
`COMMODITY_NO` varchar(32) NOT NULL COMMENT '商品编号("":默认)',
`STATEMENTE_FLAG` char(1) NOT NULL COMMENT '交易呈现账单标记(Y-呈现/N-不呈现)',
`TXN_DATE` int(8) NOT NULL COMMENT '交易日期',
`TXN_TIME` int(6) NOT NULL COMMENT '交易时间',
`CHAN_ACCT_NO` varchar(32) NOT NULL COMMENT '渠道账户号',
`CHAN_ACCT_NAME` varchar(64) NOT NULL COMMENT '渠道账户姓名',
`CHAN_CODE` varchar(16) NOT NULL COMMENT '渠道码',
`CHAN_NAME` varchar(128) DEFAULT NULL COMMENT '账户名称',
`CHAN_ADDR` varchar(128) DEFAULT NULL COMMENT '渠道地址',
`REQUEST_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`MOBILE_PHONE` char(15) DEFAULT NULL COMMENT '手机号',
`DESC_TEXT` varchar(400) DEFAULT NULL COMMENT '描述',
`DETECTION_TEXT` varchar(500) DEFAULT NULL COMMENT '回溯脚本',
`CREATED_BY` varchar(72) NOT NULL COMMENT '创建用户',
`CREATED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`MODIFIED_BY` varchar(72) NOT NULL COMMENT '更新用户',
`MODIFIED_DATE` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`MODIFIED_NO` int(8) NOT NULL DEFAULT '0' COMMENT '更新次数',
`PARTITION_KEY` smallint(4) NOT NULL COMMENT '分区键',
`EXTENDED_FIELD1` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD2` varchar(4) DEFAULT NULL,
`EXTENDED_FIELD3` varchar(4) DEFAULT NULL,
PRIMARY KEY (`TXN_ID`),
UNIQUE KEY `UK_ACCT_CLE` (`ACCOUNT_ID`,`SUMMARY_NO`) USING BTREE,
UNIQUE KEY `UK_INST_ORD` (`INSTITUTION_ID`,`EXTERNAL_ORDER_NO`) USING BTREE,
KEY `IK_ACCT_CYCL_SRCH` (`ACCOUNT_ID`,`STATEMENTE_FLAG`,`SUMMARY_NO`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='This entity holds, for each billing cycle of each account, the short transaction summary reference that appears on the statement sent to the customer. \r\nIt will be generated at posting from the full transaction details and will not be maintainable. It will undergo one or more events during its lifetime and will not be deleted until all extant events are ''cleared'' and the transaction retention period reached. Creation, maintenance and deletion will all be system controlled.\r\nWhen a transaction is received into the system the account against which it will be posted will be determined by identifying the appropriate plastic application that initiated the transaction using user-defined criteria.';
-- ----------------------------
-- Records of transaction_summary
-- ----------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment