Commit de507dea authored by Administrator's avatar Administrator

创建项目

parent 6241656a
......@@ -28,7 +28,7 @@
<mapping class="cn.quant.baa.pay.jpa.entity.DictionaryEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.CustomerEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.AccountEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.PayHistoryEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.PayGoodsDetailEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.StatusCodeEntity"/>
<mapping class="cn.quant.baa.pay.jpa.entity.BatchCycleTriggerEntity"/>
......
......@@ -13,7 +13,6 @@
<packaging>jar</packaging>
<dependencies>
<dependency>
......
package cn.quant.baa.pay.acquirer;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
import cn.quant.baa.pay.model.web.*;
/**
......@@ -9,7 +9,7 @@ import cn.quant.baa.pay.model.web.*;
public interface Acquirer {
Object code();
ChannelResponse pay(PayRequestData payRequestData, PayHistoryEntity payHistoryEntity) throws Exception;
ChannelResponse pay(PayRequestData payRequestData, TransactionSummaryEntity payHistoryEntity) throws Exception;
ChannelResponse refund(RefundRequestData refundRequestData) throws Exception;
ChannelResponse checkPay(CheckPayRequestData checkPayRequestData) throws Exception;
ChannelResponse checkRefund(CheckRefundRequestData checkRefundRequestData) throws Exception;
......
package cn.quant.baa.pay.acquirer;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import com.fasterxml.jackson.databind.JsonNode;
/**
......
package cn.quant.baa.pay.acquirer;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
import cn.quant.baa.pay.model.web.*;
import cn.quant.spring.NotSupportedException;
import cn.quant.spring.security.Base64Cipher;
......@@ -64,7 +64,7 @@ public class MerchantAcquirer implements Acquirer {
}
@Override
public ChannelResponse pay(PayRequestData request, PayHistoryEntity history) throws Exception {
public ChannelResponse pay(PayRequestData request, TransactionSummaryEntity history) throws Exception {
ChannelResponse response = acquirers.get(request.getChanId()).pay(request, history);
response.setOrderNo(String.valueOf(history.getTransactionId()));
return response;
......
......@@ -3,7 +3,7 @@ package cn.quant.baa.pay.acquirer.alipay;
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.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
import cn.quant.baa.pay.model.web.*;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
......@@ -114,7 +114,7 @@ public class AlipayMerchantAcquirer extends MerchantAcquirer {
}
@Override
public ChannelResponse pay(PayRequestData payRequestData, PayHistoryEntity payHistoryEntity) {
public ChannelResponse pay(PayRequestData payRequestData, TransactionSummaryEntity payHistoryEntity) {
ObjectNode bodyNode = objectMapper.createObjectNode();
bodyNode.put("out_trade_no", payRequestData.getOutTradeNo());
bodyNode.put("total_amount", payRequestData.getAmount());
......
......@@ -4,8 +4,7 @@ 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.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.PayHistoryIds;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
import cn.quant.baa.pay.model.dto.DictionaryItemDTO;
import cn.quant.baa.pay.model.web.*;
import cn.quant.spring.NullException;
......@@ -100,7 +99,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
}
@Override
public ChannelResponse pay(PayRequestData request, PayHistoryEntity history) throws Exception {
public ChannelResponse pay(PayRequestData request, TransactionSummaryEntity history) throws Exception {
ObjectNode bodyNode = objectMapper.createObjectNode();
// 转换金额为分
BigInteger amount = new BigDecimal(request.getAmount()).multiply(new BigDecimal(100)).toBigInteger();
......
......@@ -19,7 +19,7 @@ import static cn.quant.baa.pay.Constant.MINI_LOCAL_DATE;
*/
public class EntityBuilder {
public static int nextTxnNo(AccountEntity account, PayHistoryEntity history) {
public static int nextTxnNo(AccountEntity account, TransactionSummaryEntity history) {
Integer txnNo = account.getNextTxnNo();
account.setTxnNo(txnNo);
account.setNextTxnNo(txnNo + 1);
......@@ -60,7 +60,7 @@ public class EntityBuilder {
return account;
}
public static PayHistoryEntity payHistory(AccountEntity account, PayHistoryIds ids, long historyId, PayRequestData data, AcquirerProperties properties
public static TransactionSummaryEntity payHistory(AccountEntity account, long historyId, PayRequestData data, AcquirerProperties properties
, TransactionSession session) {
BigDecimal discount = new BigDecimal(data.getDiscounts());
......@@ -70,8 +70,9 @@ public class EntityBuilder {
BigDecimal amount = new BigDecimal(data.getAmount());
String signer = data.getGoodsSigner();
PayHistoryEntity entity = new PayHistoryEntity();
entity.setIds(ids);
TransactionSummaryEntity entity = new TransactionSummaryEntity();
entity.setInstitutionId(properties.getInstitutionId());
entity.setProductId(properties.getProductId());
entity.setAccountId(account.getAccountId());
entity.setAddress(data.getAddress());
entity.setAttachText(data.getAttach());
......@@ -80,7 +81,9 @@ public class EntityBuilder {
entity.setCustomerGenFlag(true);
entity.setChannelId(properties.getMchChanId());
entity.setDiscAmount(discount);
entity.setExternalOrderNo(data.getOutTradeNo());
entity.setGenFeeAmount(BigDecimal.ZERO);
entity.setGenOrderNo("");
entity.setGoodsSigner(signer);
entity.setShopName(data.getShopName());
entity.setMobilePhone(data.getPhoneNo());
......@@ -131,7 +134,7 @@ public class EntityBuilder {
return entity;
}
public static BatchCycleTriggerEntity payTrigger(Long triggerId, PayHistoryEntity history) {
public static BatchCycleTriggerEntity payTrigger(Long triggerId, TransactionSummaryEntity history) {
Date now = DateUtils.now();
BatchCycleTriggerEntity entity = new BatchCycleTriggerEntity();
entity.setAccountId(history.getAccountId());
......
package cn.quant.baa.pay.jpa.entity;
import cn.quant.spring.data.jpa.entity.PrimaryIds;
import cn.quant.spring.util.StringUtils;
import javax.persistence.Column;
import javax.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
/**
* Created by Administrator on 2021/8/26 0026.
*/
@Embeddable
public class PayHistoryIds extends PrimaryIds implements Serializable {
public final static String CLASS_NAME = PayHistoryEntity.class.getSimpleName();
@Column(name = "INSTITUTION_ID", nullable = false, updatable = false, length = 4)
private String institutionId;
@Column(name = "PRODUCT_ID", nullable = false, updatable = false, length = 4)
private String productId;
@Column(name = "EXTERNAL_ORDER_NO", nullable = false, updatable = false, length = 64)
private String externalOrderNo;
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getExternalOrderNo() {
return externalOrderNo;
}
public void setExternalOrderNo(String externalOrderNo) {
this.externalOrderNo = externalOrderNo;
}
@Override
public String getPersistentKey() {
return StringUtils.toDelimitedString(CLASS_NAME, institutionId, productId, externalOrderNo);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PayHistoryIds that = (PayHistoryIds) o;
return Objects.equals(institutionId, that.institutionId) &&
Objects.equals(productId, that.productId) &&
Objects.equals(externalOrderNo, that.externalOrderNo);
}
@Override
public int hashCode() {
return Objects.hash(CLASS_NAME, institutionId, productId, externalOrderNo);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayHistoryIds{");
sb.append("institutionId='").append(institutionId).append('\'');
sb.append(", productId='").append(productId).append('\'');
sb.append(", externalOrderNo='").append(externalOrderNo).append('\'');
sb.append('}');
return sb.toString();
}
}
......@@ -5,6 +5,7 @@ import cn.quant.baa.pay.dict.CurrencyCode;
import cn.quant.baa.pay.dict.PayMethod;
import cn.quant.baa.pay.dict.StatusCode;
import cn.quant.spring.data.jpa.entity.DescribablePartitionEntity;
import cn.quant.spring.util.StringUtils;
import org.hibernate.annotations.Type;
import javax.persistence.*;
......@@ -20,16 +21,33 @@ import java.util.Objects;
* Created by Administrator on 2021/8/26 0026.
*/
@Entity
@Table(name = "pay_history")
public class PayHistoryEntity extends DescribablePartitionEntity implements Serializable{
@Table(name = "transaction_summary")
public class TransactionSummaryEntity extends DescribablePartitionEntity implements Serializable {
private static final long serialVersionUID = 6297586921507136281L;
@EmbeddedId
private PayHistoryIds ids;
private static final String CLASS_NAME = TransactionSummaryEntity.class.getSimpleName();
@Column(name = "TRANSACTION_ID", nullable = false, updatable = false)
private Long transactionId;
@Id
@Column(name = "CHECK_CODE", nullable = false, updatable = false, length = 32)
private String checkCode;
@Column(name = "INSTITUTION_ID", nullable = false, updatable = false, length = 4)
private String institutionId;
@Column(name = "PRODUCT_ID", nullable = false, updatable = false, length = 4)
private String productId;
@Column(name = "EXTERNAL_ORDER_NO", nullable = false, updatable = false, length = 64)
private String externalOrderNo;
@Column(name = "GEN_ORDER_NO", nullable = false, updatable = false, length = 64)
private String genOrderNo;
@Column(name = "ACCOUNT_ID", nullable = false, updatable = false)
private Long accountId;
......@@ -122,14 +140,6 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
@Column(name = "ATTACH_TEXT", nullable = true, length = 512)
private String attachText;
public PayHistoryIds getIds() {
return ids;
}
public void setIds(PayHistoryIds ids) {
this.ids = ids;
}
public Long getTransactionId() {
return transactionId;
}
......@@ -138,6 +148,46 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
this.transactionId = transactionId;
}
public String getCheckCode() {
return checkCode;
}
public void setCheckCode(String checkCode) {
this.checkCode = checkCode;
}
public String getInstitutionId() {
return institutionId;
}
public void setInstitutionId(String institutionId) {
this.institutionId = institutionId;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
public String getExternalOrderNo() {
return externalOrderNo;
}
public void setExternalOrderNo(String externalOrderNo) {
this.externalOrderNo = externalOrderNo;
}
public String getGenOrderNo() {
return genOrderNo;
}
public void setGenOrderNo(String genOrderNo) {
this.genOrderNo = genOrderNo;
}
public Long getAccountId() {
return accountId;
}
......@@ -190,8 +240,8 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
return txnType;
}
public void setTxnType(String txnTypeCode) {
this.txnType = txnTypeCode;
public void setTxnType(String txnType) {
this.txnType = txnType;
}
public String getTxnCode() {
......@@ -334,8 +384,8 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
return shopName;
}
public void setShopName(String merchantName) {
this.shopName = merchantName;
public void setShopName(String shopName) {
this.shopName = shopName;
}
public String getMobilePhone() {
......@@ -372,22 +422,29 @@ public class PayHistoryEntity extends DescribablePartitionEntity implements Seri
@Override
public String getPersistentKey() {
return ids.getPersistentKey();
return StringUtils.toDelimitedString(CLASS_NAME, institutionId, productId, externalOrderNo);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
PayHistoryEntity that = (PayHistoryEntity) o;
return Objects.equals(ids, that.ids);
TransactionSummaryEntity that = (TransactionSummaryEntity) o;
return Objects.equals(institutionId, that.institutionId) &&
Objects.equals(productId, that.productId) &&
Objects.equals(externalOrderNo, that.externalOrderNo);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("PayHistoryEntity{");
sb.append("ids=").append(ids);
sb.append(", transactionId=").append(transactionId);
final StringBuilder sb = new StringBuilder("TransactionSummaryEntity{");
sb.append("transactionId=").append(transactionId);
sb.append(", checkCode='").append(checkCode).append('\'');
sb.append(", institutionId='").append(institutionId).append('\'');
sb.append(", productId='").append(productId).append('\'');
sb.append(", externalOrderNo='").append(externalOrderNo).append('\'');
sb.append(", genOrderNo='").append(genOrderNo).append('\'');
sb.append(", accountId=").append(accountId);
sb.append(", channelId=").append(channelId);
sb.append(", subject='").append(subject).append('\'');
......
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.BatchCycleTriggerEntity;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.PayHistoryIds;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
......
package cn.quant.baa.pay.jpa.repository;
import cn.quant.baa.pay.jpa.entity.PayFeatureEntity;
import cn.quant.baa.pay.jpa.entity.PayFeatureIds;
import cn.quant.baa.pay.jpa.entity.PayHistoryEntity;
import cn.quant.baa.pay.jpa.entity.PayHistoryIds;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
/**
* Created by Administrator on 2021/8/22 0022.
*/
@Repository
public interface PayHistoryRepository extends JpaRepository<PayHistoryEntity, PayHistoryIds> {
public interface TransactionSummaryRepository extends JpaRepository<TransactionSummaryEntity, String> {
// @Query("")
// int counAAAt(PayHistoryIds ids);
// int counAAAt(TransactionSummaryIds ids);
}
package cn.quant.baa.pay;
import java.util.zip.CRC32;
/**
* Created by Administrator on 2021/9/26 0026.
*/
public class Test {
public static void main(String[] args) {
CRC32 crc32 = new CRC32();
crc32.update("123".getBytes());
System.out.println(Long.toHexString(crc32.getValue()));
}
}
\ No newline at end of file
......@@ -63,9 +63,8 @@ public class TransactionController extends BusinessController {
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 redisKey = StringUtils.toDelimitedString(REDIS_NAMESPACE_PAY, institutionId, productId, outTradeNo);
String redisValue = stringRedisTemplate.opsForValue().get(redisKey);
if (redisValue != null) {
return ResponseEntity.ok(deserialize(redisValue));
......
......@@ -5,31 +5,21 @@ import cn.quant.baa.pay.acquirer.ChannelResponse;
import cn.quant.baa.pay.acquirer.MerchantAcquirer;
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.jpa.entity.AccountEntity;
import cn.quant.baa.pay.jpa.entity.BatchCycleTriggerEntity;
import cn.quant.baa.pay.jpa.entity.PayGoodsDetailEntity;
import cn.quant.baa.pay.jpa.entity.TransactionSummaryEntity;
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;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.LinkedList;
import java.util.List;
......@@ -50,11 +40,13 @@ public class TransactionService extends BusinessService {
private MerchantAcquirer acquirer;
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void check(PayHistoryIds ids, TransactionSession session) {
PayHistoryEntity historyEntity = session.findOne(PayHistoryEntity.class, ids);
public String check(String institutionId, String productId, String tradeNo, TransactionSession session) {
String md5 = DigestUtils.md5DigestAsHex(String.join(institutionId, productId, tradeNo).getBytes());
TransactionSummaryEntity historyEntity = session.findOne(TransactionSummaryEntity.class, md5);
if (historyEntity != null) {
AssertUtils.throwMessage(EXIST_ORDER, ids.getInstitutionId(), ids.getProductId(), ids.getExternalOrderNo());
AssertUtils.throwMessage(EXIST_ORDER, institutionId, productId, tradeNo);
}
return md5;
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
......@@ -70,11 +62,8 @@ public class TransactionService extends BusinessService {
String buyerId = data.getBuyerId();
String outTradeNo = data.getOutTradeNo();
PayHistoryIds ids = new PayHistoryIds();
ids.setInstitutionId(institutionId);
ids.setProductId(productId);
ids.setExternalOrderNo(outTradeNo);
check(ids, session);
String checkCode = check(institutionId, productId, outTradeNo, session);
prepare(institutionId, productId, buyerId, session);
......@@ -96,12 +85,13 @@ public class TransactionService extends BusinessService {
details.add(detailEntity);
}
PayHistoryEntity history = EntityBuilder.payHistory(account, ids, historyId, data, properties, session);
TransactionSummaryEntity history = EntityBuilder.payHistory(account, historyId, data, properties, session);
ChannelResponse responseData = acquirer.pay(data, history);
if (responseData.getSuccess()) {
EntityBuilder.nextTxnNo(account, history);
history.setCheckCode(checkCode);
history.setPayDueTime(LocalDateTime.now().plus(PAY_DUE_TIME));
history.setRequestId(responseData.getRequestId());
history.setDescText(responseData.getNotification());
......@@ -126,7 +116,7 @@ public class TransactionService extends BusinessService {
//
// TransactionSession session = payHistory(data);
//
// PayHistoryEntity payHistoryEntity = session.getProperty(PayHistoryEntity.class, PayHistoryEntity.class);
// TransactionSummaryEntity payHistoryEntity = session.getProperty(TransactionSummaryEntity.class, TransactionSummaryEntity.class);
// System.currentTimeMillis();
// return acquirer.pay(data, payHistoryEntity);
// }
......
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