银行接口初步实现
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
index 3678cc0..0af068f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayReq.java
@@ -1,48 +1,282 @@
package com.supwisdom.dlpay.api.bean;
+import com.supwisdom.dlpay.framework.util.MD5;
+
public class DlpayReq {
private static final String prefix = "<?xml version=\"1.0\" encoding=\"GBK\"?>";
+ private static final String BANKCARD_BIND_TRANSCODE = "BC5510";
+ private static final String BANKCARD_SIGN_TRANSCODE = "BC5511";
+ private static final String BANKCARD_PAY_TRANSCODE = "BC5512";
+ private static final String BANKCARD_PAYREFUND_TRANSCODE = "BC5513";
+ private static final String BANKCARD_QUERYRESULT_TRANSCODE = "BC5514";
+ private static final String BANKCARD_CHKFILE_TRANSCODE = "BC5515";
- //HEAD
- private String jkdm; //<JKDM>接口代码</JKDM>
- private String jgdm; //<JGDM>结果代码</JGDM>
- private String fsdw; //<FSDW>发送单位</FSDW>
- private String jsdw; //<JSDW>接收单位</JSDW>
- private String czyh; //<CZYH>操作员号</CZYH>
- private String jyxh; //<JYXH>交易序号</JYXH>
- private String jyqd; //<JYQD>交易渠道</JYQD>
- private String yhxx; //<YHXX>安全用户信息</YHXX>
- private String klxx; //<KLXX>安全口令信息</KLXX>
+ public static final String DLPAY_CATEGORIE = "C001"; //消费类别
- //DATA业务参数 <KEY>key值</KEY>
+ private String transdate; //交易日期
+ private String transtime; //交易时间
+ private String sn; //应用系统唯一流水号
+ private String bcNo; //银行卡卡号
+ private String name; //户名
+ private String idType; //证件类型
+ private String idNo; //证件号码
+ private String phone; //手机号
+ private String categorie; //消费类别
+ private String transType; //交易类型 签约1,解约2
- private String getPayXml() {
+ private String merchantBcno; //商户卡号
+ private String merchantName; //商户户名
+ private Integer amount; //消费金额
+ private String description; //描述交易内容
+
+ private String oriSn; //原应用系统唯一流水号
+ private String chkdate; //对账日期
+
+ /**
+ * 市民卡绑定请求XML
+ * */
+ public String getBindCardXml() {
StringBuffer xml = new StringBuffer();
xml.append(prefix)
- .append("<FORMDATA>")
- //HEAD
- .append("<HEAD>")
- .append("<JKDM>").append(jkdm).append("</JKDM>")
- .append("<JGDM>").append("000000").append("</JGDM>") //发送时填充000000
- .append("<FSDW>").append(fsdw).append("</FSDW>")
- .append("<JSDW>").append(jsdw).append("</JSDW>")
- .append("<CZYH>").append(czyh).append("</CZYH>")
- .append("<JYXH>").append(jyxh).append("</JYXH>")
- .append("<JYQD>").append(jyqd).append("</JYQD>")
- .append("<YHXX>").append(yhxx).append("</YHXX>")
- .append("<KLXX>").append(klxx).append("</KLXX>")
- .append("</HEAD>")
- //DATA
- .append("<DATA>")
-// .append("<REFNO>").append("201906211124000011").append("</REFNO>")
- .append("</DATA>")
- .append("</FORMDATA>");
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_BIND_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+ .append("<NAME>").append(name).append("</NAME>")
+ .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+ .append("<ID_NO>").append(idNo).append("</ID_NO>")
+ .append("<PHONE>").append(phone).append("</PHONE>")
+ .append("</root>");
return String.format("%08d", xml.toString().length()) + xml.toString();
}
+ /**
+ * 市民卡签约/解约请求XML
+ * */
+ public String getSignXml(){
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_SIGN_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<CATEGORIE>").append(categorie).append("</CATEGORIE>")
+ .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+ .append("<NAME>").append(name).append("</NAME>")
+ .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+ .append("<ID_NO>").append(idNo).append("</ID_NO>")
+ .append("<PHONE>").append(phone).append("</PHONE>")
+ .append("<TRANS_TYPE>").append(transType).append("</TRANS_TYPE>")
+ .append("</root>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+ /**
+ * 市民卡代扣消费接口请求报文
+ * */
+ public String getCardpayXml(){
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_PAY_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<CATEGORIE>").append(categorie).append("</CATEGORIE>")
+ .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+ .append("<NAME>").append(name).append("</NAME>")
+// .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+ .append("<ID_NO>").append(idNo).append("</ID_NO>")
+ .append("<MERCHANT_BCNO>").append(merchantBcno).append("</MERCHANT_BCNO>")
+ .append("<MERCHANT_NAME>").append(merchantName).append("</MERCHANT_NAME>")
+ .append("<AMOUNT>").append(amount).append("</AMOUNT>")
+ .append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
+ .append("<MAC>").append(MD5.encodeByMD5ForDlpay(merchantBcno + bcNo + amount)).append("</MAC>")
+ .append("</root>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+ /**
+ * 市民卡退款接口请求报文
+ * */
+ public String getPayRefundXml(){
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_PAYREFUND_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<ORI_SN>").append(oriSn).append("</ORI_SN>")
+ .append("<AMOUNT>").append(amount).append("</AMOUNT>")
+ .append("<DESCRIPTION>").append(description).append("</DESCRIPTION>")
+ .append("</root>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+ /**
+ * 市民卡交易查询接口请求报文
+ * */
+ public String getQueryResultXml(){
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_QUERYRESULT_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<ORI_SN>").append(oriSn).append("</ORI_SN>")
+ .append("</root>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+
+ /**
+ * 市民卡对账接口请求报文
+ * */
+ public String getChkfileXml(){
+ StringBuffer xml = new StringBuffer();
+ xml.append(prefix)
+ .append("<root>")
+ .append("<TRANSCODE>").append(BANKCARD_CHKFILE_TRANSCODE).append("</TRANSCODE>")
+ .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+ .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+ .append("<SN>").append(sn).append("</SN>")
+ .append("<DZDATE>").append(chkdate).append("</DZDATE>")
+ .append("<MERCHANT_BCNO>").append("</MERCHANT_BCNO>")
+ .append("</root>");
+ return String.format("%08d", xml.toString().length()) + xml.toString();
+ }
+
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ public String getSn() {
+ return sn;
+ }
+
+ public void setSn(String sn) {
+ this.sn = sn;
+ }
+
+ public String getBcNo() {
+ return bcNo;
+ }
+
+ public void setBcNo(String bcNo) {
+ this.bcNo = bcNo;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getIdType() {
+ return idType;
+ }
+
+ public void setIdType(String idType) {
+ this.idType = idType;
+ }
+
+ public String getIdNo() {
+ return idNo;
+ }
+
+ public void setIdNo(String idNo) {
+ this.idNo = idNo;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+ public String getCategorie() {
+ return categorie;
+ }
+
+ public void setCategorie(String categorie) {
+ this.categorie = categorie;
+ }
+
+ public String getTransType() {
+ return transType;
+ }
+
+ public void setTransType(String transType) {
+ this.transType = transType;
+ }
+
+ public String getMerchantBcno() {
+ return merchantBcno;
+ }
+
+ public void setMerchantBcno(String merchantBcno) {
+ this.merchantBcno = merchantBcno;
+ }
+
+ public String getMerchantName() {
+ return merchantName;
+ }
+
+ public void setMerchantName(String merchantName) {
+ this.merchantName = merchantName;
+ }
+
+ public Integer getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Integer amount) {
+ this.amount = amount;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public String getOriSn() {
+ return oriSn;
+ }
+
+ public void setOriSn(String oriSn) {
+ this.oriSn = oriSn;
+ }
+
+ public String getChkdate() {
+ return chkdate;
+ }
+
+ public void setChkdate(String chkdate) {
+ this.chkdate = chkdate;
+ }
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
new file mode 100644
index 0000000..ba5e113
--- /dev/null
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/bean/DlpayResp.java
@@ -0,0 +1,88 @@
+package com.supwisdom.dlpay.api.bean;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement(name = "root")
+public class DlpayResp {
+ private String code;
+ private String message;
+ private String transdate;
+ private String transtime;
+ private String bankjourno;
+ private String captcha;
+ private String status;
+ private String filename;
+
+ @XmlElement(name = "CODE")
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ @XmlElement(name = "MESSAGE")
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ @XmlElement(name = "TRANSDATE")
+ public String getTransdate() {
+ return transdate;
+ }
+
+ public void setTransdate(String transdate) {
+ this.transdate = transdate;
+ }
+
+ @XmlElement(name = "TRANSTIME")
+ public String getTranstime() {
+ return transtime;
+ }
+
+ public void setTranstime(String transtime) {
+ this.transtime = transtime;
+ }
+
+ @XmlElement(name = "BANKJOURNO")
+ public String getBankjourno() {
+ return bankjourno;
+ }
+
+ public void setBankjourno(String bankjourno) {
+ this.bankjourno = bankjourno;
+ }
+
+ @XmlElement(name = "CAPTCHA")
+ public String getCaptcha() {
+ return captcha;
+ }
+
+ public void setCaptcha(String captcha) {
+ this.captcha = captcha;
+ }
+
+ @XmlElement(name = "STATUS")
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ @XmlElement(name = "FILENAME")
+ public String getFilename() {
+ return filename;
+ }
+
+ public void setFilename(String filename) {
+ this.filename = filename;
+ }
+}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
index b310480..4a239dd 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPaytypeConfig.java
@@ -24,6 +24,9 @@
@Column(name = "CONFIG_NAME", length = 200)
private String configName;
+ @Column(name = "GLOBALFLAG", length = 200)
+ private Boolean globalflag = false;
+
@Column(name = "tenantid", length = 20)
@NotNull
private String tenantid = "";
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
index 75fa85a..9e31db8 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/api/domain/TPerson.java
@@ -26,7 +26,7 @@
@NotNull
private String status;
- @Column(name = "IDTYPE", length = 20)
+ @Column(name = "IDTYPE", length = 60)
private String idtype;
@Column(name = "IDNO", length = 30)
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
index 4d5ba84..91abab4 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/MD5.java
@@ -67,4 +67,21 @@
return hexDigits[d1] + hexDigits[d2];
}
+ public static String encodeByMD5ForDlpay(String originString) {
+ if (originString != null) {
+ try {
+ //创建具有指定算法名称的信息摘要
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ //使用指定的字节数组对摘要进行最后更新,然后完成摘要计算
+ byte[] results = md.digest(originString.getBytes("GBK"));
+ //将得到的字节数组变成字符串返回
+ String resultString = byteArrayToHexString(results);
+ return resultString;
+ } catch (Exception ex) {
+ ex.printStackTrace();
+ }
+ }
+ return null;
+ }
+
}
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
index 66deb65..996af8e 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/framework/util/XmlUtils.java
@@ -7,8 +7,8 @@
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
+import javax.xml.bind.Unmarshaller;
+import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -38,56 +38,30 @@
return xmlContent;
}
- /*
- public static <T> T getXmlToObject(String xmlContent, Class clazz) {
+ public static <T> T getXmlToObject(String xmlContent, String charset, Class clazz) {
+ try {
+ JAXBContext context = JAXBContext.newInstance(clazz);
+ // xml转换为对象 XML------Object
+ InputStream inputStream;
try {
- JAXBContext context = JAXBContext.newInstance(clazz);
- // xml转换为对象 XML------Object
- InputStream inputStream;
- try {
- inputStream = new ByteArrayInputStream(
- xmlContent.getBytes("GBK"));
- Unmarshaller um = context.createUnmarshaller();
+ inputStream = new ByteArrayInputStream(
+ xmlContent.getBytes(charset));
+ Unmarshaller um = context.createUnmarshaller();
- @Suppress("UNCHECKED_CAST")
- return (T) um.unmarshal(inputStream);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }catch (Exception e) {
- e.printStackTrace();
- }
- } catch (JAXBException e) {
-
+ return (T) um.unmarshal(inputStream);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (Exception e) {
e.printStackTrace();
}
- return null;
+ } catch (JAXBException e) {
+
+ e.printStackTrace();
}
+ return null;
+ }
- public static <T> T getXmlToObject(String xmlContent,String charset, Class clazz) {
- try {
- JAXBContext context = JAXBContext.newInstance(clazz);
- // xml转换为对象 XML------Object
- InputStream inputStream;
- try {
- inputStream = new ByteArrayInputStream(
- xmlContent.getBytes(charset));
- Unmarshaller um = context.createUnmarshaller();
-
- return (T) um.unmarshal(inputStream);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }catch (Exception e) {
- e.printStackTrace();
- }
- } catch (JAXBException e) {
-
- e.printStackTrace();
- }
- return null;
- }
- */
public static Map<String, String> parseXml(String xml) throws Exception {
Map<String, String> map = new HashMap<String, String>();
Document document = DocumentHelper.parseText(xml);
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
index 5aa25fb..7f8bf3f 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/util/DlpayUtil.java
@@ -13,6 +13,30 @@
import java.util.Random;
public class DlpayUtil {
+ public static final Map<String, String> errcode = new HashMap<>(0);
+
+ static {
+ errcode.put("0000", "成功");
+ errcode.put("0101", "手机号不一致");
+ errcode.put("0102", "无预留手机号");
+ errcode.put("0103", "证件类型不一致");
+ errcode.put("0104", "证件号码不一致");
+ errcode.put("0105", "户名不符");
+ errcode.put("0106", "卡状态异常");
+ errcode.put("0107", "无此卡号");
+ errcode.put("0201", "未进行银行卡绑定");
+ errcode.put("0202", "无效的交易类型");
+ errcode.put("0301", "未签约");
+ errcode.put("0302", "余额不足");
+ errcode.put("0303", "MD5校验失败");
+ errcode.put("0401", "原始流水不存在");
+ errcode.put("0402", "原始流水未成功");
+ errcode.put("0403", "原始流水已退款");
+ errcode.put("4004", "商户账户余额不足");
+ errcode.put("0405", "不在退款时间范围内");
+ errcode.put("0406", "当日无交易明细");
+ }
+
/**
* socket方式请求农商行
*/
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 3b5bd5e..430499c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -3,14 +3,14 @@
import com.google.gson.Gson
import com.sun.jersey.api.client.Client
import com.sun.jersey.api.client.ClientResponse
-import com.supwisdom.dlpay.api.bean.BaseResp
-import com.supwisdom.dlpay.api.bean.SupStatusRevResp
-import com.supwisdom.dlpay.api.bean.SupYktResp
-import com.supwisdom.dlpay.api.bean.WechatReqResp
+import com.supwisdom.dlpay.api.bean.*
import com.supwisdom.dlpay.api.domain.TPersondtl
import com.supwisdom.dlpay.api.domain.TShopdtl
+import com.supwisdom.dlpay.api.util.IDTypes
import com.supwisdom.dlpay.framework.util.*
import com.supwisdom.dlpay.util.Code
+import com.supwisdom.dlpay.util.DlpayUtil
+import mu.KotlinLogging
class CallBackResp {
var retcode: String = "99"
@@ -24,6 +24,8 @@
class CallService {
companion object {
+ private val logger = KotlinLogging.logger { }
+
fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
val code = CallBackResp()
val appid = config["appid"]
@@ -235,6 +237,214 @@
}
}
+
+ /**
+ * 大理农商行银行卡绑定
+ * */
+ fun CallCitizenCardBind(config: Map<String, String?>, transdate: String, transtime: String, refno: String, bankcardno: String, name: String, idtype: String, idno: String, phone: String): CallBackResp {
+ val resp = CallBackResp()
+ val ip = config["socket.ip"]
+ val port = config["socket.port"]
+ val idType = IDTypes.findByValue(idtype)
+ if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "市民卡socket的IP和端口未配置"
+ return resp
+ }
+ if (idType < 0) {
+ resp.retcode = "99"
+ resp.retmsg = "证件类型未识别[$idtype]"
+ return resp
+ }
+
+ val req = DlpayReq().apply {
+ this.transdate = transdate
+ this.transtime = transtime
+ this.sn = refno
+ this.bcNo = bankcardno
+ this.name = name
+ this.idType = "$idType"
+ this.idNo = idno
+ this.phone = phone
+ }
+ logger.info("请求绑定银行卡发送报文:\n${req.bindCardXml}")
+ try {
+ val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.bindCardXml)
+ logger.info("请求绑定银行卡返回报文[$refno]:\n$returnXml")
+ if (returnXml.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "请求绑定银行卡返回报文为空"
+ return resp
+ }
+ val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+ if (null == returnResp) {
+ resp.retcode = "99"
+ resp.retmsg = "解析返回报文错误!"
+ return resp
+ }
+
+ if ("0000" == returnResp.code) {
+ resp.retcode = "0"
+ resp.retmsg = "success"
+ resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+ resp.add("verifycode", returnResp.captcha) //fixme:短信验证码!!
+ } else {
+ resp.retcode = "99"
+ resp.retmsg = returnResp.message
+ }
+ return resp
+ } catch (e: Exception) {
+ e.printStackTrace()
+ resp.retcode = "99"
+ resp.retmsg = "请求绑定银行卡异常!e:${e.message}"
+ return resp
+ }
+ }
+
+ /**
+ * 大理农商行银行卡签约/解约
+ * transtype:1-签约,2-解约
+ * */
+ fun CallCitizenCardSigned(config: Map<String, String?>, transdate: String, transtime: String, refno: String, bankcardno: String, name: String, idtype: String, idno: String, phone: String, transtype: String): CallBackResp {
+ val resp = CallBackResp()
+ val ip = config["socket.ip"]
+ val port = config["socket.port"]
+ val idType = IDTypes.findByValue(idtype)
+ if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "市民卡socket的IP和端口未配置"
+ return resp
+ }
+ if (idType < 0) {
+ resp.retcode = "99"
+ resp.retmsg = "证件类型未识别[$idtype]"
+ return resp
+ }
+ if ("1" != transtype && "2" != transtype) {
+ resp.retcode = "99"
+ resp.retmsg = "请求操作类型错误[$transtype]"
+ return resp
+ }
+
+ val req = DlpayReq().apply {
+ this.transdate = transdate
+ this.transtime = transtime
+ this.sn = refno
+ this.categorie = DlpayReq.DLPAY_CATEGORIE //业务类别
+ this.bcNo = bankcardno
+ this.name = name
+ this.idType = "$idType"
+ this.idNo = idno
+ this.phone = phone
+ this.transType = transtype //1-签约,2-解约
+ }
+ logger.info("代扣签(解)约发送报文:\n${req.signXml}")
+ try {
+ val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.signXml)
+ logger.info("请求代扣签(解)约返回报文[$refno]:\n$returnXml")
+ if (returnXml.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "请求代扣签(解)约返回报文为空"
+ return resp
+ }
+ val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+ if (null == returnResp) {
+ resp.retcode = "99"
+ resp.retmsg = "解析返回报文错误!"
+ return resp
+ }
+
+ if ("0000" == returnResp.code) {
+ resp.retcode = "0"
+ resp.retmsg = "success"
+ resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+ } else {
+ resp.retcode = "99"
+ resp.retmsg = returnResp.message
+ }
+ return resp
+ } catch (e: Exception) {
+ e.printStackTrace()
+ resp.retcode = "99"
+ resp.retmsg = "请求代扣签(解)约异常!e:${e.message}"
+ return resp
+ }
+ }
+
+ /**
+ * 大理农商行银行卡代扣消费
+ * */
+ fun callCitizenCardPay(config: Map<String, String?>, transdate: String, transtime: String, refno: String, amount:Double, bankcardno: String, name: String, idtype: String, idno: String, phone: String): CallBackResp {
+ val resp = CallBackResp()
+ val ip = config["socket.ip"]
+ val port = config["socket.port"]
+ val merchantBankCardno = config["bankcardno"] //商户银行账号
+ val merchantBankAccname = config["bankaccname"] //商户银行开户名
+ val idType = IDTypes.findByValue(idtype)
+ if (ip.isNullOrEmpty() || port.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "市民卡socket的IP和端口未配置"
+ return resp
+ }else if(merchantBankCardno.isNullOrEmpty() || merchantBankAccname.isNullOrEmpty()){
+ resp.retcode = "99"
+ resp.retmsg = "商户银行收款参数未配置"
+ return resp
+ }
+
+ if (idType < 0) {
+ resp.retcode = "99"
+ resp.retmsg = "证件类型未识别[$idtype]"
+ return resp
+ }
+
+ val req = DlpayReq().apply {
+ this.transdate = transdate
+ this.transtime = transtime
+ this.sn = refno
+ this.categorie = DlpayReq.DLPAY_CATEGORIE //业务代码
+ this.bcNo = bankcardno
+ this.name = name
+ this.idType = "$idType"
+ this.idNo = idno
+ this.merchantBcno = merchantBankCardno
+ this.merchantName = merchantBankAccname
+ this.amount = MoneyUtil.YuanToFen(amount)
+ this.description="市民卡代扣消费"
+ }
+ logger.info("请求代扣消费发送报文:\n${req.cardpayXml}")
+ try {
+ val returnXml = DlpayUtil.send(ip, port.toInt(), 10, req.cardpayXml)
+ logger.info("请求代扣消费返回报文[$refno]:\n$returnXml")
+ if (returnXml.isNullOrEmpty()) {
+ resp.retcode = "99"
+ resp.retmsg = "请求代扣消费返回报文为空"
+ return resp
+ }
+ val returnResp = XmlUtils.getXmlToObject<DlpayResp>(returnXml.substring(8), "GBK", DlpayResp::class.java)
+ if (null == returnResp) {
+ resp.retcode = "99"
+ resp.retmsg = "解析返回报文错误!"
+ return resp
+ }
+
+ if ("0000" == returnResp.code) {
+ resp.retcode = "0"
+ resp.retmsg = "success"
+ resp.add("outtradeno", returnResp.bankjourno) //银行流水号
+ } else {
+ resp.retcode = "99"
+ resp.retmsg = returnResp.message
+ }
+ return resp
+ } catch (e: Exception) {
+ e.printStackTrace()
+ //fixme: 查询逻辑?
+ resp.retcode = "99"
+ resp.retmsg = "请求代扣消费异常!e:${e.message}"
+ return resp
+ }
+ }
+
fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
val resp = CallBackResp()
resp.retcode = "0"
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index d373525..739b2c3 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -2,10 +2,8 @@
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
-import com.supwisdom.dlpay.api.APIRequestParam
import com.supwisdom.dlpay.api.exception.RequestParamCheckException
import com.supwisdom.dlpay.framework.util.*
-import com.supwisdom.dlpay.util.ConstantUtil
import com.supwisdom.dlpay.util.DESedeUtil
class DaliDatasyncParam {
@@ -45,7 +43,7 @@
fun decData(deskey: String): ArrayList<DaliDatasyncDetail> {
try {
- val listType = object : TypeToken<ArrayList<ConsumeFeetype>>() {}.type
+ val listType = object : TypeToken<ArrayList<DaliDatasyncDetail>>() {}.type
val decstr = DESedeUtil.getInstance(deskey).decode(data)
return Gson().fromJson(decstr, listType)
} catch (e: Exception) {
diff --git a/payapi/src/main/resources/data.sql b/payapi/src/main/resources/data.sql
index 37daf22..fdec8f7 100644
--- a/payapi/src/main/resources/data.sql
+++ b/payapi/src/main/resources/data.sql
@@ -452,32 +452,38 @@
VALUES ('wechat', 't', '微信支付', 't', 't', 't', 't', 'f', '{tenantid}');
-- 支付方式
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','appid',null,'100005', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','orderurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('yktpay','reverseurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.gateway', '支付宝网关地址', 'https://openapi.alipay.com/gateway.do', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'enable.paymethod', '支付渠道', 'balance,moneyFund,debitCardExpress,bankPay,pcredit', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'notify.url', '异步通知地址', 'http://ykt.supwisdom.com:9116/epay/zfb/newnotify', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'timeout.express', '支付超时时间', '5m', '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.public.key', '支付宝商户应用的支付宝公钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.rsa.private.key', '支付宝商户应用RSA私钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'alipay.rsa.public.key', '支付宝商户应用RSA公钥', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('alipay', 'appid', '支付宝应用APPID', NULL, '{tenantid}');
-INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE, "tenantid")
-VALUES ('citizenCard', 'bankcardno', NULL, NULL, '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','appid',null,'100005', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','appkey',null,'adc4ac6822fd462780f878b86cb94688', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','orderurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/pay', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('yktpay','reverseurl',null,'http://172.28.201.101:9116/epayapi/services/thirdparty/common/payreverse', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.gateway', '支付宝网关地址', 'https://openapi.alipay.com/gateway.do', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'enable.paymethod', '支付渠道', 'balance,moneyFund,debitCardExpress,bankPay,pcredit', 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'notify.url', '异步通知地址', 'http://ykt.supwisdom.com:9116/epay/zfb/newnotify', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'timeout.express', '支付超时时间', '5m', 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.public.key', '支付宝商户应用的支付宝公钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.rsa.private.key', '支付宝商户应用RSA私钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'alipay.rsa.public.key', '支付宝商户应用RSA公钥', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('alipay', 'appid', '支付宝应用APPID', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'socket.ip', 'socket的IP', NULL, 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'socket.port', 'socket的端口', NULL, 't', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'bankcardno', '商户银行卡号', NULL, 'f', '{tenantid}');
+INSERT INTO TB_PAYTYPE_CONFIG (PAYTYPE,CONFIGID,CONFIG_NAME,CONFIG_VALUE,GLOBALFLAG, "tenantid")
+VALUES ('citizenCard', 'bankaccname', '银行开户名', NULL, 'f', '{tenantid}');
INSERT INTO "tb_syspara" ("paraid", "displayflag", "editflag", "lastsaved", "paraname", "paraunit", "paraval", "remark", "valuetype", "tenantid")
VALUES (1, 'yes', 1, '20190514165658', '账户最大余额默认值', '元', '10001', '账户开户时的默认账户最大余额', 'amount', '{tenantid}');
@@ -511,18 +517,27 @@
VALUES ('cancel','dtlStatusList', '交易取消', '流水状态', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('1', 'idtypeList', '身份证', '证件类型', '{tenantid}');
+VALUES ('idcard', 'idtypeList', '身份证', '证件类型', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('2', 'idtypeList', '护照', '证件类型', '{tenantid}');
+VALUES ('residence_booklet', 'idtypeList', '户口簿', '证件类型', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('3', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+VALUES ('passport', 'idtypeList', '护照', '证件类型', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('4', 'idtypeList', '港澳通行证', '证件类型', '{tenantid}');
+VALUES ('hk_macau_pass', 'idtypeList', '港澳居民来往内地通行证', '证件类型', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('5', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+VALUES ('taiwan_pass', 'idtypeList', '港澳通行证', '台湾同胞来往内地通行证', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
-VALUES ('9', 'idtypeList', '其他', '证件类型', '{tenantid}');
-
+VALUES ('foreigner_residence_permit', 'idtypeList', '港澳通行证', '外国人居留证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('military_idcard', 'idtypeList', '港澳通行证', '军官证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('soldier_idcard', 'idtypeList', '港澳通行证', '士兵证', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('driving_license', 'idtypeList', '驾照', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('student_idcard', 'idtypeList', '学工号', '证件类型', '{tenantid}');
+INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
+VALUES ('unknown', 'idtypeList', '其他', '证件类型', '{tenantid}');
INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename", "tenantid")
VALUES ('male', 'sexList', '男', '性别', '{tenantid}');