Commit 01085b7a authored by Administrator's avatar Administrator

创建项目

parent fb914b8e
......@@ -26,6 +26,5 @@ public class Constant {
public final static String DICT_TYPE_PAY= "PAY";
public final static String DICT_CODE_WXP= "WXP";
public final static String DICT_TYPE_APP_CONFIG= "APP_CONFIG";
public final static String DICT_CODE_CALLBACK_URL= "CALLBACK_URL";
public final static String DICT_TYPE_WXP_CALLBACK_URL = "WXP_CALLBACK_URL";
}
......@@ -34,9 +34,8 @@ import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.UUID;
import static cn.quant.baa.pay.Constant.*;
import static cn.quant.baa.pay.Constant.DICT_TYPE_WXP_CALLBACK_URL;
import static cn.quant.baa.pay.acquirer.AcquirerConstant.*;
/**
......@@ -101,13 +100,13 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
}
@Override
public ChannelResponse pay(PayRequestData request, TransactionSummaryEntity history) throws Exception {
public ChannelResponse pay(PayRequestData request, TransactionSummaryEntity transaction) throws Exception {
ObjectNode bodyNode = objectMapper.createObjectNode();
// 转换金额为分
DictionaryItemDTO callback = DictionaryViewer.get(DICT_TYPE_APP_CONFIG, DICT_CODE_CALLBACK_URL);
DictionaryItemDTO callback = DictionaryViewer.get(DICT_TYPE_WXP_CALLBACK_URL, properties.getAccessCode().name());
if (callback == null) {
throw new ProfileException("Configuration not found in dictionary : {}; {}; {};", DICT_TYPE_APP_CONFIG, DICT_CODE_CALLBACK_URL, request);
throw new ProfileException("Configuration not found in dictionary : {}; {}; {};", DICT_TYPE_WXP_CALLBACK_URL, properties.getAccessCode().name(), request);
}
BigInteger amount = new BigDecimal(request.getAmount()).multiply(new BigDecimal(100)).toBigInteger();
......@@ -116,25 +115,25 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
.put("attach", request.getAttach())
.put("description", request.getSubject())
.put("notify_url", callback.getValue() + request.getChanId())
.put("out_trade_no", history.getTransactionId().toString());
.put("out_trade_no", transaction.getTransactionId().toString());
bodyNode.putObject("amount")
.put("total", amount);
ObjectNode sceneInfo = objectMapper.createObjectNode()
.put("payer_client_ip", "127.0.0.1");
.put("payer_client_ip", request.getRequestIp());
switch (properties.getAccessCode()) {
case H5:
sceneInfo.putObject("h5_info").put("type", "Wap");
break;
case JS:
bodyNode.putObject("payer")
.put("openid", "oUpF8uMuAJO_M2pxb1Q9zNjWeS6o");
.put("openid", transaction.getAccountNo());
break;
case APP:
default:
}
bodyNode.set("scene_info", sceneInfo);
String payAccess = properties.getPayAccess();
ChannelResponse response = doExecute(EXECUTE_PAY, payAccess, request, bodyNode);
ChannelResponse response = doExecute(EXECUTE_PAY, payAccess, request, bodyNode, transaction);
JsonNode node = response.getNode();
if (node != null) {
node = response.getNode().get("h5_url");
......@@ -155,13 +154,13 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
ObjectNode bodyNode = objectMapper.createObjectNode();
bodyNode.put("mchid", properties.getPayAcctId());
String payAccess = properties.getPayAccess().replace("{out_trade_no}", checkPayRequestData.getOutTradeNo());
return doExecute(EXECUTE_CHECK_PAY, payAccess, null, bodyNode);
return doExecute(EXECUTE_CHECK_PAY, payAccess, null, bodyNode, null);
}
@Override
public ChannelResponse checkRefund(CheckRefundRequestData checkRefundRequestData) throws Exception {
String payAccess = properties.getPayAccess().replace("{out_refund_no}", checkRefundRequestData.getOutRefundNo());
return doExecute(EXECUTE_CHECK_REFUND, payAccess, null, null);
return doExecute(EXECUTE_CHECK_REFUND, payAccess, null, null, null);
}
@Override
......@@ -169,7 +168,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
ObjectNode bodyNode = objectMapper.createObjectNode();
bodyNode.put("mchid", properties.getPayAcctId());
String payAccess = properties.getPayAccess().replace("{out_trade_no}", closeRequestData.getOutTradeNo());
return doExecute(EXECUTE_CLOSE, payAccess, null, bodyNode);
return doExecute(EXECUTE_CLOSE, payAccess, null, bodyNode, null);
}
@Override
......@@ -186,7 +185,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
.put("total", amount)
.put("currency", "CNY");
String payAccess = properties.getPayAccess();
return doExecute(EXECUTE_REFUND, payAccess, null, bodyNode);
return doExecute(EXECUTE_REFUND, payAccess, null, bodyNode, null);
}
/**
......@@ -194,7 +193,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
* @param bodyNode
* @return
*/
private ChannelResponse doExecute(String execute, String access, Object request, ObjectNode bodyNode) throws Exception {
private ChannelResponse doExecute(String execute, String access, Object request, ObjectNode bodyNode, TransactionSummaryEntity history) throws Exception {
ChannelResponse response = null;
......@@ -218,7 +217,7 @@ public class WeiXinMerchantAcquirer extends MerchantAcquirer {
}
String uri = uriComponentsBuilder.build().toString();
long timestamp = System.currentTimeMillis() / 1000;
String nonceStr = UUID.randomUUID().toString().replace("-", "");
String nonceStr = history.getCheckCode();
// 代签名字符串
String signText = joining("\n", method, uri, String.valueOf(timestamp), nonceStr, requestBody);
String sign = sign(signText);
......
......@@ -40,10 +40,10 @@ public class EntityBuilder {
account.setAutoStatus(StatusCode.NORM);
account.setAutoStatusDate(now);
account.setCorpotateAcctFlag(false);
account.setCreditTxnCount(0);
// account.setCreditTxnCount(0);
account.setCurrencyCode(CurrencyCode.CNY);
account.setCurrentCycleNo(1);
account.setDebitTxtCount(0);
// account.setDebitTxtCount(0);
account.setExternalAcctNo(buyerId);
account.setManualStatus(null);
account.setManualStatusDate(null);
......@@ -51,8 +51,8 @@ public class EntityBuilder {
account.setOpenDate(now);
account.setProductId(productId);
account.setProtocolRule(null);
account.setTotalCredit(BigDecimal.ZERO);
account.setTotalDebit(BigDecimal.ZERO);
// account.setTotalCredit(BigDecimal.ZERO);
// account.setTotalDebit(BigDecimal.ZERO);
account.setTxnNo(0);
Date date = DateUtils.now();
......@@ -78,6 +78,7 @@ public class EntityBuilder {
entity.setAccountId(account.getAccountId());
entity.setAddress(data.getAddress());
entity.setAttachText(data.getAttach());
entity.setAccountNo(data.getAccountNo());
entity.setCreditDebitFlag(CreditDebitFlag.C);
entity.setCurrencyCode(CurrencyCode.CNY);
entity.setCustomerGenFlag(true);
......
......@@ -79,17 +79,17 @@ public class AccountEntity extends DescribablePartitionEntity implements Seriali
@Column(name = "NEXT_TXN_NO", nullable = false)
private Integer nextTxnNo;
@Column(name = "TOTAL_CREDIT", nullable = false, precision = 2)
private BigDecimal totalCredit;
@Column(name = "TOTAL_DEBIT", nullable = false, precision = 2)
private BigDecimal totalDebit;
@Column(name = "CREDIT_TXN_COUNT", nullable = false)
private Integer creditTxnCount;
@Column(name = "DEBIT_TXT_COUNT", nullable = false)
private Integer debitTxtCount;
// @Column(name = "TOTAL_CREDIT", nullable = false, precision = 2)
// private BigDecimal totalCredit;
//
// @Column(name = "TOTAL_DEBIT", nullable = false, precision = 2)
// private BigDecimal totalDebit;
//
// @Column(name = "CREDIT_TXN_COUNT", nullable = false)
// private Integer creditTxnCount;
//
// @Column(name = "DEBIT_TXT_COUNT", nullable = false)
// private Integer debitTxtCount;
public AccountIds getIds() {
return ids;
......@@ -235,37 +235,37 @@ public class AccountEntity extends DescribablePartitionEntity implements Seriali
this.nextTxnNo = nextTxnNo;
}
public BigDecimal getTotalCredit() {
return totalCredit;
}
public void setTotalCredit(BigDecimal totalCredit) {
this.totalCredit = totalCredit;
}
public BigDecimal getTotalDebit() {
return totalDebit;
}
public void setTotalDebit(BigDecimal totalDebit) {
this.totalDebit = totalDebit;
}
public Integer getCreditTxnCount() {
return creditTxnCount;
}
public void setCreditTxnCount(Integer creditTxnCount) {
this.creditTxnCount = creditTxnCount;
}
public Integer getDebitTxtCount() {
return debitTxtCount;
}
public void setDebitTxtCount(Integer debitTxtCount) {
this.debitTxtCount = debitTxtCount;
}
// public BigDecimal getTotalCredit() {
// return totalCredit;
// }
//
// public void setTotalCredit(BigDecimal totalCredit) {
// this.totalCredit = totalCredit;
// }
//
// public BigDecimal getTotalDebit() {
// return totalDebit;
// }
//
// public void setTotalDebit(BigDecimal totalDebit) {
// this.totalDebit = totalDebit;
// }
//
// public Integer getCreditTxnCount() {
// return creditTxnCount;
// }
//
// public void setCreditTxnCount(Integer creditTxnCount) {
// this.creditTxnCount = creditTxnCount;
// }
//
// public Integer getDebitTxtCount() {
// return debitTxtCount;
// }
//
// public void setDebitTxtCount(Integer debitTxtCount) {
// this.debitTxtCount = debitTxtCount;
// }
@Override
public String getPersistentKey() {
......@@ -301,10 +301,10 @@ public class AccountEntity extends DescribablePartitionEntity implements Seriali
sb.append(", autoPaymentWarnDate=").append(autoPaymentWarnDate);
sb.append(", txnNo=").append(txnNo);
sb.append(", nextTxnNo=").append(nextTxnNo);
sb.append(", totalCredit=").append(totalCredit);
sb.append(", totalDebit=").append(totalDebit);
sb.append(", creditTxnCount=").append(creditTxnCount);
sb.append(", debitTxtCount=").append(debitTxtCount);
// sb.append(", totalCredit=").append(totalCredit);
// sb.append(", totalDebit=").append(totalDebit);
// sb.append(", creditTxnCount=").append(creditTxnCount);
// sb.append(", debitTxtCount=").append(debitTxtCount);
sb.append(',').append(super.toString());
sb.append('}');
return sb.toString();
......
......@@ -61,6 +61,9 @@ public class TransactionSummaryEntity extends DescribablePartitionEntity impleme
@Column(name = "STATUS_CODE", nullable = false, length = 4)
private StatusCode statusCode;
@Column(name = "ACCOUNT_NO", nullable = false, updatable = false, length = 128)
private String accountNo;
@Enumerated(EnumType.STRING)
@Column(name = "CURRENCY_CODE", nullable = false, updatable = false, length = 3)
private CurrencyCode currencyCode;
......@@ -220,6 +223,14 @@ public class TransactionSummaryEntity extends DescribablePartitionEntity impleme
this.statusCode = statusCode;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public CurrencyCode getCurrencyCode() {
return currencyCode;
}
......@@ -449,6 +460,7 @@ public class TransactionSummaryEntity extends DescribablePartitionEntity impleme
sb.append(", channelId=").append(channelId);
sb.append(", subject='").append(subject).append('\'');
sb.append(", statusCode=").append(statusCode);
sb.append(", accountNo='").append(accountNo).append('\'');
sb.append(", currencyCode=").append(currencyCode);
sb.append(", payMethod=").append(payMethod);
sb.append(", txnType='").append(txnType).append('\'');
......
......@@ -21,14 +21,16 @@ public class PayRequestData implements ChannelRequest, Serializable{
@Size(max = 128, message = "ILLEGAL_REQ_SUBJECT")
private String subject;
/**
* 商户ID
*/
@NotNull(message = "ILLEGAL_REQ_MCH_ID")
private String mchId;
// /**
// * 商户ID
// */
// @NotNull(message = "ILLEGAL_REQ_MCH_ID")
// private String mchId;
private String chanId;
private String requestIp;
/**
* 商户订单号
*/
......@@ -74,6 +76,10 @@ public class PayRequestData implements ChannelRequest, Serializable{
@NotNull(message = "ILLEGAL_REQ_BUYER_ID")
private String buyerId;
@Size(min = 6, max = 128, message ="ILLEGAL_REQ_ACCT_NO" )
@NotNull(message = "ILLEGAL_REQ_ACCT_NO")
private String accountNo;
/**
* 通知地址
*/
......@@ -117,13 +123,13 @@ public class PayRequestData implements ChannelRequest, Serializable{
this.subject = subject;
}
public String getMchId() {
return mchId;
}
public void setMchId(String mchId) {
this.mchId = mchId;
}
// public String getMchId() {
// return mchId;
// }
//
// public void setMchId(String mchId) {
// this.mchId = mchId;
// }
public String getChanId() {
return chanId;
......@@ -133,6 +139,14 @@ public class PayRequestData implements ChannelRequest, Serializable{
this.chanId = chanId;
}
public String getRequestIp() {
return requestIp;
}
public void setRequestIp(String requestIp) {
this.requestIp = requestIp;
}
public String getOutTradeNo() {
return outTradeNo;
}
......@@ -197,6 +211,14 @@ public class PayRequestData implements ChannelRequest, Serializable{
this.buyerId = buyerId;
}
public String getAccountNo() {
return accountNo;
}
public void setAccountNo(String accountNo) {
this.accountNo = accountNo;
}
public String getAttach() {
return attach;
}
......@@ -249,8 +271,8 @@ public class PayRequestData implements ChannelRequest, Serializable{
public String toString() {
final StringBuilder sb = new StringBuilder("PayRequestData{");
sb.append("subject='").append(subject).append('\'');
sb.append(", mchId='").append(mchId).append('\'');
sb.append(", chanId='").append(chanId).append('\'');
sb.append(", requestIp='").append(requestIp).append('\'');
sb.append(", outTradeNo='").append(outTradeNo).append('\'');
sb.append(", originalAmount='").append(originalAmount).append('\'');
sb.append(", amount='").append(amount).append('\'');
......@@ -258,6 +280,7 @@ public class PayRequestData implements ChannelRequest, Serializable{
sb.append(", cashAmount='").append(cashAmount).append('\'');
sb.append(", creditAmount='").append(creditAmount).append('\'');
sb.append(", buyerId='").append(buyerId).append('\'');
sb.append(", accountNo='").append(accountNo).append('\'');
sb.append(", notifyUrl='").append(notifyUrl).append('\'');
sb.append(", attach='").append(attach).append('\'');
sb.append(", shopName='").append(shopName).append('\'');
......
......@@ -7,6 +7,8 @@ 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.baa.pay.util.AssertUtils;
import cn.quant.spring.NullException;
import cn.quant.spring.ProfileException;
import cn.quant.spring.http.HttpResponseData;
import cn.quant.spring.rest.AbstractController;
import com.fasterxml.jackson.core.JsonProcessingException;
......@@ -54,7 +56,7 @@ public abstract class BusinessController extends AbstractController {
AcquirerProperties properties = acquirerPropertiesSource.get(Long.valueOf(chanId));
if (properties == null) {
AssertUtils.throwMessage(ACQUIRER_NOSUCH, chanId);
throw new NullException("Acquirer not found : {}; {};", chanId, data);
}
return properties;
......
......@@ -79,7 +79,7 @@ public class PayTestController extends BusinessController {
PayRequestData payRequestData = objectMapper.readValue(str, PayRequestData.class);
String[] temp = data.getChanId().split("_");
payRequestData.setChanId(temp[0]);
payRequestData.setMchId(temp[1]);
// payRequestData.setMchId(temp[1]);
payRequestData.setOutTradeNo(data.getOutTradeNo());
payRequestData.setSubject(data.getSubject());
payRequestData.setAmount(data.getAmount());
......
package cn.quant.baa.pay.rest;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Administrator on 2021/9/28 0028.
*/
@RestController
@RequestMapping("/tech")
public class TechController {
@RequestMapping("/health/check")
public ResponseEntity checkHealth() throws Exception {
return ResponseEntity.ok("ok");
}
}
......@@ -14,6 +14,7 @@ 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.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import static cn.quant.baa.pay.Constant.PAY_DUE_TIME;
......@@ -48,6 +49,8 @@ public class TransactionController extends BusinessController {
if (redisValue != null) {
return ResponseEntity.ok(deserialize(redisValue));
}
requestData.setRequestIp(ObjectUtils.getDisplayString(request.getRequestIp()));
ChannelResponse channelResponse = transactionService.pay(properties, requestData);
HttpResponseData response = response(channelResponse);
if (channelResponse.getSuccess()) {
......
......@@ -55,7 +55,6 @@ public class TransactionService extends BusinessService {
TransactionSession session = TransactionSession.session();
Long chanId = properties.getMchChanId();
String institutionId = properties.getInstitutionId();
String productId = properties.getProductId();
String buyerId = data.getBuyerId();
......@@ -66,11 +65,6 @@ public class TransactionService extends BusinessService {
prepare(institutionId, productId, buyerId, session);
String mchId = data.getMchId();
if (!mchId.equals(properties.getPayAppId())) {
AssertUtils.throwMessage(ACQUIRER_NOMATCH, chanId, mchId);
}
AccountEntity account = session.getAccount();
long historyId = session.nextId();
Integer partitionKey = account.getPartitionKey();
......@@ -84,22 +78,22 @@ public class TransactionService extends BusinessService {
details.add(detailEntity);
}
TransactionSummaryEntity history = EntityBuilder.payHistory(account, historyId, data, properties, session);
ChannelResponse responseData = acquirer.pay(data, history);
TransactionSummaryEntity transaction = EntityBuilder.payHistory(account, historyId, data, properties, session);
ChannelResponse responseData = acquirer.pay(data, transaction);
if (responseData.getSuccess()) {
EntityBuilder.nextTxnNo(account, history);
EntityBuilder.nextTxnNo(account, transaction);
history.setCheckCode(checkCode);
history.setPayDueTime(LocalDateTime.now().plus(PAY_DUE_TIME));
history.setRequestId(responseData.getRequestId());
history.setDescText(responseData.getNotification());
transaction.setCheckCode(checkCode);
transaction.setPayDueTime(LocalDateTime.now().plus(PAY_DUE_TIME));
transaction.setRequestId(responseData.getRequestId());
transaction.setDescText(responseData.getNotification());
BatchCycleTriggerEntity trigger = EntityBuilder.payTrigger(session.nextId(), history);
BatchCycleTriggerEntity trigger = EntityBuilder.payTrigger(session.nextId(), transaction);
trigger.setRequestId(session.getRequestId());
trigger.setNotifyUrl(data.getNotifyUrl());
session.pushEntity(history, trigger);
session.pushEntity(transaction, trigger);
session.pushEntity(details);
session.commit();
}
......
......@@ -28,7 +28,7 @@
</encoder>
</appender>
<logger name="cn.quant.baa.pay" level="DEBUG"/>
<logger name="cn.quant.baa.pay" level="INFO"/>
<logger name="javax.activation" level="ERROR"/>
<logger name="org.quartz.core" level="ERROR"/>
<logger name="org.quartz.simpl" level="ERROR"/>
......@@ -72,7 +72,7 @@
<logger name="org.hibernate.engine.QueryParameters" level="ERROR"/>
<logger name="org.hibernate.SQL" level="ERROR" />
<root level="DEBUG">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLINGFILE"/>
</root>
......
......@@ -28,7 +28,7 @@
</encoder>
</appender>
<logger name="cn.quant.baa.pay" level="DEBUG"/>
<logger name="cn.quant.baa.pay" level="INFO"/>
<logger name="javax.activation" level="ERROR"/>
<logger name="org.quartz.core" level="ERROR"/>
<logger name="org.quartz.simpl" level="ERROR"/>
......@@ -68,7 +68,7 @@
<logger name="org.hibernate.engine.QueryParameters" level="ERROR"/>
<logger name="org.hibernate.SQL" level="ERROR" />
<root level="DEBUG">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ROLLINGFILE"/>
</root>
......
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