From: Xia Kaixiang Date: Wed, 8 May 2019 10:43:19 +0000 (+0800) Subject: 市民卡代扣逻辑 X-Git-Tag: 1.0.0^2~230 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=91172a1a58cb4566fc76250e441627c7c3830035;p=epayment%2Ffood_payapi.git 市民卡代扣逻辑 --- diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java index 26fe874d..6ee3e995 100644 --- a/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java +++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersonIdentityDao.java @@ -1,14 +1,10 @@ package com.supwisdom.dlpay.api.dao; import com.supwisdom.dlpay.api.domain.TPersonIdentity; -import com.supwisdom.dlpay.api.domain.TPersonIdentityPK; import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @Repository -public interface PersonIdentityDao extends JpaRepository { - @Query(value = "from TPersonIdentity t where t.thirdUserid=:thirdUserid and t.thirdSyscode=:thirdSyscode ") - TPersonIdentity getPersonIdentityById(@Param("thirdUserid") String thirdUserid, @Param("thirdSyscode") String thirdSyscode); +public interface PersonIdentityDao extends JpaRepository { + TPersonIdentity getByThirdUid(String thirdUid); } 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 4eb11963..72181db6 100644 --- a/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java +++ b/src/main/java/com/supwisdom/dlpay/api/dao/UserdtlDao.java @@ -22,4 +22,9 @@ public interface UserdtlDao extends JpaRepository { @QueryHints({@QueryHint(name = "javax.persistence.lock.timeout", value ="0")}) @Query("select dtl from TUserdtl dtl where dtl.refno = ?1") TUserdtl findByRefnoForUpdateNowait(String refno); + + @Lock(LockModeType.PESSIMISTIC_WRITE) + @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); } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java index 73a8126a..1125f8e9 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentity.java @@ -4,43 +4,45 @@ import javax.persistence.*; @Entity @Table(name = "TB_PERSON_IDENTITY") -@IdClass(TPersonIdentityPK.class) public class TPersonIdentity { @Id - @Column(name = "THIRD_USERID", nullable = false, length = 60) - private String thirdUserid; - - @Id - @Column(name = "THIRD_SYSCODE", nullable = false, length = 20) - private String thirdSyscode; + @Column(name = "THIRD_UID", nullable = false, length = 60) + private String thirdUid; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "USERID") private TPerson person; //绑定的系统用户 - public TPersonIdentity() { - } + @Column(name = "STATUS", nullable = false, length = 20) + private String status; - public TPersonIdentity(String thirdUserid, String thirdSyscode, TPerson person) { - this.thirdUserid = thirdUserid; - this.thirdSyscode = thirdSyscode; - this.person = person; - } + @Column(name = "LOSSFLAG",nullable = false, precision = 1) + private Integer lossflag=0; + + @Column(name = "LOCKFLAG", nullable = false, precision = 1) + private Integer lockflag=0; - public String getThirdUserid() { - return thirdUserid; + @Column(name = "CREATETIME", length = 14) + private String createtime; + + public TPersonIdentity() { } - public void setThirdUserid(String thirdUserid) { - this.thirdUserid = thirdUserid; + public TPersonIdentity(String thirdUid, TPerson person, String status, Integer lossflag, Integer lockflag, String createtime) { + this.thirdUid = thirdUid; + this.person = person; + this.status = status; + this.lossflag = lossflag; + this.lockflag = lockflag; + this.createtime = createtime; } - public String getThirdSyscode() { - return thirdSyscode; + public String getThirdUid() { + return thirdUid; } - public void setThirdSyscode(String thirdSyscode) { - this.thirdSyscode = thirdSyscode; + public void setThirdUid(String thirdUid) { + this.thirdUid = thirdUid; } public TPerson getPerson() { @@ -50,4 +52,37 @@ public class TPersonIdentity { public void setPerson(TPerson person) { this.person = person; } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public Integer getLossflag() { + return lossflag; + } + + public void setLossflag(Integer lossflag) { + this.lossflag = lossflag; + } + + public Integer getLockflag() { + return lockflag; + } + + public void setLockflag(Integer lockflag) { + this.lockflag = lockflag; + } + + public String getCreatetime() { + return createtime; + } + + public void setCreatetime(String createtime) { + this.createtime = createtime; + } + } diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java deleted file mode 100644 index 8ce1bfb4..00000000 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TPersonIdentityPK.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.supwisdom.dlpay.api.domain; - -import javax.persistence.Column; -import javax.persistence.Embeddable; -import javax.persistence.Id; -import java.io.Serializable; - -@Embeddable -public class TPersonIdentityPK implements Serializable { - @Id - @Column(name="THIRD_USERID", nullable = false, length = 60) - private String thirdUserid; - - @Id - @Column(name="THIRD_SYSCODE", nullable = false, length = 20) - private String thirdSyscode; - - public TPersonIdentityPK() { - } - - public TPersonIdentityPK(String thirdUserid, String thirdSyscode) { - this.thirdUserid = thirdUserid; - this.thirdSyscode = thirdSyscode; - } - - public String getThirdUserid() { - return thirdUserid; - } - - public void setThirdUserid(String thirdUserid) { - this.thirdUserid = thirdUserid; - } - - public String getThirdSyscode() { - return thirdSyscode; - } - - public void setThirdSyscode(String thirdSyscode) { - this.thirdSyscode = thirdSyscode; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - TPersonIdentityPK tPersonIdentityPK = (TPersonIdentityPK) o; - if (thirdUserid != null ? !thirdUserid.equals(tPersonIdentityPK.getThirdUserid()) : thirdUserid != null) - return false; - if (thirdSyscode != null ? !thirdSyscode.equals(tPersonIdentityPK.getThirdSyscode()) : thirdSyscode != null) - return false; - - return true; - } - - @Override - public int hashCode() { - int result = thirdUserid != null ? thirdUserid.hashCode() : 0; - result = 31 * result + (thirdSyscode != null ? thirdSyscode.hashCode() : 0); - return result; - } -} diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java index 806c430e..fc89e320 100644 --- a/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java +++ b/src/main/java/com/supwisdom/dlpay/api/domain/TUserdtl.java @@ -52,7 +52,8 @@ public class TUserdtl { @Column(name = "OUTTRADENO", length = 60) private String outtradeno; //第三方流水号 - + @Column(name = "SHOPACCNO", length = 20) + private String shopaccno; @Column(name = "OPERID", precision = 9) private Integer operid; //操作员ID @@ -187,6 +188,14 @@ public class TUserdtl { this.outtradeno = outtradeno; } + public String getShopaccno() { + return shopaccno; + } + + public void setShopaccno(String shopaccno) { + this.shopaccno = shopaccno; + } + public Integer getOperid() { return operid; } diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java index 43903684..e5ca834d 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java +++ b/src/main/java/com/supwisdom/dlpay/framework/dao/ApiClientDao.java @@ -4,4 +4,5 @@ import com.supwisdom.dlpay.framework.domain.TApiClient; import org.springframework.data.repository.CrudRepository; public interface ApiClientDao extends CrudRepository { + TApiClient findByAppid(String appid); } diff --git a/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java new file mode 100644 index 00000000..b626087d --- /dev/null +++ b/src/main/java/com/supwisdom/dlpay/framework/dao/FeetypeConfigDao.java @@ -0,0 +1,13 @@ +package com.supwisdom.dlpay.framework.dao; + +import com.supwisdom.dlpay.framework.domain.TFeetypeConfig; +import com.supwisdom.dlpay.framework.domain.TFeetypeConfigPK; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +@Repository +public interface FeetypeConfigDao extends JpaRepository { + @Query("select a from TFeetypeConfig a where a.feetype=?1 and a.paytype=?2 ") + TFeetypeConfig getById(String feetype, String paytype); +} diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java index 8afbaaa9..4a46b289 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/Subject.java @@ -68,6 +68,11 @@ public class Subject { */ public static final String SUBJNO_PAY_YKT = "112233"; + /** + * 应收账款 - 市民卡支付款 + */ + public static final String SUBJNO_PAY_CITIZEN_CARD = "112234"; + //======================= 负债类 =====================// 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 c4dde6e2..5c51c26a 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java @@ -4,7 +4,7 @@ package com.supwisdom.dlpay.framework.util; * 交易码、交易类型 * */ public class TradeCode { - public static final int TRANSCODE_PAY = 6630; + public static final int TRANSCODE_PAY = 3000; public static final int TRANSCODE_YKTPAY=1000; public static final int TRANSCODE_WECHAT=1001; 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 6b458362..2b392b32 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java @@ -44,6 +44,9 @@ public class TradeDict { */ public static final String PAYTYPE_CASH = "cash"; public static final String PAYTYPE_BALANCE = "balance"; + public static final String PAYTYPE_ALIPAY = "alipay"; //市民卡 + public static final String PAYTYPE_WECHAT = "wechat"; //市民卡 + public static final String PAYTYPE_CITIZEN_CARD = "citizenCard"; //市民卡 /** 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 7ef7051d..a8139c9e 100644 --- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java +++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java @@ -84,6 +84,20 @@ public class TradeErrorCode { * */ public static final int LOCK_READ_TIMEOUT = 10015; + /** + * 卡已挂失 + * */ + public static final int ACCOUNT_IS_LOSS = 10016; + + /** + * 卡已锁定 + * */ + public static final int ACCOUNT_IS_LOCKED = 10017; + + /** + * 费用类别未定义 + * */ + public static final int FEETYPE_NOT_EXISTS = 10018; /** * 请求参数错误 @@ -107,5 +121,8 @@ public class TradeErrorCode { public static final int BUSINESS_SHOP_EXISTS = 30001; //商户已经存在 + public static final int BUSINESS_APPID_NOTFOUND = 30002; //APPID没找到 + + public static final int BUSINESS_PAYTYPE_NOSUPPORT = 30003; //支付方式不支持 } diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java index 13af83c6..1bf5ac26 100644 --- a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java +++ b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java @@ -21,4 +21,9 @@ public class ConstantUtil { public static final int SHOPTYPE_GROUP = 0; //商户组 public static final int SHOPTYPE_LEAF = 1; //末级商户,独立核算商户 + + public static final String FEETYPE_DEFAULT = "none"; + public static final String FEETYPE_MEALER = "mealer"; + public static final String FEETYPE_DISCOUNT = "discount"; + public static final String[] FEETYPE_DICTS = {"none", "mealer", "discount"}; //联动 } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt index 2b3b6eef..d02ba577 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt @@ -11,9 +11,15 @@ import com.supwisdom.dlpay.api.domain.TUserdtl import com.supwisdom.dlpay.framework.util.* import com.supwisdom.dlpay.util.Code -/** - * Created by shuwei on 2019/4/11. - */ +class CallBackResp { + var retcode: String = "99" + var retmsg: String? = null + val data = mutableMapOf() + fun add(key: String, value: String) { + this.data.plus(mapOf(key to value)) + } +} + class CallService { companion object { @@ -227,5 +233,11 @@ class CallService { } } } + + fun CallCitizenCardPay(config: Map, paydtl: TUserdtl): CallBackResp { + val resp = CallBackResp() + // TODO: 代扣逻辑 + return resp + } } } \ No newline at end of file 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 d1f8c99b..90871495 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 @@ -8,7 +8,7 @@ import com.supwisdom.dlpay.framework.util.TradeErrorCode import com.supwisdom.dlpay.util.ConstantUtil open class APIRequestParam { - open val param_map = mutableMapOf() + open val param_map = mutableMapOf() open fun checkSign(key: String): Boolean { val sign = param_map["sign"] @@ -26,11 +26,9 @@ open class APIRequestParam { } - // ============================ USER ============================ // class OpenUserParam : APIRequestParam() { - var syscode: String = "" //必传 - var uid: String = "" //必传 + var uid: String = "" //第三方用户ID,必传 var name: String = "" //必传 var sex: String? = null var idtype: String = "" //必传 @@ -44,7 +42,6 @@ class OpenUserParam : APIRequestParam() { var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") if (StringUtil.isEmpty(name)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "姓名不能为空") if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]") @@ -54,29 +51,26 @@ class OpenUserParam : APIRequestParam() { if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误") if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误") - param_map.plus(mapOf("syscode" to syscode, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) return true } } class QueryUserParam : APIRequestParam() { - var syscode: String = "" //必传 var userid: String? = null // 用户ID二选一 (两者都传取userid) var uid: String? = null // 用户ID二选一 var sign: String = "" //必传 var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") - param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("userid" to userid, "uid" to uid, "sign" to sign, "sign_type" to sign_type)) return true } } class ModifyUserParam : APIRequestParam() { - var syscode: String = "" //必传 var userid: String? = null // 用户ID二选一 (两者都传取userid) var uid: String? = null // 用户ID二选一 var name: String? = null @@ -92,7 +86,6 @@ class ModifyUserParam : APIRequestParam() { var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空") if (!StringUtil.isEmpty(sex) && ConstantUtil.SEX_MALE != sex && ConstantUtil.SEX_FEMALE != sex) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "性别非法[male|female]") if (!StringUtil.isEmpty(idtype) && !ConstantUtil.IDTYPE_DICTS.contains(idtype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "证件类型非法") @@ -103,16 +96,14 @@ class ModifyUserParam : APIRequestParam() { if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误") - param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("userid" to userid, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) return true } } - // ============================ SHOP ============================ // class OpenShopParam : APIRequestParam() { - var syscode: String = "" //必传 var shopUniqueId: String = "" //必传 var shoptype: Int = 1 var fshopid: Int? = null @@ -128,7 +119,6 @@ class OpenShopParam : APIRequestParam() { var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(shopUniqueId)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一号不能为空") if (ConstantUtil.SHOPTYPE_GROUP != shoptype && ConstantUtil.SHOPTYPE_LEAF != shoptype) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定商户类型") if (StringUtil.isEmpty(shopname)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户名称不能为空") @@ -138,13 +128,12 @@ class OpenShopParam : APIRequestParam() { if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误") if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误") - param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type)) return true } } class QueryShopParam : APIRequestParam() { - var syscode: String = "" //必传 var shopid: Int? = null //注册时返回的shopid var shopaccno: String? = null //注册时返回的shopaccno var shopUniqueId: String? = null //注册传的商户唯一号 @@ -152,39 +141,69 @@ class QueryShopParam : APIRequestParam() { var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一标志不能为空") - param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type)) return true } } // ============================ CONSUME ============================ // -class BankcardPayinitParam : APIRequestParam() { - var syscode: String = "" //必传 +class ConsumeFeetype { + var feetype: String = "" + var amount: Int = 0 +} + +class QueryDtlResultParam : APIRequestParam() { + var refno:String?=null //二选一 + var billno:String?=null //二选一 (billno+shopaccno) ä¼ billno时,shopaccno必传 + var shopaccno: String?=null + var sign: String = "" //必传 + var sign_type: String? = null + + fun checkParam(): Boolean { + if (StringUtil.isEmpty(refno) && (StringUtil.isEmpty(billno) || StringUtil.isEmpty(shopaccno))) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "流水唯一号不能为空") + + param_map.plus(mapOf("refno" to refno, "billno" to billno, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type)) + return true + } +} + +class CitizenCardPayinitParam : APIRequestParam() { var cardNo: String = "" //必传 - var amount: Int = 0 //必传 var shopaccno: String = "" //必传 - var paytype: String ="" //必传 - var billno: String ="" //必传 - var transdate: String="" //必传 - var transtime: String="" //必传 + var amount: Int = 0 //必传 + var feelist: List? = null// 的json字符串 + var billno: String = "" //必传 + var transdate: String = "" //必传 + var transtime: String = "" //必传 + var extend_data: String? = null //扩展参数,原样返回 var sign: String = "" //必传 var sign_type: String? = null fun checkParam(): Boolean { - if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空") if (StringUtil.isEmpty(cardNo)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "卡唯一号不能为空") + if (StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户") if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零") - if(StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户") - if(StringUtil.isEmpty(paytype)) 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(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]") + + param_map.plus(mapOf("cardNo" to cardNo, "amount" to amount, "feelist" to feelist, "shopaccno" to shopaccno, "billno" to billno, "transdate" to transdate, "transtime" to transtime, "sign" to sign, "sign_type" to sign_type)) + return true + } +} + +class CitizenCardPayfinishParam : APIRequestParam() { + var refno:String="" + var sign: String = "" //必传 + var sign_type: String? = null + + fun checkParam(): Boolean { + if (StringUtil.isEmpty(refno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易参考号不能为空") - param_map.plus(mapOf("syscode" to syscode, "cardNo" to cardNo, "amount" to amount, "shopaccno" to shopaccno,"paytype" to paytype,"billno" to billno,"transdate" to transdate,"transtime" to transtime, "sign" to sign, "sign_type" to sign_type)) + param_map.plus(mapOf("refno" to refno, "sign" to sign, "sign_type" to sign_type)) 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 4ba03d4e..94e5a08a 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/comsume_builder.kt @@ -6,9 +6,9 @@ import com.supwisdom.dlpay.api.domain.TUserdtl import com.supwisdom.dlpay.api.service.AccountUtilServcie import com.supwisdom.dlpay.api.service.PersonBalancePayService import com.supwisdom.dlpay.exception.TransactionCheckException +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.util.* class AccountHolder private constructor(val accountId: String, val idType: Int) { @@ -16,7 +16,7 @@ class AccountHolder private constructor(val accountId: String, val idType: In const val IDTYPE_PERSON = 1 const val IDTYPE_SHOP = 2 const val IDTYPE_SUBJECT = 3 - const val IDTYPE_TRANSTYPE = 4 + const val IDTYPE_FEETYPE = 4 fun person(userid: String): AccountHolder { return AccountHolder(userid, IDTYPE_PERSON) @@ -30,8 +30,8 @@ class AccountHolder private constructor(val accountId: String, val idType: In return AccountHolder(subjNo, IDTYPE_SUBJECT) } - fun transType(transType: Int): AccountHolder { - return AccountHolder("$transType", IDTYPE_TRANSTYPE) + fun feetype(feetype: String, paytype: String): AccountHolder { + return AccountHolder("$feetype@$paytype", IDTYPE_FEETYPE) } } @@ -52,7 +52,7 @@ class AccountHolder private constructor(val accountId: String, val idType: In IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId) IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt()) IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId) - IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt()) + IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1]) else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>") } as T } @@ -63,7 +63,7 @@ class AccountHolder private constructor(val accountId: String, val idType: In IDTYPE_PERSON -> builder.accountUtil.readAccountForUpdateNowait(accountId) IDTYPE_SHOP -> builder.accountUtil.readShopAcc(accountId.toInt()) IDTYPE_SUBJECT -> builder.accountUtil.readSubject(accountId) - IDTYPE_TRANSTYPE -> builder.accountUtil.readTranstype(accountId.toInt()) + IDTYPE_FEETYPE -> builder.accountUtil.readFeetype(accountId.split("@")[0], accountId.split("@")[1]) else -> throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "账户类型未知type<$idType>") } as T } @@ -83,6 +83,9 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { // 以下为输入参数,调用接口时指定的参数值 lateinit var person: TPerson lateinit var tradetype: Tradetype + lateinit var refno: String + lateinit var status: String + val resultMap = mutableMapOf() //存调第三方结果数据 var transcode = 0 @@ -158,8 +161,18 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { return this } - fun setTradeno(outtradeno: String): PersonTransBuilder { - this.outtradeno = outtradeno + fun setRefno(refno: String): PersonTransBuilder { + this.refno = refno + return this + } + + fun addResult(key: String, value: String): PersonTransBuilder { + this.resultMap.plus(mapOf(key to value)) + return this + } + + fun addResult(param: Map): PersonTransBuilder { + this.resultMap.plus(param) return this } @@ -276,10 +289,10 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { return this } - fun addDetail(accountHolder: AccountHolder, + fun addDetail(accountHolder: AccountHolder, amount: Double): PersonTransBuilder { accountHolder.builder = this - val transtype = accountHolder.get() + val transtype = accountHolder.get() var debitAccNo = "" var debitSubjNo = "" @@ -301,11 +314,11 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { if (debitAccNo.isEmpty()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "交易配置<${transtype.transtype}> 借方账号配置错误") + "交易配置<${transtype.feetype}@${transtype.paytype}> 借方账号配置错误") } if (creditAccNo.isEmpty()) { throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, - "交易配置<${transtype.transtype}> 贷方账号配置错误") + "交易配置<${transtype.feetype}@${transtype.paytype}> 贷方账号配置错误") } this.details.add(TransDetail(debitAccNo, debitSubjNo, creditAccNo, creditSubjNo, amount, transtype.summary, this.details.size + 1)) @@ -313,32 +326,37 @@ class PersonTransBuilder private constructor(accUitl: AccountUtilServcie) { } /** - * 单步交易,一次完成交易记账过程 - * @param service - * @param isFinished - true : 完成交易过程,扣除账户余额; false - 完成检查 + * 一步交易完成 */ - fun done(service: PersonBalancePayService, isFinished: Boolean): TUserdtl { + fun done(service: PersonBalancePayService): TUserdtl { prepareData() preCheckAccount() - return when (isFinished) { - true -> service.process(this) - false -> service.init(this) - } + return service.process(this) } - /** - * 两步交易,在 paydtl 基础完成确认过程 - * @param paydtl - * @param status - 完成交易状态,见 TradeDict.DTL_STATUS_FAIL - */ - fun done(paydtl: TUserdtl, status: String, service: PersonBalancePayService): TUserdtl { - return service.finish(paydtl, status, null) + fun init(service: PersonBalancePayService) : TUserdtl{ + prepareData() + preCheckAccount() + return service.init(this) } - fun done(refno: String, status: String, service: PersonBalancePayService): TUserdtl { - return service.finish(refno, status, null) + fun wip(service: PersonBalancePayService): TUserdtl { + if (null == this.refno) + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号未指定") + return service.wip(this) } - fun done(refno: String, status: String, businessData: Map?,service: PersonBalancePayService): TUserdtl { - return service.finish(refno, status, businessData) + + fun finish(service: PersonBalancePayService, status: String): TUserdtl { + if (null == this.refno) + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号未指定") + this.status = status + return service.finish(this) + } + + fun success(service: PersonBalancePayService): TUserdtl{ + if (null == this.refno) + throw TransactionCheckException(TradeErrorCode.INPUT_DATA_ERROR, "交易参考号未指定") + this.status = TradeDict.DTL_STATUS_SUCCESS + return service.finish(this) } } \ No newline at end of file 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 3717a2b8..debf0e59 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 @@ -3,11 +3,14 @@ package com.supwisdom.dlpay.api.controller import com.supwisdom.dlpay.api.AccountHolder import com.supwisdom.dlpay.api.CallService import com.supwisdom.dlpay.api.PersonTransBuilder -import com.supwisdom.dlpay.api.bean.BankcardPayinitParam +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.service.* import com.supwisdom.dlpay.exception.RequestParamCheckException import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.ResponseBodyBuilder +import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.service.SystemUtilService import com.supwisdom.dlpay.framework.util.* import com.supwisdom.dlpay.util.ConstantUtil @@ -15,6 +18,8 @@ import com.supwisdom.dlpay.util.PaytypeUtil import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse @RestController @RequestMapping("/api/consume") @@ -31,228 +36,352 @@ class ConsumeController { lateinit var systemUtilService: SystemUtilService @Autowired lateinit var consumePayService: ConsumePayService + @Autowired + lateinit var commonService: CommonService - @PostMapping("/bankcard/payinit") - fun bankcardPayinit(@RequestBody request: BankcardPayinitParam): ResponseEntity { - return try{ - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + /** + * 流水结果查询统一接口 + * */ + fun queryDtlResult(@RequestBody param: QueryDtlResultParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { + return try { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - if (!consumePayService.checkShopPaytype(request.shopaccno, request.paytype)) { - ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.INPUT_DATA_ERROR, "支付方式不支持")) - } - - - - - + val dtl = if (StringUtil.isEmpty(param.refno)) { + personBalancePayService.getUserdtlForUpdateNowait(param.refno!!) + } else { + personBalancePayService.getUserdtlByBillnoForUpdateNowait(param.billno!!, param.shopaccno!!) + } + val person = dtl.userid?.let { userService.findPersonByUserid(dtl.userid) } ResponseEntity.ok(ResponseBodyBuilder.create() - .data("refno","") - .success("交易初始化成功")) - }catch (ex: RequestParamCheckException) { + .data("refno", dtl.refno) + .data("amount", dtl.amount) + .data("paytype", dtl.paytype) + .data("payinfo", dtl.payinfo) + .also { + if (null != person) { + it.data("name", person.name) + } + } + .success("查询成功")) + + } catch (ex: RequestParamCheckException) { ResponseEntity.ok(ResponseBodyBuilder.create() .requestException(ex, "请求参数错误")) } catch (et: TransactionException) { ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(et, "业务处理错误")) + .transException(et, "查询错误")) } } - - - -// ============================================== // - - @PostMapping("/account/pay") - fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity { - val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) - .setTransDatetime("20190411", "112311") - .enableOverdraft(false) - .addDetail(AccountHolder.person(userid), - AccountHolder.shop("12323"), - amount / 100.0, "") - .addDetail(AccountHolder.person(userid), AccountHolder.transType(301), - manageFee / 100.0, "") - .done(personBalancePayService, true) - return ResponseEntity.ok(dtl) - } - - @GetMapping("/account/payinit") - fun accountPayInit(userid: String, amount: Int, manageFee: Int): ResponseEntity { - val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) - .setTransDatetime("20190411", "112311") - .enableOverdraft(false) - .addDetail(AccountHolder.person(userid), - AccountHolder.shop("12323"), - amount / 100.0, "") - .addDetail(AccountHolder.person(userid), AccountHolder.transType(301), - manageFee / 100.0, "") - .done(personBalancePayService, false) - - return ResponseEntity.ok(dtl) - } - - @GetMapping("/account/payfinish") - fun accountPayFinish(refno: String): ResponseEntity { - val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) - .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService) - return ResponseEntity.ok(dtl) - } - - @PostMapping("/ykt/payinit") - fun yktPayInit(userid: String, amount: Int, manageFee: Int, - stuempno: String, shopid: String, transdate: String, transtime: String, - outtradeno: String, payinfo: String, feetype: String): ResponseEntity { - //一卡通支付款 112240 + /** + * 市民卡交易初始化 + * */ + @PostMapping("/citizencard/payinit") + fun citizencardPayinit(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - val paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY) - if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(1, "支付方式未开启")) + .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - val person = userService.findByThirdUniqueIdenty(stuempno,"") + + val person = userService.findPersonByIdentityCheckStatus(param.cardNo) val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) - .setTransDatetime(transdate, transtime) - .selectPaytype(PaytypeUtil.YKTPAY, payinfo) - .setOuttradeno(outtradeno) - .also { - if (null != person) it.setOwner(person) - } - .tryLock(true) - .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付") - .chooseTradetype(Tradetype.CONSUME) - .also { - when (feetype) { - TradeDict.FEETYPE_CONSUME_MEALER -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), - AccountHolder.shop(shopid), - amount / 100.0, "一卡通支付") - .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE) - .with(AccountHolder.shop(shopid)), - manageFee / 100.0) - } - TradeDict.FEETYPE_CONSUME_DISCOUNT -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), - AccountHolder.shop(shopid), - (amount - manageFee) / 100.0, "一卡通支付") - .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT), - AccountHolder.shop(shopid), - manageFee / 100.0, "优惠折扣") - } - else -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), - AccountHolder.shop(shopid), - amount / 100.0, "一卡通支付") - } + .chooseTradetype(Tradetype.CONSUME) //消费 + .setOwner(person) //记名 + .setTransinfo(TradeCode.TRANSCODE_PAY, "支付交易") + .setTransDatetime(param.transdate, param.transtime) //交易时间 + .selectPaytype(TradeDict.PAYTYPE_CITIZEN_CARD, param.cardNo) + .addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD), + AccountHolder.shop(param.shopaccno), + param.amount / 100.0, "市民卡代扣消费") + .also { builder -> + param.feelist?.forEach { + builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_CITIZEN_CARD) + .with(AccountHolder.shop(param.shopaccno)) + .with(AccountHolder.subject(Subject.SUBJNO_PAY_CITIZEN_CARD)) + , it.amount / 100.0) } - }.done(personBalancePayService, false) + } + .init(personBalancePayService) + ResponseEntity.ok(ResponseBodyBuilder.create() .data("refno", dtl.refno) - .success()) - } catch (e: TransactionException) { + .data("amount", dtl.amount) + .success("交易初始化成功")) + + } catch (ex: RequestParamCheckException) { ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(e, "交易初始化异常")) + .requestException(ex, "请求参数错误")) + } catch (et: TransactionException) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .transException(et, "业务处理错误")) } } - @PostMapping("/ykt/payfinish") - fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity { + /** + * 市民卡交易确认 + * */ + @PostMapping("/citizencard/payfinish") + fun citizencardPayinit(@RequestBody param: CitizenCardPayfinishParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { 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 (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) + } + + var dtl = PersonTransBuilder.newBuilder(accountUtilServcie) + .setRefno(param.refno) + .wip(personBalancePayService) + val code = CallService.CallCitizenCardPay(consumePayService.getPaytypeConfig(TradeDict.PAYTYPE_CITIZEN_CARD, "shopaccno"), dtl) if (code.retcode == "0") { - PersonTransBuilder.newBuilder(accountUtilServcie) - .done(dtl.refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService) + dtl = PersonTransBuilder.newBuilder(accountUtilServcie) + .setRefno(param.refno) + .addResult(code.data) + .success(personBalancePayService) //流水置成功 + ResponseEntity.ok(ResponseBodyBuilder.create() .data("refno", dtl.refno) + .data("billno", dtl.outtradeno) .success()) } else { PersonTransBuilder.newBuilder(accountUtilServcie) - .done(dtl.refno, TradeDict.DTL_STATUS_FAIL, personBalancePayService) + .setRefno(param.refno) + .addResult("errmsg", code.retmsg!!) + .finish(personBalancePayService, TradeDict.DTL_STATUS_FAIL) //流水置成功 + ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}")) + .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易扣费失败-${code.retmsg}")) } - } catch (e: TransactionException) { + + } catch (ex: RequestParamCheckException) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .requestException(ex, "请求参数错误")) + } catch (et: TransactionException) { ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(e, "交易确认失败")) + .transException(et, "业务处理错误")) } } - /** - * 微信支付 - * wechattype - * qrcode-扫微信二维码支付 - * app-原生app微信支付 - * mp-微信公众号支付 - * h5-微信h5支付 - * - * */ - @PostMapping("/wechat/payinit") - fun wechatPayInit(userid: String, amount: Int, manageFee: Int, - stuempno: String, shopid: String, transdate: String, transtime: String, - outtradeno: String, payinfo: String, feetype: String, - wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity { + @PostMapping("/balance/pay") + fun balancePay(@RequestBody param: CitizenCardPayinitParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - val paytype = paytypeService.getByPaytype(PaytypeUtil.WECHAT) - if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(1, "支付方式未开启")) + .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - val person = userService.findByThirdUniqueIdenty(stuempno,"") + + val person = userService.findPersonByIdentityCheckStatus(param.cardNo) val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) - .setTransDatetime(transdate, transtime) - .selectPaytype(PaytypeUtil.WECHAT, payinfo) - .setOuttradeno(outtradeno) - .also { - if (null != person) it.setOwner(person) - } - .tryLock(true) - .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付") - .chooseTradetype(Tradetype.CONSUME) - .also { - when (feetype) { - TradeDict.FEETYPE_CONSUME_MEALER -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), - AccountHolder.shop(shopid), - amount / 100.0, "微信支付") - .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE) - .with(AccountHolder.shop(shopid)), - manageFee / 100.0) - } - TradeDict.FEETYPE_CONSUME_DISCOUNT -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), - AccountHolder.shop(shopid), - (amount - manageFee) / 100.0, "微信支付") - .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT), - AccountHolder.shop(shopid), - manageFee / 100.0, "优惠折扣") - } - else -> { - it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), - AccountHolder.shop(shopid), - amount / 100.0, "微信支付") - } + .chooseTradetype(Tradetype.CONSUME) //消费 + .setOwner(person) //记名 + .setTransinfo(TradeCode.TRANSCODE_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 { + builder.addDetail(AccountHolder.feetype(it.feetype, TradeDict.PAYTYPE_BALANCE) + .with(AccountHolder.shop(param.shopaccno)) + .with(AccountHolder.person(person.userid)) + , it.amount / 100.0) } - }.done(personBalancePayService, false) - val code = CallService.callWechatPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT), - dtl, DateUtil.getNow(), wechattype, realip, qrcode, openid) - if (code.retcode == "0") { - ResponseEntity.ok(ResponseBodyBuilder.create() - .data("refno", dtl.refno) - .success()) - } else { - ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}")) - } - } catch (e: TransactionException) { + } + .done(personBalancePayService) + + ResponseEntity.ok(ResponseBodyBuilder.create() + .data("refno", dtl.refno) + .data("amount", dtl.amount) + .success("交易成功")) + + } catch (ex: RequestParamCheckException) { + ResponseEntity.ok(ResponseBodyBuilder.create() + .requestException(ex, "请求参数错误")) + } catch (et: TransactionException) { ResponseEntity.ok(ResponseBodyBuilder.create() - .transException(e, "交易初始化异常")) + .transException(et, "业务处理错误")) } } + +// ============================================== // +// +// @GetMapping("/account/payinit") +// fun accountPayInit(userid: String, amount: Int, manageFee: Int): ResponseEntity { +// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) +// .setTransDatetime("20190411", "112311") +// .enableOverdraft(false) +// .addDetail(AccountHolder.person(userid), +// AccountHolder.shop("12323"), +// amount / 100.0, "") +// .addDetail(AccountHolder.person(userid), AccountHolder.transType(301), +// manageFee / 100.0, "") +// .done(personBalancePayService, false) +// +// return ResponseEntity.ok(dtl) +// } +// +// @GetMapping("/account/payfinish") +// fun accountPayFinish(refno: String): ResponseEntity { +// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) +// .done(refno, TradeDict.DTL_STATUS_SUCCESS, personBalancePayService) +// return ResponseEntity.ok(dtl) +// } +// +// @PostMapping("/ykt/payinit") +// fun yktPayInit(userid: String, amount: Int, manageFee: Int, +// stuempno: String, shopid: String, transdate: String, transtime: String, +// outtradeno: String, payinfo: String, feetype: String): ResponseEntity { +// //一卡通支付款 112240 +// return try { +// val paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY) +// if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .fail(1, "支付方式未开启")) +// } +// val person = userService.findByThirdUniqueIdenty(stuempno) +// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) +// .setTransDatetime(transdate, transtime) +// .selectPaytype(PaytypeUtil.YKTPAY, payinfo) +// .setOuttradeno(outtradeno) +// .also { +// if (null != person) it.setOwner(person) +// } +// .tryLock(true) +// .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付") +// .chooseTradetype(Tradetype.CONSUME) +// .also { +// when (feetype) { +// TradeDict.FEETYPE_CONSUME_MEALER -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), +// AccountHolder.shop(shopid), +// amount / 100.0, "一卡通支付") +// .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE) +// .with(AccountHolder.shop(shopid)), +// manageFee / 100.0) +// } +// TradeDict.FEETYPE_CONSUME_DISCOUNT -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), +// AccountHolder.shop(shopid), +// (amount - manageFee) / 100.0, "一卡通支付") +// .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT), +// AccountHolder.shop(shopid), +// manageFee / 100.0, "优惠折扣") +// } +// else -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_YKT), +// AccountHolder.shop(shopid), +// amount / 100.0, "一卡通支付") +// } +// } +// }.done(personBalancePayService, false) +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .data("refno", dtl.refno) +// .success()) +// } catch (e: TransactionException) { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .transException(e, "交易初始化异常")) +// } +// } +// +// @PostMapping("/ykt/payfinish") +// fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity { +// 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, "交易确认失败")) +// } +// } +// +// /** +// * 微信支付 +// * wechattype +// * qrcode-扫微信二维码支付 +// * app-原生app微信支付 +// * mp-微信公众号支付 +// * h5-微信h5支付 +// * +// * */ +// @PostMapping("/wechat/payinit") +// fun wechatPayInit(userid: String, amount: Int, manageFee: Int, +// stuempno: String, shopid: String, transdate: String, transtime: String, +// outtradeno: String, payinfo: String, feetype: String, +// wechattype: String, realip: String?, qrcode: String?, openid: String?): ResponseEntity { +// return try { +// val paytype = paytypeService.getByPaytype(PaytypeUtil.WECHAT) +// if (paytype == null || ConstantUtil.ENABLE_YES != paytype.enable) { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .fail(1, "支付方式未开启")) +// } +// val person = userService.findByThirdUniqueIdenty(stuempno) +// val dtl = PersonTransBuilder.newBuilder(accountUtilServcie) +// .setTransDatetime(transdate, transtime) +// .selectPaytype(PaytypeUtil.WECHAT, payinfo) +// .setOuttradeno(outtradeno) +// .also { +// if (null != person) it.setOwner(person) +// } +// .tryLock(true) +// .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付") +// .chooseTradetype(Tradetype.CONSUME) +// .also { +// when (feetype) { +// TradeDict.FEETYPE_CONSUME_MEALER -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), +// AccountHolder.shop(shopid), +// amount / 100.0, "微信支付") +// .addDetail(AccountHolder.transType(TranstypeCode.TT_CONSUUME_MANAGE_FEE) +// .with(AccountHolder.shop(shopid)), +// manageFee / 100.0) +// } +// TradeDict.FEETYPE_CONSUME_DISCOUNT -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), +// AccountHolder.shop(shopid), +// (amount - manageFee) / 100.0, "微信支付") +// .addDetail(AccountHolder.subject(Subject.SUBJNO_CONSUME_DISCOUNT), +// AccountHolder.shop(shopid), +// manageFee / 100.0, "优惠折扣") +// } +// else -> { +// it.addDetail(AccountHolder.subject(Subject.SUBJNO_PAY_WECHAT), +// AccountHolder.shop(shopid), +// amount / 100.0, "微信支付") +// } +// } +// }.done(personBalancePayService, false) +// val code = CallService.callWechatPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.WECHAT), +// dtl, DateUtil.getNow(), wechattype, realip, qrcode, openid) +// if (code.retcode == "0") { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .data("refno", dtl.refno) +// .success()) +// } else { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "交易请求失败-${code.retcode}")) +// } +// } catch (e: TransactionException) { +// ResponseEntity.ok(ResponseBodyBuilder.create() +// .transException(e, "交易初始化异常")) +// } +// } } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt index 408cc3db..cc262cbf 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt @@ -89,7 +89,9 @@ class NotifyController { && !StringUtils.isEmpty(result_code) && "SUCCESS" == result_code) { //map.get("transaction_id") 第三方流水号 PersonTransBuilder.newBuilder(accountUtilServcie) - .done(out_trade_no!!, TradeDict.DTL_STATUS_SUCCESS, map, personBalancePayService) + .setRefno(out_trade_no!!) + .addResult(map) + .success(personBalancePayService) } return "" } catch (e: Exception) { diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt index a8f4bfc5..5f92a0cf 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/shop_api_controller.kt @@ -6,12 +6,14 @@ import com.supwisdom.dlpay.framework.ResponseBodyBuilder import com.supwisdom.dlpay.api.service.ShopService import com.supwisdom.dlpay.exception.RequestParamCheckException import com.supwisdom.dlpay.exception.TransactionException -import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import java.net.URLDecoder +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse @RestController @RequestMapping("/api/shop") @@ -19,27 +21,27 @@ class ShopAPIController { @Autowired private lateinit var shopService: ShopService @Autowired - private lateinit var systemUtilService: SystemUtilService + private lateinit var commonService: CommonService @PostMapping("/open") - fun openAccount(@RequestBody request: OpenShopParam): ResponseEntity { + fun openAccount(@RequestBody param: OpenShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - shopService.findByThirdUniqueId(request.shopUniqueId)?.let { + shopService.findByThirdUniqueId(param.shopUniqueId)?.let { ResponseEntity.ok(ResponseBodyBuilder.create() - .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${request.shopUniqueId}]已经存在")) + .fail(TradeErrorCode.BUSINESS_SHOP_EXISTS, "该商户唯一号[${param.shopUniqueId}]已经存在")) } - request.shopname = request.shopname?.let { URLDecoder.decode(request.shopname, Charsets.UTF_8.toString()) } //解码 - request.contactman = request.contactman?.let { URLDecoder.decode(request.contactman, Charsets.UTF_8.toString()) } //解码 - request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) } //解码 - shopService.registerShop(request)?.let { + param.shopname = param.shopname?.let { URLDecoder.decode(param.shopname, Charsets.UTF_8.toString()) } //解码 + param.contactman = param.contactman?.let { URLDecoder.decode(param.contactman, Charsets.UTF_8.toString()) } //解码 + param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码 + shopService.registerShop(param)?.let { ResponseEntity.ok(ResponseBodyBuilder.create() .data("shopid", it.shopid) - .data("shopaccno",it.shopaccno?:"") + .data("shopaccno", it.shopaccno ?: "") .success("注册成功")) } @@ -55,16 +57,16 @@ class ShopAPIController { } @GetMapping("/query") - fun queryShop(@RequestBody request: QueryShopParam): ResponseEntity { + fun queryShop(@RequestBody param: QueryShopParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - shopService.findByShopBySearch(request.shopid,request.shopaccno,request.shopUniqueId)?.let { + shopService.findByShopBySearch(param.shopid, param.shopaccno, param.shopUniqueId)?.let { ResponseEntity.ok(ResponseBodyBuilder.create() - .data("shopid", it) + .data("shop", it) .success()) } diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt index ac86e3a0..5b838e40 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt @@ -7,7 +7,7 @@ import com.supwisdom.dlpay.api.service.UserService import com.supwisdom.dlpay.exception.RequestParamCheckException import com.supwisdom.dlpay.exception.TransactionException import com.supwisdom.dlpay.framework.ResponseBodyBuilder -import com.supwisdom.dlpay.framework.service.SystemUtilService +import com.supwisdom.dlpay.framework.service.CommonService import com.supwisdom.dlpay.framework.util.TradeErrorCode import org.springframework.beans.factory.annotation.Autowired import org.springframework.http.ResponseEntity @@ -16,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import java.net.URLDecoder +import javax.servlet.http.HttpServletRequest +import javax.servlet.http.HttpServletResponse @RestController @RequestMapping("/api/user") @@ -23,28 +25,28 @@ class UserAPIController { @Autowired private lateinit var useService: UserService @Autowired - private lateinit var systemUtilService: SystemUtilService + private lateinit var commonService: CommonService @PostMapping("/open") - fun openAccount(@RequestBody request: OpenUserParam): ResponseEntity { + fun openAccount(@RequestBody param: OpenUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - useService.findByThirdUniqueIdenty(request.uid, request.syscode).let { + useService.findByThirdUniqueIdenty(param.uid).let { if (null != it) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REGISTER_USER_EXIST, "改用户唯一号已经注册")) } - request.name = URLDecoder.decode(request.name, Charsets.UTF_8.toString()) //解码 - request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) } //解码 - useService.registerUser(request).let { + param.name = URLDecoder.decode(param.name, Charsets.UTF_8.toString()) //解码 + param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码 + useService.registerUser(param).let { if (null != it) { ResponseEntity.ok(ResponseBodyBuilder.create() .data("userid", it.userid) - .data("uid", request.uid) + .data("uid", param.uid) .success()) } @@ -62,14 +64,14 @@ class UserAPIController { } @PostMapping("/query") - fun queryAccount(@RequestBody request: QueryUserParam): ResponseEntity { + fun queryAccount(@RequestBody param: QueryUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - useService.findByUseridOrThirdUniqueIdenty(request.userid, request.uid, request.syscode).let { + useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid).let { if (null != it) { val account = useService.findAccountByUserid(it.userid, null) val pointacc = useService.findPointsAccountByUserid(it.userid) @@ -111,16 +113,16 @@ class UserAPIController { } @PostMapping("/modify") - fun modifyAccount(@RequestBody request: ModifyUserParam): ResponseEntity { + fun modifyAccount(@RequestBody param: ModifyUserParam, request: HttpServletRequest, response: HttpServletResponse): ResponseEntity { return try { - if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) { + if (param.checkParam() && param.checkSign(commonService.getAppidSecretByRequest(request))) { ResponseEntity.ok(ResponseBodyBuilder.create() .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误")) } - useService.findByUseridOrThirdUniqueIdenty(request.userid, request.uid, request.syscode)?.let { - request.name = request.name?.let { URLDecoder.decode(request.name, Charsets.UTF_8.toString()) } //解码 - request.address = request.address?.let { URLDecoder.decode(request.address, Charsets.UTF_8.toString()) } //解码 - if (useService.modifyUserInfo(it, request)) { + useService.findByUseridOrThirdUniqueIdenty(param.userid, param.uid)?.let { + param.name = param.name?.let { URLDecoder.decode(param.name, Charsets.UTF_8.toString()) } //解码 + param.address = param.address?.let { URLDecoder.decode(param.address, Charsets.UTF_8.toString()) } //解码 + if (useService.modifyUserInfo(it, param)) { ResponseEntity.ok(ResponseBodyBuilder.create() .success("修改成功")) } else { 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 c043553f..7ef63a53 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 @@ -11,9 +11,11 @@ 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.domain.TFeetypeConfig import com.supwisdom.dlpay.framework.domain.TShopacc import com.supwisdom.dlpay.framework.domain.TSubject import com.supwisdom.dlpay.framework.domain.TTranstype @@ -40,7 +42,7 @@ class AccountUtilServcieImpl : AccountUtilServcie { lateinit var subjectDao: SubjectDao @Autowired - lateinit var transtypeDao: TranstypeDao + lateinit var feetypeConfigDao: FeetypeConfigDao override fun readAccountForUpdateNowait(userid: String): TAccount { @@ -70,9 +72,9 @@ class AccountUtilServcieImpl : AccountUtilServcie { ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "科目<$subjno>不存在") } - override fun readTranstype(transtype: Int): TTranstype { - return transtypeDao.findByTranstype(transtype) - ?: throw TransactionProcessException(TradeErrorCode.SUBJECT_NOT_EXISTS, "交易类型<$transtype>未配置") + override fun readFeetype(feetype: String, paytype: String): TFeetypeConfig { + return feetypeConfigDao.getById(feetype, paytype) + ?: throw TransactionProcessException(TradeErrorCode.FEETYPE_NOT_EXISTS, "在支付方式<$paytype>下不存在费用类别<$feetype>") } } @@ -152,7 +154,7 @@ class PersonBalancePayServiceImpl : PersonBalancePayService { } override fun process(builder: PersonTransBuilder): TUserdtl { - return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, null) + return finish(init(builder), TradeDict.DTL_STATUS_SUCCESS, builder.resultMap) } override fun init(builder: PersonTransBuilder): TUserdtl { @@ -286,4 +288,36 @@ class PersonBalancePayServiceImpl : PersonBalancePayService { userdtl.status = TradeDict.DTL_STATUS_WIP //待支付 return userdtlDao.save(userdtl) } + + override fun wip(builder: PersonTransBuilder): TUserdtl { + return wip(builder.refno) + } + + override fun finish(builder: PersonTransBuilder): TUserdtl{ + return finish(builder.refno, builder.status, builder.resultMap) + } + + override fun getUserdtlForUpdateNowait(refno: String): TUserdtl{ + return try { + userdtlDao.findByRefnoForUpdateNowait(refno) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "交易参考号<$refno>流水不存在") + } catch (ex: Exception) { + when (ex) { + is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "流水<$refno>被锁定,请稍后再试") + else -> throw ex + } + } + } + + override fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl { + return try { + userdtlDao.findByBillnoForUpdateNowait(billno, shopaccno) + ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "商户流水号<$billno>流水不存在") + } catch (ex: Exception) { + when (ex) { + is CannotAcquireLockException, is LockTimeoutException -> throw TransactionException(TradeErrorCode.ACCOUNT_TRADE_BUSY, "商户流水号<$billno>流水被锁定,请稍后再试") + else -> throw ex + } + } + } } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt index 510fd35f..fa30adae 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt @@ -16,7 +16,6 @@ import com.supwisdom.dlpay.exception.TransactionProcessException import com.supwisdom.dlpay.framework.util.* import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service -import java.net.URLDecoder /** * Created by shuwei on 2019/4/15. @@ -79,23 +78,26 @@ class UserServiceImpl : UserService { } } personIdentityDao.save(TPersonIdentity().apply { - thirdUserid = param.uid - thirdSyscode = param.syscode + thirdUid = param.uid this.person = person + status = person.status + lossflag = 0 + lockflag = 0 + createtime = systemdatetime.hostdatetime }) //保存绑定关系 return person } - override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String, syscode: String): TPerson? { - return personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person } + override fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? { + return personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person } } - override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson? { + override fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? { return if (!StringUtil.isEmpty(userid)) { personDao.findByUserid(userid) } else { - personIdentityDao.getPersonIdentityById(thirdUniqueIdenty, syscode)?.let { it.person } + personIdentityDao.getByThirdUid(thirdUniqueIdenty)?.let { it.person } } } @@ -137,4 +139,32 @@ class UserServiceImpl : UserService { return pointsAccountDao.findByUserid(userid) } + override fun findPersonIdentity(thirdUniqueIdenty: String): TPersonIdentity? { + return personIdentityDao.getByThirdUid(thirdUniqueIdenty) + } + + override fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson { + personIdentityDao.getByThirdUid(thirdUniqueIdenty).let { + if (null != it) { + if (TradeDict.STATUS_NORMAL != it.status) { + throw TransactionProcessException(TradeErrorCode.PERSON_STATUS_ERROR, "账户状态异常") + } + if (1 == it.lossflag) { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOSS, "账户已挂失") + } + if (1 == it.lockflag) { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_IS_LOCKED, "账户已冻结") + } + + if (null != it.person) { + return it.person + } else { + throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在") + } + } + + throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "账户不存在") + } + } + } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt index b789d399..568d9bb3 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/pay_service.kt @@ -3,6 +3,7 @@ package com.supwisdom.dlpay.api.service import com.supwisdom.dlpay.api.PersonTransBuilder import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.domain.TUserdtl +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 @@ -21,7 +22,7 @@ interface AccountUtilServcie { fun readSubject(subjno: String): TSubject - fun readTranstype(transtype: Int): TTranstype + fun readFeetype(feetype: String, paytype: String): TFeetypeConfig } interface PersonBalancePayService { @@ -58,4 +59,15 @@ interface PersonBalancePayService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) fun wip(refno: String): TUserdtl + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + fun wip(builder: PersonTransBuilder): TUserdtl + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + fun finish(builder: PersonTransBuilder): TUserdtl + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + fun getUserdtlForUpdateNowait(refno: String): TUserdtl + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class)) + fun getUserdtlByBillnoForUpdateNowait(billno: String, shopaccno: String): TUserdtl } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt index 9f2d3fd8..c4d9b20c 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt @@ -4,6 +4,7 @@ import com.supwisdom.dlpay.api.bean.ModifyUserParam import com.supwisdom.dlpay.api.bean.OpenUserParam import com.supwisdom.dlpay.api.domain.TAccount import com.supwisdom.dlpay.api.domain.TPerson +import com.supwisdom.dlpay.api.domain.TPersonIdentity import com.supwisdom.dlpay.api.domain.TPointsAccount import org.springframework.transaction.annotation.Propagation import org.springframework.transaction.annotation.Transactional @@ -16,10 +17,10 @@ interface UserService { fun registerUser(param: OpenUserParam): TPerson @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) - fun findByThirdUniqueIdenty(thirdUniqueIdenty: String, syscode: String): TPerson? + fun findByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson? @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) - fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?, syscode: String): TPerson? + fun findByUseridOrThirdUniqueIdenty(userid: String?, thirdUniqueIdenty: String?): TPerson? @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) fun modifyUserInfo(person:TPerson,param: ModifyUserParam):Boolean @@ -33,4 +34,10 @@ interface UserService { @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) fun findPointsAccountByUserid(userid: String): TPointsAccount? + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) + fun findPersonIdentity(thirdUniqueIdenty: String):TPersonIdentity? + + @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true) + fun findPersonByIdentityCheckStatus(thirdUniqueIdenty: String): TPerson + } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt index b072cc22..99161e38 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/framework_service.kt @@ -1,5 +1,13 @@ package com.supwisdom.dlpay.framework.service +import com.supwisdom.dlpay.api.bean.ConsumeFeetype +import javax.servlet.http.HttpServletRequest + interface CommonService{ fun getSystemVersion(): String + + fun getRequestAppid(request: HttpServletRequest): String + + fun getAppidSecretByRequest(request: HttpServletRequest): String + } \ No newline at end of file diff --git a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt index 7429de95..56f2586d 100644 --- a/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt +++ b/src/main/kotlin/com/supwisdom/dlpay/framework/service/impl/framework_service_impl.kt @@ -1,11 +1,37 @@ package com.supwisdom.dlpay.framework.service.impl +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.jcabi.manifests.Manifests +import com.supwisdom.dlpay.api.bean.ConsumeFeetype +import com.supwisdom.dlpay.exception.RequestParamCheckException +import com.supwisdom.dlpay.exception.TransactionProcessException +import com.supwisdom.dlpay.framework.core.JwtConfig +import com.supwisdom.dlpay.framework.core.JwtTokenUtil +import com.supwisdom.dlpay.framework.dao.ApiClientDao import com.supwisdom.dlpay.framework.service.CommonService +import com.supwisdom.dlpay.framework.util.StringUtil +import com.supwisdom.dlpay.framework.util.TradeErrorCode +import org.springframework.beans.factory.annotation.Autowired import org.springframework.stereotype.Service +import javax.servlet.http.HttpServletRequest @Service class CommonServiceImpl : CommonService { + @Autowired + lateinit var jwtConfig: JwtConfig + @Autowired + lateinit var apiClientDao: ApiClientDao + + private var jwtUtil: JwtTokenUtil? = null + + private fun getUtil(): JwtTokenUtil { + if (jwtUtil == null) { + jwtUtil = JwtTokenUtil((jwtConfig)) + } + return jwtUtil as JwtTokenUtil + } + override fun getSystemVersion(): String { try { return Manifests.read("Payapi-Version") ?: "version 1.0" @@ -14,4 +40,27 @@ class CommonServiceImpl : CommonService { return "unknown" } } + + override fun getRequestAppid(request: HttpServletRequest): String { + request.getHeader(jwtConfig.header).let { + if (null != it && it.startsWith(jwtConfig.tokenHeader)) { + val claims = getUtil().verifyToken(it.substring(jwtConfig.tokenHeader.length)) + val uid = claims["uid"]?.toString() + if (!StringUtil.isEmpty(uid)) { + return uid as String + } + } + + throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID未找到") //报错 + } + } + + override fun getAppidSecretByRequest(request: HttpServletRequest): String { + return apiClientDao.findByAppid(getRequestAppid(request)).let { + if (null != it) + it.secret + else + throw TransactionProcessException(TradeErrorCode.BUSINESS_APPID_NOTFOUND, "APPID记录未找到") //报错 + } + } } \ No newline at end of file