From: Xia Kaixiang Date: Wed, 10 Jul 2019 11:03:23 +0000 (+0800) Subject: 银行接口初步实现 X-Git-Tag: 1.0.0^2~72 X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=f54cf52a8d66d644dfc8756cedcfccdc4be5429b;p=epayment%2Ffood_payapi.git 银行接口初步实现 --- diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java index 999f37f6..79d4b629 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/util/IDTypes.java @@ -1,16 +1,23 @@ package com.supwisdom.dlpay.api.util; public enum IDTypes { - IDTYPE_IDCARD("idcard"), // 身份证 - IDTYPE_PASSPORT("passport"), // 护照 - IDTYPE_DRIVING_LICENSE("driving_license"), // 驾照 - IDTYPE_HK_MACAU_PASS("hk_macau_pass"), // 港澳通行证 - IDTYPE_STUDENT_IDCARD("student_idcard"), // 学生证 - IDTYPE_OTHER("unknown"), - IDTYPE_LIST(new IDTypes[]{IDTYPE_IDCARD, IDTYPE_PASSPORT, - IDTYPE_DRIVING_LICENSE, IDTYPE_HK_MACAU_PASS, IDTYPE_STUDENT_IDCARD, IDTYPE_OTHER}); // 其它 - - IDTypes(Object data) { + IDCARD(52, "idcard"), // 身份证 + RESIDENCE_BOOKLET(55, "residence_booklet"), //户口簿 + PASSPORT(70, "passport"), // 护照 + HK_MACAU_PASS(76, "hk_macau_pass"), // 港澳居民来往内地通行证 + TAIWAN_PASS(67, "taiwan_pass"), // 台湾同胞来往内地通行证 + FOREIGNER_RESIDENCE_PERMIT(68, "foreigner_residence_permit"), // 外国人居留证 + MILITARY_IDCARD(58, "military_idcard"), // 军官证 + SOLDIER_IDCARD(64, "soldier_idcard"), // 士兵证 + DRIVING_LICENSE(-97, "driving_license"), // 驾照 + STUDENT_IDCARD(-98, "student_idcard"), // 学生证 + OTHERS(-99, "unknown"), + IDTYPE_LIST(-100, new IDTypes[]{IDCARD, RESIDENCE_BOOKLET, PASSPORT, HK_MACAU_PASS, TAIWAN_PASS, FOREIGNER_RESIDENCE_PERMIT, MILITARY_IDCARD, SOLDIER_IDCARD, + DRIVING_LICENSE, STUDENT_IDCARD, OTHERS}); // 其它 + + + IDTypes(int id, Object data) { + this.id = id; this.data = data; } @@ -18,9 +25,35 @@ public enum IDTypes { return this.data.toString(); } + public int getId() { + return this.id; + } + public Object getData() { return this.data; } private Object data; + + private int id; + + public static String findById(int id) { + IDTypes[] list = (IDTypes[]) IDTypes.IDTYPE_LIST.getData(); + for (IDTypes item : list) { + if (item.getId() == id) { + return item.value(); + } + } + return null; + } + + public static int findByValue(String idtype) { + IDTypes[] list = (IDTypes[]) IDTypes.IDTYPE_LIST.getData(); + for (IDTypes item : list) { + if (item.value().equals(idtype)) { + return item.getId(); + } + } + return -999; + } } diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java index 9d674762..ea516886 100644 --- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java +++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/validator/IDNoCheckValidator.java @@ -29,7 +29,7 @@ public class IDNoCheckValidator implements ConstraintValidator> result = validate(param); assertFalse(getViolationMessage(result), result.isEmpty()); - param.setIdtype(IDTypes.IDTYPE_IDCARD.value()); + param.setIdtype(IDTypes.IDCARD.value()); param.setIdno("123213"); param.setUid("1231323"); param.setName("lily"); 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 3678cc0f..0af068f4 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 = ""; + 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"; + + public static final String DLPAY_CATEGORIE = "C001"; //消费类别 + + 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 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("") + .append("").append(BANKCARD_BIND_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(bcNo).append("") + .append("").append(name).append("") + .append("").append(idType).append("") + .append("").append(idNo).append("") + .append("").append(phone).append("") + .append(""); + return String.format("%08d", xml.toString().length()) + xml.toString(); + } - //HEAD - private String jkdm; //接口代码 - private String jgdm; //结果代码 - private String fsdw; //发送单位 - private String jsdw; //接收单位 - private String czyh; //操作员号 - private String jyxh; //交易序号 - private String jyqd; //交易渠道 - private String yhxx; //安全用户信息 - private String klxx; //安全口令信息 - //DATA业务参数 key值 + /** + * 市民卡签约/解约请求XML + * */ + public String getSignXml(){ + StringBuffer xml = new StringBuffer(); + xml.append(prefix) + .append("") + .append("").append(BANKCARD_SIGN_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(categorie).append("") + .append("").append(bcNo).append("") + .append("").append(name).append("") + .append("").append(idType).append("") + .append("").append(idNo).append("") + .append("").append(phone).append("") + .append("").append(transType).append("") + .append(""); + return String.format("%08d", xml.toString().length()) + xml.toString(); + } + + /** + * 市民卡代扣消费接口请求报文 + * */ + public String getCardpayXml(){ + StringBuffer xml = new StringBuffer(); + xml.append(prefix) + .append("") + .append("").append(BANKCARD_PAY_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(categorie).append("") + .append("").append(bcNo).append("") + .append("").append(name).append("") +// .append("").append(idType).append("") + .append("").append(idNo).append("") + .append("").append(merchantBcno).append("") + .append("").append(merchantName).append("") + .append("").append(amount).append("") + .append("").append(description).append("") + .append("").append(MD5.encodeByMD5ForDlpay(merchantBcno + bcNo + amount)).append("") + .append(""); + return String.format("%08d", xml.toString().length()) + xml.toString(); + } + + /** + * 市民卡退款接口请求报文 + * */ + public String getPayRefundXml(){ + StringBuffer xml = new StringBuffer(); + xml.append(prefix) + .append("") + .append("").append(BANKCARD_PAYREFUND_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(oriSn).append("") + .append("").append(amount).append("") + .append("").append(description).append("") + .append(""); + return String.format("%08d", xml.toString().length()) + xml.toString(); + } + /** + * 市民卡交易查询接口请求报文 + * */ + public String getQueryResultXml(){ + StringBuffer xml = new StringBuffer(); + xml.append(prefix) + .append("") + .append("").append(BANKCARD_QUERYRESULT_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(oriSn).append("") + .append(""); + return String.format("%08d", xml.toString().length()) + xml.toString(); + } - private String getPayXml() { + /** + * 市民卡对账接口请求报文 + * */ + public String getChkfileXml(){ StringBuffer xml = new StringBuffer(); xml.append(prefix) - .append("") - //HEAD - .append("") - .append("").append(jkdm).append("") - .append("").append("000000").append("") //发送时填充000000 - .append("").append(fsdw).append("") - .append("").append(jsdw).append("") - .append("").append(czyh).append("") - .append("").append(jyxh).append("") - .append("").append(jyqd).append("") - .append("").append(yhxx).append("") - .append("").append(klxx).append("") - .append("") - //DATA - .append("") -// .append("").append("201906211124000011").append("") - .append("") - .append(""); + .append("") + .append("").append(BANKCARD_CHKFILE_TRANSCODE).append("") + .append("").append(transdate).append("") + .append("").append(transtime).append("") + .append("").append(sn).append("") + .append("").append(chkdate).append("") + .append("").append("") + .append(""); 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 00000000..ba5e1135 --- /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 b3104809..4a239dd1 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 @@ public class TPaytypeConfig implements Serializable { @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 75fa85a7..9e31db8c 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 @@ public class TPerson { @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 4d5ba843..91abab4f 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 @@ public class MD5 { 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 66deb654..996af8e9 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 org.dom4j.Element; 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 @@ public class XmlUtils { return xmlContent; } - /* - public static T getXmlToObject(String xmlContent, Class clazz) { + public static 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(); - - @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) { + 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(); - } - return null; - } - - public static 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) { - + } catch (Exception e) { e.printStackTrace(); } - return null; + } catch (JAXBException e) { + + e.printStackTrace(); } - */ + return null; + } + public static Map parseXml(String xml) throws Exception { Map map = new HashMap(); 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 5aa25fbf..7f8bf3fc 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.Map; import java.util.Random; public class DlpayUtil { + public static final Map 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 3b5bd5e2..430499cd 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 @@ package com.supwisdom.dlpay.api 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 CallBackResp { class CallService { companion object { + private val logger = KotlinLogging.logger { } + fun callYktPay(config: Map, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp { val code = CallBackResp() val appid = config["appid"] @@ -235,6 +237,214 @@ class CallService { } } + + /** + * 大理农商行银行卡绑定 + * */ + fun CallCitizenCardBind(config: Map, 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(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, 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(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, 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(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, 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 d3735256..739b2c3a 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 @@ package com.supwisdom.dlpay.api.bean 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 @@ class DaliDatasyncParam { fun decData(deskey: String): ArrayList { try { - val listType = object : TypeToken>() {}.type + val listType = object : TypeToken>() {}.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 37daf22e..fdec8f7a 100644 --- a/payapi/src/main/resources/data.sql +++ b/payapi/src/main/resources/data.sql @@ -452,32 +452,38 @@ INSERT INTO "tb_sourcetype" ("sourcetype", "checkable", "paydesc", "enable", "ch 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 @@ INSERT INTO "tb_dictionary" ("dictval", "dicttype", "dictcaption", "dicttypename 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}');