交易细节修改
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java
new file mode 100644
index 0000000..347e79a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlBusinessDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TUserdtlBusiness;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UserdtlBusinessDao extends JpaRepository<TUserdtlBusiness, String> {
+ TUserdtlBusiness getByRefno(String refno);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
index 72181db..007cff7 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java
@@ -27,4 +27,6 @@
@QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")})
@Query("select dtl from TUserdtl dtl where dtl.outtradeno = ?1 and dtl.shopaccno=?2 ")
TUserdtl findByBillnoForUpdateNowait(String billno,String shopaccno);
+
+ TUserdtl findByOuttradenoAndShopaccno(String outtradeno,String shopaccno);
}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
index be80103..088cb9e 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
@@ -16,13 +16,13 @@
private String enable;
@Column(name = "CHARGE_ENABLE", nullable = false, length = 10)
- private String chargeEnable;
+ private String chargeEnable; //充值总开关
@Column(name = "CONSUME_ENABLE",nullable = false, length = 10)
- private String consumeEnable;
+ private String consumeEnable; //消费总开关
@Column(name = "ANONYMOUS_ENABLE", nullable = false, length = 10)
- private String anonymousEnable;
+ private String anonymousEnable; //匿名消费总开关
@Column(name = "PAYDESC", length = 200)
private String paydesc;
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
index cb4662e..a9b95f1 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
@@ -15,13 +15,13 @@
private String paytype;
@Column(name = "CONSUME_ENABLE", nullable = false, length = 10)
- private String consumeEnable;
+ private String consumeEnable; //该商户下,此支付方式能否消费
@Column(name = "ANONYMOUS_ENABLE", nullable = false, length = 10)
- private String anonymousEnable;
+ private String anonymousEnable; //该商户下,此支付方式能否匿名消费
@Column(name = "REVERSE_ENABLE", nullable = false, length = 10)
- private String reverseEnable;
+ private String reverseEnable; //该商户下,此支付方式能否冲正
@Column(name = "CREATETIME", length = 14)
private String createtime;
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java
index cb5e67c..42ed8ca 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtlBusiness.java
@@ -29,7 +29,7 @@
this.jsonContent = jsonContent;
}
- public TUserdtlBusiness(String refno, Map<String, Object> map) {
+ public TUserdtlBusiness(String refno, Map<String, String> map) {
this.refno = refno;
if (null == map || map.isEmpty()) {
this.jsonContent = "";
@@ -54,10 +54,10 @@
this.jsonContent = jsonContent;
}
- public Map<String, Object> getContentMap() {
- Map<String, Object> map = new HashMap<>(0);
+ public Map<String, String> getContentMap() {
+ Map<String, String> map = new HashMap<>(0);
if (!StringUtil.isEmpty(this.jsonContent))
- map = gsonUtil.fromJson(this.jsonContent, new TypeToken<Map<String, Object>>() {
+ map = gsonUtil.fromJson(this.jsonContent, new TypeToken<Map<String, String>>() {
}.getType());
return map;
}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
index 5c51c26..20cd922 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -4,8 +4,11 @@
* 交易码、交易类型
* */
public class TradeCode {
- public static final int TRANSCODE_PAY = 3000;
- public static final int TRANSCODE_YKTPAY=1000;
+ public static final int TRANSCODE_BALANCE_PAY = 3000; //账户余额支付
+ public static final int TRANSCODE_CITIZENCARD_PAY=3010; //市民卡代扣消费
+ public static final int TRANSCODE_YKTCARD_PAY=3020; //一卡通支付
+
+
public static final int TRANSCODE_WECHAT=1001;
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
index a8139c9..336239e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -100,6 +100,12 @@
public static final int FEETYPE_NOT_EXISTS = 10018;
/**
+ * 费用类别不支持
+ * */
+ public static final int FEETYPE_NOT_NOSUPPORT = 10019;
+
+
+ /**
* 请求参数错误
* */
public static final int REQUEST_PARAM_ERROR = 20000;
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index d02ba57..4902e84 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -23,8 +23,8 @@
class CallService {
companion object {
- fun callYktPay(config: Map<String, String>, paydtl: TUserdtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): BaseResp {
- val code = BaseResp()
+ fun callYktPay(config: Map<String, String?>, paydtl: TUserdtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
+ val code = CallBackResp()
val appid = config["appid"]
if (appid.isNullOrEmpty()) {
code.retcode = "1"
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index 414da8e..f498fee 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -212,6 +212,42 @@
}
}
+class YktCardPayinitParam : APIRequestParam() {
+ @Sign
+ var uid: String? = null //未注册,可能不传
+ @Sign
+ var shopaccno: String = "" //必传
+ @Sign
+ var amount: Int = 0 //必传
+
+ var feelist: List<ConsumeFeetype>? = null //TODO: 怎么拼接签名字符串??
+ @Sign
+ var billno: String = "" //必传
+ @Sign
+ var transdate: String = "" //必传
+ @Sign
+ var transtime: String = "" //必传
+ @Sign
+ var stuempno: String = "" //必传
+ @Sign
+ var yktshopid: String? = null
+ @Sign
+ var devphyid: String? = null
+
+ fun checkParam(): Boolean {
+
+ if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户")
+ if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零")
+ if (StringUtil.isEmpty(billno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "对接系统唯一订单号不能为空")
+ if (!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
+ if (!DateUtil.checkDatetimeValid(transtime, DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
+ if (StringUtil.isEmpty(stuempno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通唯一号不能为空")
+ if(!StringUtil.isEmpty(yktshopid) && !NumberUtil.isDigits(yktshopid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "一卡通商户号非整数")
+
+ return true
+ }
+}
+
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
index 2c1555c..ff29e99 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt
@@ -86,6 +86,7 @@
lateinit var refno: String
lateinit var status: String
lateinit var shopaccno: String
+ val extendMap = mutableMapOf<String, String>() //存调第三方需要的参数信息
val resultMap = mutableMapOf<String, String>() //存调第三方结果数据
var transcode = 0
@@ -167,6 +168,15 @@
return this
}
+ fun addExtendParam(key: String, value: String): PersonTransBuilder {
+ this.extendMap.plus(mapOf(key to value))
+ return this
+ }
+
+ fun addExtendParam(param: Map<String, String>): PersonTransBuilder {
+ this.extendMap.plus(param)
+ return this
+ }
fun addResult(key: String, value: String): PersonTransBuilder {
this.resultMap.plus(mapOf(key to value))
return this
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index a35b8ce..066e43c 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -6,9 +6,11 @@
import com.supwisdom.dlpay.api.bean.CitizenCardPayfinishParam
import com.supwisdom.dlpay.api.bean.CitizenCardPayinitParam
import com.supwisdom.dlpay.api.bean.QueryDtlResultParam
+import com.supwisdom.dlpay.api.bean.YktCardPayinitParam
import com.supwisdom.dlpay.api.service.*
import com.supwisdom.dlpay.exception.RequestParamCheckException
import com.supwisdom.dlpay.exception.TransactionException
+import com.supwisdom.dlpay.exception.TransactionProcessException
import com.supwisdom.dlpay.framework.ResponseBodyBuilder
import com.supwisdom.dlpay.framework.service.CommonService
import com.supwisdom.dlpay.framework.service.SystemUtilService
@@ -78,7 +80,75 @@
}
/**
- * 市民卡交易初始化
+ * ============================================================================
+ * 账户【余额支付】
+ * ============================================================================
+ * */
+ @PostMapping("/balance/pay")
+ fun balancePay(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ return try {
+ if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+ }
+
+ val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
+ if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
+ val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .chooseTradetype(Tradetype.CONSUME) //消费
+ .setOwner(person) //记名
+ .setTransinfo(TradeCode.TRANSCODE_BALANCE_PAY, "账户余额支付")
+ .setTransDatetime(param.transdate, param.transtime) //交易时间
+ .selectPaytype(TradeDict.PAYTYPE_BALANCE, param.cardNo)
+ .addDetail(AccountHolder.person(person.userid),
+ AccountHolder.shop(param.shopaccno),
+ param.amount / 100.0, "账户余额消费")
+ .also { builder ->
+ param.feelist?.forEach {
+ when(it.feetype){
+ TradeDict.FEETYPE_CONSUME_MEALER -> {
+ if (it.amount <= 0) {
+ throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "费用类别<${it.feetype}>的金额不能为负")
+ }
+ builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE)
+ .with(AccountHolder.shop(param.shopaccno))
+ .with(AccountHolder.person(person.userid))
+ , it.amount / 100.0)
+ }
+ TradeDict.FEETYPE_CONSUME_DISCOUNT->{
+ TODO("折扣逻辑暂缺")
+ }
+ else -> throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_NOSUPPORT, "费用类别<${it.feetype}>不支持")
+ }
+
+ }
+ }
+ .done(personBalancePayService)
+
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .data("refno", dtl.refno)
+ .data("amount", dtl.amount)
+ .success("交易成功"))
+ }
+
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
+
+ } catch (ex: RequestParamCheckException) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .requestException(ex, "请求参数错误"))
+ } catch (et: TransactionException) {
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .transException(et, "业务处理错误"))
+ }
+ }
+
+
+
+ /**
+ * ============================================================================
+ * 市民卡【交易初始化】
+ * ============================================================================
* */
@PostMapping("/citizencard/payinit")
fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
@@ -93,7 +163,7 @@
val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
.chooseTradetype(Tradetype.CONSUME) //消费
.setOwner(person) //记名
- .setTransinfo(TradeCode.TRANSCODE_PAY, "支付交易")
+ .setTransinfo(TradeCode.TRANSCODE_CITIZENCARD_PAY, "市民卡代扣消费")
.setTransDatetime(param.transdate, param.transtime) //交易时间
.selectPaytype(TradeDict.PAYTYPE_CITIZEN_CARD, param.cardNo)
.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD),
@@ -101,6 +171,7 @@
param.amount / 100.0, "市民卡代扣消费")
.also { builder ->
param.feelist?.forEach {
+ //fixme: 科目 -> 商户 与个人无关
builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_CITIZEN_CARD)
.with(AccountHolder.shop(param.shopaccno))
.with(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD))
@@ -128,7 +199,9 @@
}
/**
- * 市民卡交易确认
+ * ============================================================================
+ * 市民卡【交易确认】
+ * ============================================================================
* */
@PostMapping("/citizencard/payfinish")
fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
@@ -141,7 +214,7 @@
var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
.setRefno(param.refno)
.wip(personBalancePayService)
- val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, "shopaccno"), dtl)
+ val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, dtl.shopaccno), dtl)
if (code.retcode == "0") {
dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
.setRefno(param.refno)
@@ -171,47 +244,58 @@
}
}
+
+
/**
- * 账户余额支付
+ * ============================================================================
+ * 一卡通支付【交易初始化】
+ * ============================================================================
* */
- @PostMapping("/balance/pay")
- fun balancePay(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ @PostMapping("/ykt/payinit")
+ fun yktPayInit(@RequestBody param: YktCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
return try {
if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
}
- val person = userService.findPersonByIdentityCheckStatus(param.cardNo)
- if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_BALANCE)) {
+ val person = param.uid?.let { userService.findByThirdUniqueIdenty(it) } ?: null //没注册,可能匿名?
+ if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person==null)) {
val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
.chooseTradetype(Tradetype.CONSUME) //消费
- .setOwner(person) //记名
- .setTransinfo(TradeCode.TRANSCODE_PAY, "支付交易")
+ .also {
+ if (null != person) it.setOwner(person)
+ }
+ .setTransinfo(TradeCode.TRANSCODE_YKTCARD_PAY, "一卡通支付")
.setTransDatetime(param.transdate, param.transtime) //交易时间
- .selectPaytype(TradeDict.PAYTYPE_BALANCE, param.cardNo)
- .addDetail(AccountHolder.person(person.userid),
+ .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.stuempno)
+ .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
AccountHolder.shop(param.shopaccno),
- param.amount / 100.0, "账户余额消费")
+ param.amount / 100.0, "一卡通支付")
.also { builder ->
param.feelist?.forEach {
- builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE)
+ //fixme: 科目 -> 商户 与个人无关
+ builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
.with(AccountHolder.shop(param.shopaccno))
- .with(AccountHolder.person(person.userid))
+ .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
, it.amount / 100.0)
}
}
- .done(personBalancePayService)
+ .addExtendParam("stuempno", param.stuempno)
+ .addExtendParam("yktshopid", param.yktshopid ?: "")
+ .addExtendParam("devphyid", param.devphyid ?: "")
+ //.addExtendParam(param.extendmap) //fixme: 保存调一卡通附加参数 (是否直接传附加参数map)
+ .init(personBalancePayService)
ResponseEntity.ok(ResponseBodyBuilder.create()
.data("refno", dtl.refno)
.data("amount", dtl.amount)
- .success("交易成功"))
+ .success("交易初始化成功"))
+
}
ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<账户余额>"))
-
+ .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
} catch (ex: RequestParamCheckException) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.requestException(ex, "请求参数错误"))
@@ -221,51 +305,47 @@
}
}
+
/**
- * 一卡通支付
+ * ============================================================================
+ * 一卡通支付【交易确认】
+ * ============================================================================
* */
- @PostMapping("/ykt/payinit")
- fun yktPayInit(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity<Any> {
+ @PostMapping("/ykt/payfinish")
+ fun yktPayFinish(@RequestBody param:CitizenCardPayfinishParam,request: HttpServletRequest,response: HttpServletResponse): ResponseEntity<Any> {
return try {
if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
}
- var person = userService.findByThirdUniqueIdenty(param.cardNo) //可能匿名?
- if (consumePayService.checkShopPaytype(param.shopaccno, TradeDict.PAYTYPE_YKT_CARD, person==null)) {
- val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
- .chooseTradetype(Tradetype.CONSUME) //消费
- .also {
- if(null!=person) it.setOwner(person)
- }
- .setTransinfo(TradeCode.TRANSCODE_PAY, "支付交易")
- .setTransDatetime(param.transdate, param.transtime) //交易时间
- .selectPaytype(TradeDict.PAYTYPE_YKT_CARD, param.cardNo)
- .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT),
- AccountHolder.shop(param.shopaccno),
- param.amount / 100.0, "一卡通支付")
- .also { builder ->
- param.feelist?.forEach {
- builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_YKT_CARD)
- .with(AccountHolder.shop(param.shopaccno))
- .with(AccountHolder.subject(Subject.SUBJNO_PAY_YKT))
- , it.amount / 100.0)
- }
- }
- .init(personBalancePayService)
+ var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .setRefno(param.refno)
+ .wip(personBalancePayService)
+ val extendMap = consumePayService.getUserdtlExtendParamMap(dtl.refno)
+ val code = CallService.callYktPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, dtl.shopaccno, dtl.userid==null),
+ dtl, DateUtil.getNow(), extendMap["stuempno"]!!, extendMap["yktshopid"]!!, extendMap["devphyid"])
+ if (code.retcode == "0") {
+ dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .setRefno(param.refno)
+ .addResult(code.data)
+ .success(personBalancePayService) //流水置成功
ResponseEntity.ok(ResponseBodyBuilder.create()
.data("refno", dtl.refno)
- .data("amount", dtl.amount)
- .success("交易初始化成功"))
+ .data("billno", dtl.outtradeno)
+ .success())
+ } else {
+ PersonTransBuilder.newBuilder(accountUtilServcie)
+ .setRefno(param.refno)
+ .addResult("errmsg", code.retmsg!!)
+ .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功
-
+ ResponseEntity.ok(ResponseBodyBuilder.create()
+ .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}"))
}
- ResponseEntity.ok(ResponseBodyBuilder.create()
- .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<一卡通支付>"))
- } catch (ex: RequestParamCheckException) {
+ }catch (ex: RequestParamCheckException) {
ResponseEntity.ok(ResponseBodyBuilder.create()
.requestException(ex, "请求参数错误"))
} catch (et: TransactionException) {
@@ -299,31 +379,7 @@
// }
-//
-// @PostMapping("/ykt/payfinish")
-// fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity<Any> {
-// return try {
-// val dtl = personBalancePayService.wip(refno)
-// val person = userService.findPersonByUserid(dtl.userid)
-// val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
-// dtl, DateUtil.getNow(), "", yktshopid, devphyid)
-// if (code.retcode == "0") {
-// PersonTransBuilder.newBuilder(accountUtilServcie)
-// .done(dtl.refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .data("refno", dtl.refno)
-// .success())
-// } else {
-// PersonTransBuilder.newBuilder(accountUtilServcie)
-// .done(dtl.refno, TradeDict.DTL_STATUS_FAIL, personBalancePayService)
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}"))
-// }
-// } catch (e: TransactionException) {
-// ResponseEntity.ok(ResponseBodyBuilder.create()
-// .transException(e, "交易确认失败"))
-// }
-// }
+
//
// /**
// * 微信支付
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
index a81b21a..54d8475 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -9,4 +9,7 @@
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
fun getPaytypeConfig(paytype: String, shopaccno: String, anonymousflag: Boolean? = false, ignoreStatus: Boolean? = false): Map<String, String?>
+
+ @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+ fun getUserdtlExtendParamMap(refno: String): Map<String, String>
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
index 6f36155..3c40253 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
@@ -1,9 +1,10 @@
package com.supwisdom.dlpay.api.service.impl
-import com.supwisdom.dlpay.api.dao.PaytypeConfigDao
import com.supwisdom.dlpay.api.dao.PaytypeDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
+import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
+import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
import com.supwisdom.dlpay.api.service.ConsumePayService
import com.supwisdom.dlpay.exception.TransactionProcessException
import com.supwisdom.dlpay.framework.util.TradeErrorCode
@@ -19,6 +20,8 @@
lateinit var shopPaytypeDao: ShopPaytypeDao
@Autowired
lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
+ @Autowired
+ lateinit var userdtlBusinessDao: UserdtlBusinessDao
override fun checkShopPaytype(shopaccno: String, paytype: String, anonymousflag: Boolean?): Boolean{
paytypeDao.getByPaytype(paytype).let {
@@ -53,6 +56,7 @@
if (null == it) {
throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
} else {
+ //对账取配置时不关心状态,不能报错
if (true != ignoreStatus && (ConstantUtil.ENABLE_YES != it.enable || ConstantUtil.ENABLE_YES != it.consumeEnable)) {
throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
}
@@ -66,6 +70,7 @@
if (null == it) {
throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
} else {
+ //对账取配置时不关心状态,不能报错
if (true != ignoreStatus && ConstantUtil.ENABLE_YES != it.consumeEnable) {
throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
}
@@ -85,4 +90,10 @@
}
} ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
}
+
+ override fun getUserdtlExtendParamMap(refno: String): Map<String, String> {
+ return userdtlBusinessDao.getByRefno(refno)?.let {
+ it.contentMap
+ } ?: mutableMapOf<String, String>()
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
index 7ef63a5..a322f11 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/pay_service_impl.kt
@@ -3,22 +3,20 @@
import com.supwisdom.dlpay.api.PersonTransBuilder
import com.supwisdom.dlpay.api.dao.AccountDao
import com.supwisdom.dlpay.api.dao.DebitCreditDtlDao
+import com.supwisdom.dlpay.api.dao.UserdtlBusinessDao
import com.supwisdom.dlpay.api.dao.UserdtlDao
import com.supwisdom.dlpay.api.domain.TAccount
import com.supwisdom.dlpay.api.domain.TDebitCreditDtl
import com.supwisdom.dlpay.api.domain.TUserdtl
+import com.supwisdom.dlpay.api.domain.TUserdtlBusiness
import com.supwisdom.dlpay.api.service.AccountUtilServcie
import com.supwisdom.dlpay.api.service.PersonBalancePayService
import com.supwisdom.dlpay.exception.TransactionException
import com.supwisdom.dlpay.exception.TransactionProcessException
-import com.supwisdom.dlpay.framework.dao.FeetypeConfigDao
-import com.supwisdom.dlpay.framework.dao.ShopaccDao
-import com.supwisdom.dlpay.framework.dao.SubjectDao
-import com.supwisdom.dlpay.framework.dao.TranstypeDao
+import com.supwisdom.dlpay.framework.dao.*
import com.supwisdom.dlpay.framework.domain.TFeetypeConfig
import com.supwisdom.dlpay.framework.domain.TShopacc
import com.supwisdom.dlpay.framework.domain.TSubject
-import com.supwisdom.dlpay.framework.domain.TTranstype
import com.supwisdom.dlpay.framework.service.SystemUtilService
import com.supwisdom.dlpay.framework.util.*
import org.hibernate.exception.LockTimeoutException
@@ -44,7 +42,6 @@
@Autowired
lateinit var feetypeConfigDao: FeetypeConfigDao
-
override fun readAccountForUpdateNowait(userid: String): TAccount {
return try {
accountDao.getByUseridForUpdateNowait(userid)
@@ -88,6 +85,9 @@
@Autowired
lateinit var accountDao: AccountDao
+ @Autowired
+ lateinit var userdtlBusinessDao: UserdtlBusinessDao
+
@PersistenceContext
lateinit var em: EntityManager
@@ -129,11 +129,6 @@
?: throw TransactionProcessException(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易参考号<$refno>不存在")
}
- private fun checkOuttradenoExist(outtradeno: String): Boolean {
-// TODO("判断 outtradeno 重复发起")
- return false
- }
-
private fun doDealAccount(accno: String, amount: Double, overdraft: Boolean): TAccount {
val account = getlockAccount(accno)
if (account.tacCheck())
@@ -158,7 +153,21 @@
}
override fun init(builder: PersonTransBuilder): TUserdtl {
- val userdtl = TUserdtl()
+ //判断第三方流水号重复 标准:shopaccno + outtradeno 唯一?
+ var userdtl = userdtlDao.findByOuttradenoAndShopaccno(builder.outtradeno, builder.shopaccno) //加锁?
+ if (null != userdtl) {
+ if (TradeDict.DTL_STATUS_INIT != userdtl.status) {
+ throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复") //非初始化状态,直接报错
+ }
+ //fixme: 判断是同一笔交易重发(标准??) 是->已初始化直接返回;否 -> 报错:外部流水号重复
+ if(builder.amount == userdtl.amount && builder.paytype == userdtl.paytype && builder.transDate == userdtl.transdate && builder.transTime==userdtl.transtime){
+ return userdtl // 交易日期,时间重发时是否会变??
+ }else{
+ throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复")
+ }
+ }
+
+ userdtl = TUserdtl() // 新建流水
userdtl.refno = systemUtilService.refno
userdtl.accdate = systemUtilService.accdate
userdtl.userid = builder.person.userid
@@ -176,20 +185,18 @@
userdtl.payinfo = builder.payinfo
userdtl.transcode = builder.transcode
if (StringUtil.isEmpty(builder.description)) {
- userdtl.transdesc = systemUtilService.getTranscodeName(builder.transcode, null);
+ userdtl.transdesc = systemUtilService.getTranscodeName(builder.transcode, null)
} else {
userdtl.transdesc = builder.description
}
userdtl.outtradeno = builder.outtradeno
+ userdtl.shopaccno = builder.shopaccno
// userdtl.operid =
when (builder.tradetype) {
Tradetype.RECHARGE -> userdtl.tradeflag = 1
Tradetype.CONSUME -> userdtl.tradeflag = 2
}
userdtl.createtime = systemUtilService.sysdatetime.hostdatetime
- if (checkOuttradenoExist(userdtl.outtradeno)) {
- throw TransactionProcessException(TradeErrorCode.OUTTRADENO_ALREADY_EXISTS, "外部流水号重复")
- }
userdtl.amount = builder.amount
userdtl.status = TradeDict.DTL_STATUS_INIT
@@ -208,6 +215,11 @@
debitCreditDtlDao.save(this)
}
}
+
+ if(builder.extendMap.isNotEmpty()){
+ userdtlBusinessDao.save(TUserdtlBusiness(userdtl.refno, builder.extendMap)) //保存参数
+ }
+
return userdtl
}
diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
index 894ad77..0293457 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/framework/framework_util.kt
@@ -74,7 +74,9 @@
if (retCode == INVALIDE_RETCODE) {
throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "未设置返回码!")
} else if (retCode != 0) {
- LOGGER.error(Gson().toJson(this.respData))
+ LOGGER.error("【 ==== ERROR ==== 】: " + Gson().toJson(this.respData))
+ }else{
+ LOGGER.info("retcode=[0],retmsg=[$retMsg] return success!!! \n" + Gson().toJson(this.respData))
}
return this.respData.plus(mapOf("retcode" to retCode, "retmsg" to retMsg))
}