From c01d4e141091a009238aabb5692dcb11b7675a45 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Mon, 24 Apr 2023 14:32:55 +0800
Subject: [PATCH] 银行提现、查询
---
src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java | 738 +++++++++++++++++++++++++++++++++++++++++++++++++
src/main/java/cc/mrbird/febs/mall/entity/MallMemberBank.java | 6
src/main/java/cc/mrbird/febs/mall/dto/UpdateMemberBankDto.java | 9
src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdrawMsg.java | 23 +
src/main/java/cc/mrbird/febs/mall/vo/MemberBankListVo.java | 9
src/main/resources/mapper/modules/MallMemberWithdrawMapper.xml | 7
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMapper.java | 2
src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMsgMapper.java | 7
src/main/java/cc/mrbird/febs/pay/service/NBYHService.java | 29 +
src/main/java/cc/mrbird/febs/mall/dto/AddMemberBankDto.java | 9
src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 3
11 files changed, 842 insertions(+), 0 deletions(-)
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddMemberBankDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddMemberBankDto.java
index 3048b5a..6da66e0 100644
--- a/src/main/java/cc/mrbird/febs/mall/dto/AddMemberBankDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AddMemberBankDto.java
@@ -32,5 +32,14 @@
// 开户行
@ApiModelProperty(value = "支行")
private String subbranchName;
+ // 省
+ @ApiModelProperty(value = "省")
+ private String province;
+ // 市
+ @ApiModelProperty(value = "市")
+ private String city;
+ // 收款行号
+ @ApiModelProperty(value = "收款行号")
+ private String skhh;
}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/UpdateMemberBankDto.java b/src/main/java/cc/mrbird/febs/mall/dto/UpdateMemberBankDto.java
index 29f30df..fb634be 100644
--- a/src/main/java/cc/mrbird/febs/mall/dto/UpdateMemberBankDto.java
+++ b/src/main/java/cc/mrbird/febs/mall/dto/UpdateMemberBankDto.java
@@ -33,4 +33,13 @@
private String bankName;
@ApiModelProperty(value = "支行")
private String subbranchName;
+ // 省
+ @ApiModelProperty(value = "省")
+ private String province;
+ // 市
+ @ApiModelProperty(value = "市")
+ private String city;
+ // 收款行号
+ @ApiModelProperty(value = "收款行号")
+ private String skhh;
}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberBank.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberBank.java
index ef713d4..d77a323 100644
--- a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberBank.java
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberBank.java
@@ -24,4 +24,10 @@
private String digitalNo;
// 手机号
private String phone;
+ // 省
+ private String province;
+ // 市
+ private String city;
+ // 收款行号
+ private String skhh;
}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdrawMsg.java b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdrawMsg.java
new file mode 100644
index 0000000..30cf0e1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallMemberWithdrawMsg.java
@@ -0,0 +1,23 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+@Data
+@TableName("mall_member_withdraw_msg")
+public class MallMemberWithdrawMsg extends BaseEntity {
+
+ /**
+ * 提现记录ID
+ */
+ private Long withdrawId;
+ /**
+ * 提现记录编号
+ */
+ private String withdrawNo;
+ /**
+ * 状态 1:已查询 2:未查询
+ */
+ private Integer status;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMapper.java
index e1bf3eb..8224dbf 100644
--- a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMapper.java
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMapper.java
@@ -1,6 +1,7 @@
package cc.mrbird.febs.mall.mapper;
import cc.mrbird.febs.mall.entity.MallMemberWithdraw;
+import cc.mrbird.febs.mall.entity.MallMemberWithdrawMsg;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
@@ -11,4 +12,5 @@
List<MallMemberWithdraw> selectListByMemberIdAndDate(@Param("memberId")Long memberId, @Param("date")Date date);
+ MallMemberWithdrawMsg selectMsgByWithdrawNo(@Param("withdrawNo")String withdrawNo);
}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMsgMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMsgMapper.java
new file mode 100644
index 0000000..fb4a596
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallMemberWithdrawMsgMapper.java
@@ -0,0 +1,7 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.MallMemberWithdrawMsg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+public interface MallMemberWithdrawMsgMapper extends BaseMapper<MallMemberWithdrawMsg> {
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
index 2cb8174..c687ded 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java
@@ -629,6 +629,9 @@
mallMemberBank.setDigitalNo(updateMemberBankDto.getDigitalNo());
mallMemberBank.setBankName(updateMemberBankDto.getBankName());
mallMemberBank.setSubbranchName(updateMemberBankDto.getSubbranchName());
+ mallMemberBank.setProvince(updateMemberBankDto.getProvince());
+ mallMemberBank.setCity(updateMemberBankDto.getCity());
+ mallMemberBank.setSkhh(updateMemberBankDto.getSkhh());
mallMemberBankMapper.updateById(mallMemberBank);
return new FebsResponse().success();
}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/MemberBankListVo.java b/src/main/java/cc/mrbird/febs/mall/vo/MemberBankListVo.java
index f79e9f6..50ebea2 100644
--- a/src/main/java/cc/mrbird/febs/mall/vo/MemberBankListVo.java
+++ b/src/main/java/cc/mrbird/febs/mall/vo/MemberBankListVo.java
@@ -32,4 +32,13 @@
@ApiModelProperty(value = "支行")
private String subbranchName;
+ // 省
+ @ApiModelProperty(value = "省")
+ private String province;
+ // 市
+ @ApiModelProperty(value = "市")
+ private String city;
+ // 收款行号
+ @ApiModelProperty(value = "收款行号")
+ private String skhh;
}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/NBYHService.java b/src/main/java/cc/mrbird/febs/pay/service/NBYHService.java
new file mode 100644
index 0000000..ed2d84a
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/NBYHService.java
@@ -0,0 +1,29 @@
+package cc.mrbird.febs.pay.service;
+
+/**
+ * 宁波银企直联接口
+ */
+public interface NBYHService {
+ /**
+ * 行内转账
+ * @param id 提现ID
+ * 1、凭借请求数据,发起银行转账请求
+ * 2、生成一条请求记录,
+ * 3、定时器循环请求,更新提现记录,直到返回的状态为90,更新状态为成功。
+ *
+ */
+ boolean tradeSinge(Long id);
+ /**
+ * 跨行汇款
+ * @param id 提现ID
+ * 1、凭借请求数据,发起银行转账请求
+ * 2、生成一条请求记录,
+ * 3、定时器循环请求,更新提现记录,直到返回的状态为90,更新状态为成功。
+ *
+ */
+ boolean tradeSingeOuterTransfer(Long id);
+ /**
+ * 转账结果查询
+ */
+ void transferResultInfoQuery(String withdrawNo);
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java
new file mode 100644
index 0000000..dfa6446
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/NBYHServiceImpl.java
@@ -0,0 +1,738 @@
+package cc.mrbird.febs.pay.service.impl;
+
+import cc.mrbird.febs.mall.entity.MallMemberBank;
+import cc.mrbird.febs.mall.entity.MallMemberWithdraw;
+import cc.mrbird.febs.mall.entity.MallMemberWithdrawMsg;
+import cc.mrbird.febs.mall.mapper.MallMemberBankMapper;
+import cc.mrbird.febs.mall.mapper.MallMemberWithdrawMapper;
+import cc.mrbird.febs.mall.mapper.MallMemberWithdrawMsgMapper;
+import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.pay.service.NBYHService;
+import cn.hutool.core.util.ObjectUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.io.*;
+import java.math.BigDecimal;
+import java.net.HttpURLConnection;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.net.URL;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Map;
+
+@Slf4j
+@Service
+public class NBYHServiceImpl implements NBYHService {
+ /**
+ * 登录报文原文
+ */
+ private static final String SIGN_MESSAGE = "<opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><userID>0000005332</userID><userPWD>123456</userPWD></ReqParam></opReq>";
+ /**
+ * 转账报文原文
+ */
+ private static final String TRADE_MESSAGE_SEARCH = "<opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><JYXH>${serialNoOld}</JYXH></ReqParam></opReq>";
+ private static final String TRADE_MESSAGE_SINGLE = "<opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>78040122000059277</SKZH><SKHM>792311957</SKHM><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU></ReqParam></opReq>";
+ private static final String TRADE_MESSAGE = "<opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>${FKZH}</FKZH><SKZH>${SKZH}</SKZH><SKHM>${SKHM}</SKHM><SKYH>${SKYH}</SKYH><SKSH>${SKSH}</SKSH><SKSI>${SKSI}</SKSI><JYJE>${JYJE}</JYJE><YOTU>${YOTU}</YOTU><SKHH>${SKHH}</SKHH></ReqParam></opReq>";
+// private static final String TRADE_MESSAGE = "<opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>6228481060643871117</SKZH><SKHM>王苏平</SKHM><SKYH>中国农业银行舟山市定海支行营业中心</SKYH><SKSH>浙江省</SKSH><SKSI>舟山市</SKSI><JYJE>0.01</JYJE><BIZH>01</BIZH><ZZLX>02</ZZLX><ZZLB>0</ZZLB><YOTU>银企接口测试</YOTU><SKHH>103342040518</SKHH></ReqParam></opReq>";
+ /**
+ *
+ private static final String TRADE_MESSAGE = "<opReq>" +
+ "<serialNo>${serialNo}</serialNo>" +
+ "<reqTime>${reqTime}</reqTime>" +
+ "<ReqParam>" +
+ "<FKZH>82260120102022631</FKZH>" +
+ "<SKZH>6228481060643871117</SKZH>" +
+ "<SKHM>王苏平</SKHM>" +
+ "<SKYH>中国农业银行舟山市定海支行营业中心</SKYH>" +
+ "<SKSH>浙江省</SKSH>" +
+ "<SKSI>舟山市</SKSI>" +
+ "<JYJE>0.01</JYJE>" +
+ "<YOTU>银企接口测试</YOTU>" +
+ "<SKHH>103342040518</SKHH>" +
+ "</ReqParam>" +
+ "</opReq>";
+ 跨行转账
+ <opReq>
+ <serialNo>交易序列号</serialNo>
+ <reqTime>客户端请求时间</reqTime>
+ <ReqParam>
+ <FKZH>付款账号</FKZH>
+ <SKZH>收款账号</SKZH>
+ <SKHM>收款方户名</SKHM>
+ <SKYH>收款账号开户行名称</SKYH>
+ <SKSH>收款方行所在省</SKSH>
+ <SKSI>收款方行所在市</SKSI>
+ <JYJE>交易金额</JYJE>
+ <YOTU>用途</YOTU>
+ <SKHH>收款行号</SKHH>
+ </ReqParam>
+ </opReq>
+
+ <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>6228481060643871117</SKZH><SKHM>王苏平</SKHM><SKYH>中国农业银行舟山市定海支行营业中心</SKYH><SKSH>浙江省</SKSH><SKSI>舟山市</SKSI><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU><SKHH>103342040518</SKHH></ReqParam></opReq>
+
+
+ 行内转账
+ <opReq>
+ <serialNo>交易序列号</serialNo>
+ <reqTime>客户端请求时间</reqTime>
+ <ReqParam>
+ <FKZH>付款账号</FKZH>
+ <SKZH>收款账号</SKZH>
+ <SKHM>收款方户名</SKHM>
+ <JYJE>交易金额</JYJE>
+ <YOTU>用途</YOTU>
+ </ReqParam>
+ </opReq>
+
+ <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>78040122000059277</SKZH><SKHM>792311957</SKHM><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU></ReqParam></opReq>
+
+ <opReq>
+ <serialNo>交易序列号</serialNo>
+ <reqTime>客户端请求时间</reqTime>
+ <ReqParam>
+ <JYXH>原交易序列号</JYXH>
+ </ReqParam>
+ </opReq>
+
+ <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><JYXH>${serialNoOld}</JYXH></ReqParam></opReq>
+
+ */
+
+ /**
+ * 接收报文url
+ */
+ private static final String URL = "http://127.0.0.1:9080/directlink/httpAccess";
+ /**
+ * 签名ip
+ */
+ private static final String VERIFY_IP = "127.0.0.1";
+ /**
+ * 付款账号
+ */
+ private static final String FKZH = "82260120102022631";
+ /**
+ * 签名端口
+ */
+ private static final int VERIFY_PORT = 8010;
+
+ /**
+ * cookies
+ */
+ private static String cookies = null;
+ /**
+ * sessionId
+ */
+ private static String sessionId = "-1";
+ /**
+ * 客户号
+ */
+ private static String customerId = "0000005332";
+ /**
+ * 客户号
+ */
+ private static String softwareId = "002";
+ /**
+ * 返回码
+ */
+ private static String retCode;
+ /**
+ * 返回信息
+ */
+ private static String errorMessage;
+
+ public static void main(String[] args) {
+ try {
+// System.out.println("发送登录请求:");
+// test.executeServerHttpService("srv001_signOn");
+// System.out.println("\n发送转账结果查询请求:");
+// executeServerHttpService("srv008_transferResultInfoQuery","转账结果查询","2023032910585227466");
+// System.out.println("\n发送跨行转账请求:");
+// test.executeServerHttpService("srv007_singleOuterTransfer","跨行转账",null);
+// System.out.println("\n发送行内转账请求:");
+// executeServerHttpService("srv006_singleInnerTransfer","行内转账","2023032910585227466");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+
+ @Autowired
+ private MallMemberWithdrawMapper mallMemberWithdrawMapper;
+ @Autowired
+ private MallMemberWithdrawMsgMapper mallMemberWithdrawMsgMapper;
+ @Autowired
+ private MallMemberBankMapper mallMemberBankMapper;
+
+ @Override
+ public boolean tradeSinge(Long id) {
+ boolean flag = false;
+ MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id);
+ MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId());
+ try {
+ String requestDataForWithDraw = getRequestDataForWithDraw("srv006_singleInnerTransfer", "行内转账", mallMemberWithdraw, mallMemberBank);
+ String responseStr = executeServerHttpService(requestDataForWithDraw);
+ boolean b = parseReturnValueForTrade(responseStr);
+ if(b){
+ //插入一条记录
+ MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(mallMemberWithdraw.getWithdrawNo());
+ if(ObjectUtil.isEmpty(mallMemberWithdrawMsg)){
+ MallMemberWithdrawMsg mallMemberWithdrawMsg1 = new MallMemberWithdrawMsg();
+ mallMemberWithdrawMsg1.setWithdrawNo(mallMemberWithdraw.getWithdrawNo());
+ mallMemberWithdrawMsg1.setWithdrawId(mallMemberWithdraw.getId());
+ mallMemberWithdrawMsg1.setStatus(2);
+ mallMemberWithdrawMsgMapper.insert(mallMemberWithdrawMsg1);
+ }
+ }
+ flag = b;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return flag;
+ }
+
+ @Override
+ public boolean tradeSingeOuterTransfer(Long id) {
+ boolean flag = false;
+ MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(id);
+ MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId());
+ try {
+ String requestDataForWithDraw = getRequestDataForWithDraw("srv007_singleOuterTransfer", "跨行汇款", mallMemberWithdraw, mallMemberBank);
+ String responseStr = executeServerHttpService(requestDataForWithDraw);
+ boolean b = parseReturnValueForTrade(responseStr);
+ if(b){
+ //插入一条记录
+ MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(mallMemberWithdraw.getWithdrawNo());
+ if(ObjectUtil.isEmpty(mallMemberWithdrawMsg)){
+ MallMemberWithdrawMsg mallMemberWithdrawMsg1 = new MallMemberWithdrawMsg();
+ mallMemberWithdrawMsg1.setWithdrawNo(mallMemberWithdraw.getWithdrawNo());
+ mallMemberWithdrawMsg1.setWithdrawId(mallMemberWithdraw.getId());
+ mallMemberWithdrawMsg1.setStatus(2);
+ mallMemberWithdrawMsgMapper.insert(mallMemberWithdrawMsg1);
+ }
+ }
+ flag = b;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return flag;
+ }
+
+ @Override
+ public void transferResultInfoQuery(String withdrawNo) {
+ MallMemberWithdrawMsg mallMemberWithdrawMsg = mallMemberWithdrawMapper.selectMsgByWithdrawNo(withdrawNo);
+ if(ObjectUtil.isEmpty(mallMemberWithdrawMsg)){
+ return;
+ }
+ Integer status = mallMemberWithdrawMsg.getStatus();
+ if(1 == status){
+ return;
+ }
+ MallMemberWithdraw mallMemberWithdraw = mallMemberWithdrawMapper.selectById(mallMemberWithdrawMsg.getWithdrawId());
+ MallMemberBank mallMemberBank = mallMemberBankMapper.selectById(mallMemberWithdraw.getWtihdrawTypeId());
+ try {
+ String requestDataForWithDraw = getRequestDataForWithDraw("srv008_transferResultInfoQuery", "转账结果查询", mallMemberWithdraw, mallMemberBank);
+ String responseStr = executeServerHttpService(requestDataForWithDraw);
+ boolean b = parseReturnValue(responseStr);
+ if(b){
+ mallMemberWithdrawMsg.setStatus(1);
+ mallMemberWithdrawMsgMapper.updateById(mallMemberWithdrawMsg);
+ }
+ return;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * 执行交易
+ *
+ * @throws Exception
+ */
+ @SuppressWarnings("rawtypes")
+ public static String executeServerHttpService(String requestData) throws Exception {
+// public static void executeServerHttpService(String serviceId, String serviceName, String serialNo,String requestData) throws Exception {
+ // 处理交易的url
+ java.net.URL url = new URL(URL);
+ HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+ if (cookies != null) {
+ // 如果已登录,设置coikie
+ connection.setRequestProperty("cokie", cookies);
+ }
+ // 请求以utf-8格式编码
+ connection.setRequestProperty("content-type", "text/xml;charset=utf-8");
+ connection.setDoInput(true);
+ connection.setDoOutput(true);
+ // post方式发送
+ connection.setRequestMethod("POST");
+ OutputStream out = connection.getOutputStream();
+ // 组装完整的交易报文
+// String reqData = getRequestData(serviceId,serviceName,serialNo);
+ String reqData = requestData;
+ // utf-8 编码发送
+ System.out.println("请求报文:\n" + reqData);
+ out.write(reqData.getBytes("UTF-8"));
+ out.flush();
+ out.close();
+ int retCode = connection.getResponseCode();
+ if (retCode != 200) {
+ throw new Exception("交易出错!retCode=" + retCode);
+ }
+ // 设置cookie
+ Map heads = connection.getHeaderFields();
+ Object[] headNames = heads.keySet().toArray();
+ for (int i = 0; i < headNames.length; i++) {
+ if (headNames[i] == null) {
+ continue;
+ }
+ if ("Set-Cookie".equalsIgnoreCase((String) headNames[i])) {
+ cookies = connection.getHeaderField(headNames[i]
+ .toString());
+ }
+ }
+ int len = connection.getContentLength();
+ byte[] retData = readContent(connection.getInputStream(), len);
+ String retStr = new String(retData, "UTF-8");
+ System.out.println("【返回报文】Ret Data:\n " + retStr);
+ return retStr;
+// return parseReturnValue(retStr);
+ }
+
+ /**
+ * 组装完整的报文
+ *
+ * @param serviceId
+ * @return
+ * @throws FileNotFoundException
+ * @throws IOException
+ */
+ public static String getRequestData(String serviceId, String serviceName, String serialNo)
+ throws FileNotFoundException, IOException {
+ StringBuffer buf = new StringBuffer();
+ // 报文编码格式utf-8
+ buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><NBCBEBankData>");
+ buf.append("<sessionId>");
+ buf.append(sessionId);
+ buf.append("</sessionId>");
+ buf.append("<serviceId>");
+ buf.append(serviceId);
+ buf.append("</serviceId>");
+ String reqData = "";
+ if (serviceId.equals("srv001_signOn")) {
+ reqData = SIGN_MESSAGE;
+ } else if (serviceId.equals("srv006_singleInnerTransfer")) {
+ reqData = TRADE_MESSAGE_SINGLE;
+ /**
+ * <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>78040122000059277</SKZH><SKHM>792311957</SKHM><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU></ReqParam></opReq>
+ * <opReq>
+ * <serialNo>${serialNo}</serialNo>
+ * <reqTime>${reqTime}</reqTime>
+ * <ReqParam>
+ * <FKZH>${FKZH}</FKZH>
+ * <SKZH>${SKZH}</SKZH>
+ * <SKHM>${SKHM}</SKHM>
+ * <JYJE>${JYJE}</JYJE>
+ * <YOTU>${YOTU}</YOTU>
+ * </ReqParam>
+ * </opReq>
+ */
+ reqData = reqData.replaceFirst("\\$\\{FKZH\\}", serialNo);
+ reqData = reqData.replaceFirst("\\$\\{SKZH\\}", serialNo);
+ reqData = reqData.replaceFirst("\\$\\{SKHM\\}", serialNo);
+ reqData = reqData.replaceFirst("\\$\\{JYJE\\}", serialNo);
+ reqData = reqData.replaceFirst("\\$\\{YOTU\\}", serialNo);
+ }else if (serviceId.equals("srv007_singleOuterTransfer")) {
+ reqData = TRADE_MESSAGE;
+ }else if (serviceId.equals("srv008_transferResultInfoQuery")) {
+ reqData = TRADE_MESSAGE_SEARCH;
+ //原订单流水号
+ reqData = reqData.replaceFirst("\\$\\{serialNoOld\\}", serialNo);
+ }
+// String serialNo = String.valueOf(Math.round(Math.random() * 10000))
+// + System.currentTimeMillis();
+ Calendar calendar = Calendar.getInstance();
+ Date date = calendar.getTime();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ String reqTime = sdf.format(date);
+ reqData = reqData.replaceFirst("\\$\\{serialNo\\}", serialNo);
+ reqData = reqData.replaceFirst("\\$\\{reqTime\\}", reqTime);
+ String signData = null;
+ try {
+ signData = signData(reqData);
+ signData = getNodeValue(signData, "signed_data");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ buf.append("<customerId>");
+ buf.append(customerId);
+ buf.append("</customerId>");
+ buf.append("<softwareId>");
+ buf.append(softwareId);
+ buf.append("</softwareId>");
+ buf.append("<functionId>");
+ buf.append(serviceId.substring(0, 6));
+ buf.append("</functionId>");
+ buf.append("<functionName>");
+ buf.append(serviceName);
+ buf.append("</functionName>");
+ buf.append(reqData + "<signData>" + signData
+ + "</signData></NBCBEBankData>");
+ return buf.toString();
+ }
+ /**
+ * 组装完整的报文
+ *
+ * @param serviceId
+ * @return
+ * @throws FileNotFoundException
+ * @throws IOException
+ */
+ public static String getRequestDataForWithDraw(String serviceId, String serviceName,MallMemberWithdraw mallMemberWithdraw,MallMemberBank mallMemberBank)
+ throws FileNotFoundException, IOException {
+ StringBuffer buf = new StringBuffer();
+ // 报文编码格式utf-8
+ buf.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?><NBCBEBankData>");
+ buf.append("<sessionId>");
+ buf.append(sessionId);
+ buf.append("</sessionId>");
+ buf.append("<serviceId>");
+ buf.append(serviceId);
+ buf.append("</serviceId>");
+ String reqData = "";
+ if (serviceId.equals("srv001_signOn")) {
+ reqData = SIGN_MESSAGE;
+ } else if (serviceId.equals("srv006_singleInnerTransfer")) {
+ reqData = TRADE_MESSAGE_SINGLE;
+ /**
+ * <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>78040122000059277</SKZH><SKHM>792311957</SKHM><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU></ReqParam></opReq>
+ * <opReq>
+ * <serialNo>${serialNo}</serialNo>
+ * <reqTime>${reqTime}</reqTime>
+ * <ReqParam>
+ * <FKZH>${FKZH}</FKZH>
+ * <SKZH>${SKZH}</SKZH>
+ * <SKHM>${SKHM}</SKHM>
+ * <JYJE>${JYJE}</JYJE>
+ * <YOTU>${YOTU}</YOTU>
+ * </ReqParam>
+ * </opReq>
+ */
+ reqData = reqData.replaceFirst("\\$\\{FKZH\\}", FKZH);
+ reqData = reqData.replaceFirst("\\$\\{SKZH\\}", mallMemberBank.getBankNo());
+ reqData = reqData.replaceFirst("\\$\\{SKHM\\}", mallMemberBank.getName());
+ if(mallMemberWithdraw.getRemark().equals("凭证提现")){
+ reqData = reqData.replaceFirst("\\$\\{JYJE\\}",
+ mallMemberWithdraw.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toString());
+ }else{
+ reqData = reqData.replaceFirst("\\$\\{JYJE\\}",
+ mallMemberWithdraw.getAmount().subtract(mallMemberWithdraw.getAmountFee()).setScale(2, BigDecimal.ROUND_DOWN).toString());
+ }
+
+ reqData = reqData.replaceFirst("\\$\\{YOTU\\}", "行内转账");
+ }else if (serviceId.equals("srv007_singleOuterTransfer")) {
+ /**
+ * <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>82260120102022631</FKZH><SKZH>6228481060643871117</SKZH><SKHM>王苏平</SKHM><SKYH>中国农业银行舟山市定海支行营业中心</SKYH><SKSH>浙江省</SKSH><SKSI>舟山市</SKSI><JYJE>0.01</JYJE><YOTU>银企接口测试</YOTU><SKHH>103342040518</SKHH></ReqParam></opReq>
+ * <opReq>
+ * <serialNo>${serialNo}</serialNo>
+ * <reqTime>${reqTime}</reqTime>
+ * <ReqParam>
+ * <FKZH>${FKZH}</FKZH>
+ * <SKZH>${SKZH}</SKZH>
+ * <SKHM>${SKHM}</SKHM>
+ * <SKYH>${SKYH}</SKYH>
+ * <SKSH>${SKSH}</SKSH>
+ * <SKSI>${SKSI}</SKSI>
+ * <JYJE>${JYJE}</JYJE>
+ * <YOTU>${YOTU}</YOTU>
+ * <SKHH>${SKHH}</SKHH>
+ * </ReqParam>
+ * </opReq>
+ *
+ * <opReq><serialNo>${serialNo}</serialNo><reqTime>${reqTime}</reqTime><ReqParam><FKZH>${FKZH}</FKZH><SKZH>${SKZH}</SKZH><SKHM>${SKHM}</SKHM><SKYH>${SKYH}</SKYH><SKSH>${SKSH}</SKSH><SKSI>${SKSI}</SKSI><JYJE>${JYJE}</JYJE><YOTU>${YOTU}</YOTU><SKHH>${SKHH}</SKHH></ReqParam></opReq>
+ */
+ reqData = TRADE_MESSAGE;
+
+ reqData = reqData.replaceFirst("\\$\\{FKZH\\}", FKZH);
+ reqData = reqData.replaceFirst("\\$\\{SKZH\\}", mallMemberBank.getBankNo());
+ reqData = reqData.replaceFirst("\\$\\{SKHM\\}", mallMemberBank.getName());
+ reqData = reqData.replaceFirst("\\$\\{SKYH\\}", mallMemberBank.getBankName()+mallMemberBank.getSubbranchName());
+ reqData = reqData.replaceFirst("\\$\\{SKSH\\}", mallMemberBank.getProvince());
+ reqData = reqData.replaceFirst("\\$\\{SKSI\\}", mallMemberBank.getCity());
+ if(mallMemberWithdraw.getRemark().equals("凭证提现")){
+ reqData = reqData.replaceFirst("\\$\\{JYJE\\}",
+ mallMemberWithdraw.getAmount().setScale(2, BigDecimal.ROUND_DOWN).toString());
+ }else{
+ reqData = reqData.replaceFirst("\\$\\{JYJE\\}",
+ mallMemberWithdraw.getAmount().subtract(mallMemberWithdraw.getAmountFee()).setScale(2, BigDecimal.ROUND_DOWN).toString());
+ }
+ reqData = reqData.replaceFirst("\\$\\{YOTU\\}", "跨行汇款");
+ reqData = reqData.replaceFirst("\\$\\{SKHH\\}", mallMemberBank.getSkhh());
+ }else if (serviceId.equals("srv008_transferResultInfoQuery")) {
+ reqData = TRADE_MESSAGE_SEARCH;
+ //原订单流水号
+ reqData = reqData.replaceFirst("\\$\\{serialNoOld\\}", mallMemberWithdraw.getWithdrawNo());
+ }
+// String serialNo = String.valueOf(Math.round(Math.random() * 10000))
+// + System.currentTimeMillis();
+ Calendar calendar = Calendar.getInstance();
+ Date date = calendar.getTime();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
+
+ String reqTime = sdf.format(date);
+ reqData = reqData.replaceFirst("\\$\\{serialNo\\}", mallMemberWithdraw.getWithdrawNo());
+ reqData = reqData.replaceFirst("\\$\\{reqTime\\}", reqTime);
+ String signData = null;
+ try {
+ signData = signData(reqData);
+ signData = getNodeValue(signData, "signed_data");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ buf.append("<customerId>");
+ buf.append(customerId);
+ buf.append("</customerId>");
+ buf.append("<softwareId>");
+ buf.append(softwareId);
+ buf.append("</softwareId>");
+ buf.append("<functionId>");
+ buf.append(serviceId.substring(0, 6));
+ buf.append("</functionId>");
+ buf.append("<functionName>");
+ buf.append(serviceName);
+ buf.append("</functionName>");
+ buf.append(reqData + "<signData>" + signData
+ + "</signData></NBCBEBankData>");
+ return buf.toString();
+ }
+
+ /**
+ * 数据加密
+ * </br>
+ * 重点
+ * </br>
+ * 1.orignalData.getBytes("GBK").length 获取GBK编码格式的字节长度,为了通过格式验证
+ * </br>
+ * 2.new BufferedWriter(new OutputStreamWriter(socket.getOutputStream(),"GBK")); 指定流的编码格式,使加密服务接收到正确的中文字符
+ * </br>
+ *
+ * @param orignalData 原报文体
+ * @return
+ * @throws UnsupportedEncodingException
+ */
+ public static String signData(String orignalData)
+ throws UnsupportedEncodingException {
+ InetAddress addr = null;
+ Socket socket = null;
+ // 加密报文编码格式gbk
+ String verifyheader = "<?xml version=\"1.0\" encoding=\"gbk\"?>\n"
+ + "<msg>\n" + "<msg_head>\n" + "<msg_type>0</msg_type>\n"
+ + "<msg_id>1005</msg_id>\n" + "<msg_sn>0</msg_sn>\n"
+ + "<version>1</version>\n" + "</msg_head>\n" + "<msg_body>\n"
+ + "<origin_data_len>" + orignalData.getBytes("GBK").length
+ + "</origin_data_len>\n" + "<origin_data>" + orignalData
+ + "</origin_data>\n" + "</msg_body>\n" + "</msg>";
+ try {
+ addr = InetAddress.getByName(VERIFY_IP);
+ socket = new Socket(addr, VERIFY_PORT);
+ // 发送
+ BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(
+ socket.getOutputStream(),"GBK"));
+ System.out.println("【数据加密】加密的明文:" + verifyheader);
+ wr.write(verifyheader);
+ wr.flush();
+ // 接收
+ BufferedReader rd = new BufferedReader(new InputStreamReader(
+ socket.getInputStream(),"ISO8859-1"));
+ String line = null;
+ StringBuffer sb = new StringBuffer();
+ while ((line = rd.readLine()) != null) {
+ sb.append(line);
+ }
+ // 处理返回
+ String returnStr = new String(sb.toString().getBytes("ISO8859-1"),"GBK");
+ System.out.println("【数据加密】返回的密文:" + returnStr);
+ wr.close();
+ rd.close();
+ socket.close();
+ return returnStr;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return "";
+ }
+
+ /**
+ * 从加密返回密文中取出signData
+ *
+ * @param returnStr
+ * @param tagName
+ * @return
+ */
+ public static String getNodeValue(String returnStr, String tagName) {
+ int startIdx, endIdx;
+ String beginTag = "<" + tagName + ">";
+ String endTag = "</" + tagName + ">";
+ startIdx = returnStr.indexOf(beginTag) + beginTag.length();
+ endIdx = returnStr.indexOf(endTag, startIdx);
+ return returnStr.substring(startIdx, endIdx);
+ }
+
+ /**
+ * 处理返回信息
+ *
+ * @param src
+ * @throws Exception
+ */
+ public static boolean parseReturnValueForTrade(String src) throws Exception {
+ int beginIndex = src.indexOf("<sessionId>");
+ int endIndex = src.indexOf("</sessionId>");
+ String sessionIdRep = "";
+ if (beginIndex != -1 && endIndex != -1) {
+ sessionIdRep = src.substring(beginIndex + 11, endIndex);
+ }
+ if (!sessionIdRep.equals("-1") && !sessionId.equals("-1")
+ && !sessionId.equals(sessionIdRep))
+// throw new Exception("上送的sessionId和返回的sessionId不一致! " + src);
+ return false;
+ if (sessionId.equals("-1"))
+ sessionId = sessionIdRep;
+
+ retCode = src.substring(src.indexOf("<retCode>") + 9,
+ src.indexOf("</retCode>"));
+
+ String JyztStr = src.substring(src.indexOf("<JYZT>") + 6,
+ src.indexOf("</JYZT>"));
+
+ String YddmStr = src.substring(src.indexOf("<YDDM>") + 6,
+ src.indexOf("</YDDM>"));
+ try {
+ errorMessage = src.substring(src.indexOf("<errorMsg>") + 10,
+ src.indexOf("</errorMsg>"));
+ } catch (Exception e) {
+ }
+// if (retCode == null || !retCode.equals("0000")) {
+// throw new Exception("ServerException: ErrorCode=" + retCode
+// + " ErrorMessage=" + errorMessage);
+// }
+ /**
+ * JyztStr
+ * 交易成功 90
+ * 银行已受理,可通过转账结果查询进行状态查证 94
+ * 交易处理中,需过转账结果查询接口进行状态查证 99或者值为空
+ *
+ * YddmStr
+ * 0000或000000表示成功,其他标识失败
+ */
+ if((JyztStr.equals("90") || JyztStr.equals("94") || JyztStr.equals("99"))
+ && (YddmStr.equals("0000") || YddmStr.equals("000000"))){
+ return true;
+ }else{
+ return false;
+ }
+ }
+ /**
+ * 处理返回信息
+ *
+ * @param src
+ * @throws Exception
+ */
+ public static boolean parseReturnValue(String src) throws Exception {
+ int beginIndex = src.indexOf("<sessionId>");
+ int endIndex = src.indexOf("</sessionId>");
+ String sessionIdRep = "";
+ if (beginIndex != -1 && endIndex != -1) {
+ sessionIdRep = src.substring(beginIndex + 11, endIndex);
+ }
+ if (!sessionIdRep.equals("-1") && !sessionId.equals("-1")
+ && !sessionId.equals(sessionIdRep))
+// throw new Exception("上送的sessionId和返回的sessionId不一致! " + src);
+ return false;
+ if (sessionId.equals("-1"))
+ sessionId = sessionIdRep;
+
+ retCode = src.substring(src.indexOf("<retCode>") + 9,
+ src.indexOf("</retCode>"));
+
+ String JyztStr = src.substring(src.indexOf("<JYZT>") + 6,
+ src.indexOf("</JYZT>"));
+
+ String YddmStr = src.substring(src.indexOf("<YDDM>") + 6,
+ src.indexOf("</YDDM>"));
+ try {
+ errorMessage = src.substring(src.indexOf("<errorMsg>") + 10,
+ src.indexOf("</errorMsg>"));
+ } catch (Exception e) {
+ }
+// if (retCode == null || !retCode.equals("0000")) {
+// throw new Exception("ServerException: ErrorCode=" + retCode
+// + " ErrorMessage=" + errorMessage);
+// }
+ /**
+ * JyztStr
+ * 交易成功 90
+ * 银行已受理,可通过转账结果查询进行状态查证 94
+ * 交易处理中,需过转账结果查询接口进行状态查证 99或者值为空
+ *
+ * YddmStr
+ * 0000或000000表示成功,其他标识失败
+ */
+ if((JyztStr.equals("90"))
+ && (YddmStr.equals("0000") || YddmStr.equals("000000"))){
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+ /**
+ * 读取返回信息
+ *
+ * @param in
+ * @param len
+ * @return
+ * @throws IOException
+ */
+ public static byte[] readContent(InputStream in, int len) throws IOException {
+ if (len <= 0) {
+ byte[] buf = new byte[2048];
+ byte[] readBuf = new byte[1024];
+ int totalLen = 0;
+ while (true) {
+ int readLen = in.read(readBuf);
+ if (readLen <= 0)
+ break;
+ if (totalLen + readLen > buf.length) {
+ byte[] tmp = new byte[buf.length + readLen + 1024];
+ System.arraycopy(buf, 0, tmp, 0, totalLen);
+ buf = tmp;
+ }
+ System.arraycopy(readBuf, 0, buf, totalLen, readLen);
+ totalLen = totalLen + readLen;
+ }
+ byte[] retBuf = new byte[totalLen];
+ System.arraycopy(buf, 0, retBuf, 0, totalLen);
+ return retBuf;
+ } else {
+ int totalLen = 0;
+ byte[] buf = new byte[len];
+ while (totalLen < len) {
+ int readLen = in.read(buf, totalLen, len - totalLen);
+ if (readLen <= 0)
+ break;
+ totalLen = totalLen + readLen;
+ }
+ return buf;
+ }
+ }
+}
diff --git a/src/main/resources/mapper/modules/MallMemberWithdrawMapper.xml b/src/main/resources/mapper/modules/MallMemberWithdrawMapper.xml
index e2c7bca..33c9191 100644
--- a/src/main/resources/mapper/modules/MallMemberWithdrawMapper.xml
+++ b/src/main/resources/mapper/modules/MallMemberWithdrawMapper.xml
@@ -10,4 +10,11 @@
and date_format(a.CREATED_TIME, '%Y-%m-%d') = date_format(#{date}, '%Y-%m-%d')
</select>
+ <select id="selectMsgByWithdrawNo" resultType="cc.mrbird.febs.mall.entity.MallMemberWithdrawMsg">
+ select
+ a.*
+ from mall_member_withdraw_msg a
+ where a.withdrawNo = #{withdrawNo}
+ </select>
+
</mapper>
\ No newline at end of file
--
Gitblit v1.9.1