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