From ddbb0f13dd21c442dc58d0e8db167271c9a7b235 Mon Sep 17 00:00:00 2001 From: qiaowei Date: Thu, 11 Apr 2019 17:43:26 +0800 Subject: [PATCH] =?utf8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E6=94=AF=E4=BB=98?= =?utf8?q?=EF=BC=9A=E4=B8=80=E5=8D=A1=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../dlpay/framework/util/TradeDict.java | 1 + .../supwisdom/dlpay/consume/ThirdPayCall.kt | 95 +++++++++++++++++++ .../dlpay/consume/comsume_builder.kt | 27 ++++++ .../consume/controller/consume_service.kt | 39 ++++++++ .../consume/service/impl/pay_service_impl.kt | 16 ++++ 5 files changed, 178 insertions(+) create mode 100644 src/main/kotlin/com/supwisdom/dlpay/consume/ThirdPayCall.kt 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 b570823e..8465572b 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 class TradeDict { 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 00000000..30703507 --- /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, 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() + 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 6e17cef3..8a5ac0ad 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.exception.TransactionCheckException 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 private constructor(val accountId: String, val idType: Int) { @@ -74,6 +75,13 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { var overdraft = false var description = "" + /** + * 学工号,一卡通商户号 -- 第三方支付一卡通使用 + * */ + var stuempno = "" + var yktshopid = "" + + // 内部参数,不需要调用者处理 val details = mutableListOf() var amount: Double = 0.0 @@ -95,6 +103,16 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { 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 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { */ 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 7276c022..61ce9f54 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 @@ class ConsumeController { @Autowired lateinit var personBalancePayService: PersonBalancePayService + @Autowired + lateinit var paytypeService: PaytypeService + @PostMapping("/account/pay") fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity { val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) @@ -54,4 +62,35 @@ class ConsumeController { .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 { + //一卡通支付款 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 { + //一卡通支付款 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 e2c848ff..903da272 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 @@ package com.supwisdom.dlpay.consume.service.impl 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.exception.TransactionProcessException 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 AccountUtilServcieImpl : AccountUtilServcie { class PersonBalancePayServiceImpl : PersonBalancePayService { @Autowired lateinit var userdtlDao: UserdtlDao + @Autowired + lateinit var systemUtilService: SystemUtilService @Autowired lateinit var accountDao: AccountDao @@ -71,6 +78,15 @@ class PersonBalancePayServiceImpl : PersonBalancePayService { 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 { -- 2.17.1