第三方支付:一卡通
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index b570823..8465572 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -24,6 +24,7 @@
public static final String DTL_STATUS_SUCCESS = "success";
public static final String DTL_STATUS_FAIL = "fail";
public static final String DTL_STATUS_CANCEL = "cancel";
+ public static final String DTL_STATUS_WIP = "wip";
/**
* 交易借方
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
new file mode 100644
index 0000000..3070350
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt
@@ -0,0 +1,95 @@
+package com.supwisdom.dlpay.consume
+
+import com.google.gson.Gson
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.consume.bean.BaseResp
+import com.supwisdom.dlpay.consume.bean.SupStatusRevResp
+import com.supwisdom.dlpay.consume.bean.SupYktResp
+import com.supwisdom.dlpay.consume.domain.TUserdtl
+import com.supwisdom.dlpay.util.HmacUtil
+import com.supwisdom.dlpay.util.MoneyUtil
+
+/**
+ * Created by shuwei on 2019/4/11.
+ */
+class CallService {
+
+ companion object {
+ fun callYktPay(config: Map<String, String>, paydtl: TUserdtl, time: String, callback: (code: BaseResp) -> Unit) {
+ lateinit var code:BaseResp
+
+ var appid = config["appid"]
+ var appkey = config["appkey"]
+ var orderurl = config["orderurl"]
+
+ var params = hashMapOf<String, String?>()
+ params.put("partner_id", appid)
+ params.put("stuempno", "")
+ params.put("tradeno", paydtl.refno)
+ params.put("tradename", paydtl.payinfo)
+ params.put("amount", MoneyUtil.YuanToFen(paydtl.amount).toString())
+ params.put("shopid", "")
+ params.put("devphyid", "")
+ params.put("calcmanagefee", "T") //是否计算费率
+ params.put("timestamp", time)
+ params.put("sign_method", "HMAC");
+ params.put("limitflag", "off") //是否判断消费限额,on-判断;off-不判断。默认on(判断限额)。为空或不为off都是on;
+ var signstr = HmacUtil.createLinkString(HmacUtil.paraFilter(params))
+ var sign = HmacUtil.HMACSHA1(signstr, appkey)
+ signstr += "&sign=" + sign + "&sourcetype=food"
+ var c = Client.create ()
+ c.setConnectTimeout(20000)
+ var r = c.resource (orderurl)
+ var respClient = r.post(ClientResponse::class.java, signstr)
+ if (200 == respClient.status) {
+ var ret = respClient.getEntity(String::class.java)
+ if (ret != null) {
+ try {
+ lateinit var gson:Gson
+ var result = gson.fromJson(ret, SupYktResp::class.java)
+ if (result == null) {
+ code.retcode = "1"
+ code.retmsg = "返回内容为空"
+ callback(code)
+ return
+ }
+ if (!"0".equals(result.getRetcode())) {
+ if ("30".equals(result.getRetcode())) {
+ if (result.getOther() != null) {
+ try {
+ var supStatusRevResp = gson.fromJson (result.getOther(), SupStatusRevResp::class.java)
+ if (supStatusRevResp != null) {
+ //同流水号,同一笔已经支付完成的,不重复支付。
+ if (3 == supStatusRevResp.getStatus() && supStatusRevResp.getRevflag() != null && !supStatusRevResp.getRevflag()) {
+ code.retcode = "0"
+ code.retmsg = "成功"
+ callback(code)
+ return
+ }
+ }
+ } catch (e: Exception ) {
+ e.printStackTrace()
+ }
+ }
+ }
+ code.retcode = "1"
+ code.retmsg = "交易失败:" + result.getRetmsg()
+ callback(code)
+ return
+ }
+ code.retcode = "0"
+ code.retmsg = "成功"
+ callback(code)
+ return
+ } catch (e: Exception) {
+ e.printStackTrace()
+ }
+ }
+ }
+ code.retcode = "1"
+ code.retmsg = "请求失败"
+ callback(code)
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
index 6e17cef..8a5ac0a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/comsume_builder.kt
@@ -9,6 +9,7 @@
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.util.TradeDict
import com.supwisdom.dlpay.framework.util.TradeErrorCode
class AccountHolder<T> private constructor(val accountId: String, val idType: Int) {
@@ -74,6 +75,13 @@
var overdraft = false
var description = ""
+ /**
+ * 学工号,一卡通商户号 -- 第三方支付一卡通使用
+ * */
+ var stuempno = ""
+ var yktshopid = ""
+
+
// 内部参数,不需要调用者处理
val details = mutableListOf<TransDetail>()
var amount: Double = 0.0
@@ -95,6 +103,16 @@
return this
}
+ fun setStuempno(s:String):PersonTransBuilder{
+ this.stuempno = s
+ return this
+ }
+
+ fun setYktshopid(s:String):PersonTransBuilder{
+ this.yktshopid = s
+ return this
+ }
+
private fun prepareData() {
amount = 0.0
amount = this.details.sumByDouble { it.amount }
@@ -165,6 +183,15 @@
*/
fun done(paydtl: TUserdtl, status: String, service: PersonBalancePayService): TUserdtl {
TODO("finish")
+ prepareData()
+ when (status){
+ TradeDict.DTL_STATUS_INIT -> {
+ return service.init(this)
+ }
+ TradeDict.DTL_STATUS_WIP -> {
+ return service.wip(paydtl,this)
+ }
+ }
}
fun done(refno: String, status: String, service: PersonBalancePayService): TUserdtl {
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
index 7276c02..61ce9f5 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/controller/consume_service.kt
@@ -1,10 +1,15 @@
package com.supwisdom.dlpay.consume.controller
import com.supwisdom.dlpay.consume.AccountHolder
+import com.supwisdom.dlpay.consume.CallService
import com.supwisdom.dlpay.consume.PersonTransBuilder
+import com.supwisdom.dlpay.consume.domain.TUserdtl
import com.supwisdom.dlpay.consume.service.AccountUtilServcie
+import com.supwisdom.dlpay.consume.service.PaytypeService
import com.supwisdom.dlpay.consume.service.PersonBalancePayService
+import com.supwisdom.dlpay.framework.util.DateUtil
import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.util.PaytypeUtil
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.GetMapping
@@ -19,6 +24,9 @@
@Autowired
lateinit var personBalancePayService: PersonBalancePayService
+ @Autowired
+ lateinit var paytypeService: PaytypeService
+
@PostMapping("/account/pay")
fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
@@ -54,4 +62,35 @@
.done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService)
return ResponseEntity.ok(dtl)
}
+
+ @PostMapping("/ykt/payinit")
+ fun yktPayInit(userid: String, amount: Int, manageFee: Int, stuempno: String, yktshopid: String): ResponseEntity<Any> {
+ //一卡通支付款 112240
+ val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .setTransDatetime("20190411", "112311")
+ .setStuempno(stuempno)
+ .setYktshopid(yktshopid)
+ .addDetail(AccountHolder.subject("112240"),
+ AccountHolder.shop("12323"),
+ amount / 100.0, "")
+ .addDetail(AccountHolder.subject("112240"), AccountHolder.transType(301),
+ manageFee / 100.0, "")
+ .done(TUserdtl(), TradeDict.DTL_STATUS_INIT, personBalancePayService)
+ return ResponseEntity.ok(dtl)
+ }
+
+ @PostMapping("/ykt/payfinish")
+ fun yktPayFinish(refno: String): ResponseEntity<Any> {
+ //一卡通支付款 112240
+ val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .done(refno, TradeDict.DTL_STATUS_WIP, personBalancePayService)
+ CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY), dtl, DateUtil.getNow()) { code ->
+ if (code.retcode == "0") {
+ //TODO update dtl
+ var dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
+ .done(dtl.refno,TradeDict.DTL_STATUS_SUCCESS,personBalancePayService)
+ }
+ }
+ return ResponseEntity.ok(dtl)
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
index e2c848f..903da27 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/consume/service/impl/pay_service_impl.kt
@@ -2,6 +2,7 @@
import com.supwisdom.dlpay.consume.PersonTransBuilder
import com.supwisdom.dlpay.consume.dao.AccountDao
+import com.supwisdom.dlpay.consume.dao.TransdtlDao
import com.supwisdom.dlpay.consume.dao.UserdtlDao
import com.supwisdom.dlpay.consume.domain.TAccount
import com.supwisdom.dlpay.consume.domain.TUserdtl
@@ -11,6 +12,10 @@
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.DateUtil
+import com.supwisdom.dlpay.framework.util.TradeCode
+import com.supwisdom.dlpay.framework.util.TradeDict
import com.supwisdom.dlpay.framework.util.TradeErrorCode
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
@@ -54,6 +59,8 @@
class PersonBalancePayServiceImpl : PersonBalancePayService {
@Autowired
lateinit var userdtlDao: UserdtlDao
+ @Autowired
+ lateinit var systemUtilService: SystemUtilService
@Autowired
lateinit var accountDao: AccountDao
@@ -71,6 +78,15 @@
override fun init(builder: PersonTransBuilder): TUserdtl {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+ lateinit var userdtl: TUserdtl
+ var refno = systemUtilService.refno
+ var systemtime = systemUtilService.sysdatetime
+ userdtl.refno = refno
+ userdtl.amount = builder.amount
+ userdtl.createtime = systemtime.hostdatetime
+ userdtl.status = TradeDict.DTL_STATUS_INIT
+ userdtlDao.save(userdtl)
+ return userdtl
}
override fun wip(paydtl: TUserdtl, builder: PersonTransBuilder): TUserdtl {