前缀:

因为工作的需要,需要聚合支付来完成收费,因为本人写过工行聚合支付,来对比一下俩家聚合支付,工行聚合文档网上直接有(https://open.icbc.com.cn/icbc/apip/service.html),建行的话,还得申请,有银行人员给你。工行文档比较方便看,知道自己干嘛,都不需要问工行人员,唯一一点不好的就是,工行回调地址必须是80或者443端口,不知道最近工行有没有改变,20年的时候是需要指定的端口才能回调。建行的文档就是分的太细了,害我走了好多冤枉路,不得不吐槽一下,回调地址建行比较好,没有什么要求,废话不多说,直接上代码吧。

1.pom坐标

     <!-- https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt --><dependency><groupId>com.sun.xml.ws</groupId><artifactId>jaxws-rt</artifactId><version>2.3.0</version></dependency><dependency><groupId>com.sun.xml.bind</groupId><artifactId>jaxb-impl</artifactId><version>2.1.2</version></dependency><dependency><groupId> com.sun.xml.bind</groupId><artifactId> jaxb-core</artifactId><version> 2.2.11</version></dependency><!-- https://mvnrepository.com/artifact/javax.xml.bind/activation --><dependency><groupId>javax.xml.bind</groupId><artifactId>activation</artifactId><version>1.0.2</version></dependency><dependency><groupId>javax.xml.bind</groupId><artifactId>jaxb-api</artifactId><version>2.1</version></dependency><!--colletion集合--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.3</version></dependency><!--xml注解--><dependency><groupId>com.thoughtworks.xstream</groupId><artifactId>xstream</artifactId><version>1.4.10</version></dependency><!-- https://mvnrepository.com/artifact/commons-httpclient/commons-httpclient --><!--httpclientt--><dependency><groupId>commons-httpclient</groupId><artifactId>commons-httpclient</artifactId><version>3.1</version></dependency><!-- https://mvnrepository.com/artifact/com.alibaba/fastjson --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.74</version></dependency>

2.建行提供的工具类

1)HttpClientUtil ===》用来访问建行接口

package com.baiyou.qrcode.util;import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;import java.io.IOException;
import java.util.Iterator;
import java.util.Map;public class HttpClientUtil {public static String httpReader(String url, String code){System.out.println("GetPage:"+url);HttpClient client = new HttpClient();GetMethod method = new GetMethod(url);String result = null;try {client.executeMethod(method);int status = method.getStatusCode();if (status == HttpStatus.SC_OK) {result = method.getResponseBodyAsString();} else {System.out.println("Method failed: " + method.getStatusLine());}} catch (HttpException e) {System.out.println("Please check your provided http address!");e.printStackTrace();} catch (IOException e) {e.printStackTrace();} finally{if(method!=null)method.releaseConnection();method = null;client = null;}return result;}public static String httpGet(String url,String code) {System.out.println("GetPage:"+url);String content = null;HttpClient httpClient = new HttpClient();httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT,"Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2");GetMethod method = new GetMethod(url);try {int statusCode = httpClient.executeMethod(method);System.out.println("httpClientUtils::statusCode="+statusCode);System.out.println(method.getStatusLine());content = new String(method.getResponseBody(), code);} catch (Exception e) {System.out.println("time out");e.printStackTrace();} finally {if(method!=null)method.releaseConnection();method = null;httpClient = null;}return content;}public static String httpPost(String url, Map paramMap, String code) {System.out.println("GetPage:"+url);String content = null;if (url == null || url.trim().length() == 0 || paramMap == null|| paramMap.isEmpty())return null;HttpClient httpClient = new HttpClient();httpClient.getParams().setParameter(HttpMethodParams.USER_AGENT,"Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.1.2) Gecko/20090803 Fedora/3.5.2-2.fc11 Firefox/3.5.2");//PostMethod method = new PostMethod(url);Iterator it = paramMap.keySet().iterator();while (it.hasNext()) {String key = it.next() + "";Object o = paramMap.get(key);if (o != null && o instanceof String) {method.addParameter(new NameValuePair(key, o.toString()));}if (o != null && o instanceof String[]) {String[] s = (String[]) o;if (s != null)for (int i = 0; i < s.length; i++) {method.addParameter(new NameValuePair(key, s[i]));}}}try {int statusCode = httpClient.executeMethod(method);System.out.println("httpClientUtils::statusCode="+statusCode);System.out.println(method.getStatusLine());content = new String(method.getResponseBody(), code);} catch (Exception e) {System.out.println("time out");e.printStackTrace();} finally {if(method!=null)method.releaseConnection();method = null;httpClient = null;}return content;}public static String httpPost(String url, Map paramMap) {return HttpClientUtil.httpPost(url, paramMap, "UTF-8");}
}

2)MD5

package com.baiyou.qrcode.util;import java.io.*;
import java.security.*;public class MD5 {public static String md5Str(String str){if (str == null)return "";return md5Str(str, 0);}/*** 计算消息摘要。* @param data 计算摘要的数据。* @param offset 数据偏移地址。* @param length 数据长度。* @return 摘要结果。(16字节)*/public static String md5Str(String str, int offset){try{MessageDigest md5 = MessageDigest.getInstance("MD5");byte[] b = str.getBytes("UTF8");md5.update(b, offset, b.length);return byteArrayToHexString(md5.digest());}catch (NoSuchAlgorithmException ex){ex.printStackTrace();return null;}catch (UnsupportedEncodingException ex){ex.printStackTrace();return null;}}/**** @param b byte[]* @return String*/public static String byteArrayToHexString(byte[] b){String result = "";for (int i = 0; i < b.length; i++){result += byteToHexString(b[i]);}return result;}private static String[] hexDigits ={"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b","c", "d", "e", "f"};/*** 将字节转换为对应的16进制明文* @param b byte* @return String*/public static String byteToHexString(byte b){int n = b;if (n < 0){n = 256 + n;}int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}}

3)获取明天日期字符串

package com.baiyou.qrcode.util;import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** 获取明天时间* @author yangjie**/
public class TomorrowUtil {/*** 获取明天的日期字符串* @return*/public static String tomorrowDateStr(){Date date=new Date();//取时间Calendar calendar = Calendar.getInstance();calendar.setTime(date);//把日期往后增加一天.整数往后推,负数往前移动calendar.add(calendar.DATE,1);//这个时间就是日期往后推一天的结果date=calendar.getTime();SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");String tomorrowStr = formatter.format(date);return tomorrowStr;}
}

2.生成二维码方法和查询是否支付方法

package com.baiyou.qrcode.jianghang;import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Map;
import com.baiyou.qrcode.pojo.CrcodeResponse;
import com.baiyou.qrcode.pojo.Document;
import com.baiyou.qrcode.util.HttpClientUtil;
import com.baiyou.qrcode.util.MD5;
import com.baiyou.qrcode.util.TomorrowUtil;import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;/*** 建行二维码相关接口* @author yangjie**/
public class JIanghang {Logger logger = LoggerFactory.getLogger(JIanghang.class);/*** 商户代码*/private static String MERCHANTID="";/*** 商户柜台代码*/private static String  POSID="";/*** 分行代码*/private  static String   BRANCHID="";/*** 公钥  后九位*/private static String PUB32TR2= "";/*** 操作员编号*/private static  String   USER_ID="";/*** 操作员密码*/private static  String   PASSWORD="";private static   String   bankURL="https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain";/*** 日志*//*** 生成二维码* @param ORDERID  订单号 (商户代码后 9 位+自定义字符串(21位))* @param PAYMENT   金额*/public  void   createQrCode(String ORDERID,  String  PAYMENT) {logger.info("==================================生成二维码===================================");logger.info("入参:ORDERID:"+ORDERID+"\t"+"PAYMENT:"+PAYMENT);//建行访问路径//币种String CURCODE="01";//建行交易码  统一为530550String TXCODE = "530550";//备注1String REMARK1 = "";//备注2String REMARK2 = "";/*** 返回类型   0或空:返回二维码页面,只支持建行龙支付;1:返回 JSON 格式【二维码信息串】,只支持建行龙支付;2:返回聚合扫码二维码页面;3:返回聚合扫码 JSON格式【二维码信息串】聚合扫码只能上送 2 或 34:返回聚合银联二维码信息串*/String RETURNTYPE="3";//失效时间     格式YYYYMMDDHHMMSSString TIMEOUT = TomorrowUtil.tomorrowDateStr();StringBuffer tmp = new StringBuffer(); //验签字段tmp.append("MERCHANTID=");tmp.append(this.MERCHANTID);tmp.append("&POSID=");tmp.append(this.POSID);tmp.append("&BRANCHID=");tmp.append(this.BRANCHID);tmp.append("&ORDERID=");tmp.append(ORDERID);tmp.append("&PAYMENT=");tmp.append(PAYMENT);tmp.append("&CURCODE=");tmp.append(CURCODE);tmp.append("&TXCODE=");tmp.append(TXCODE);tmp.append("&REMARK1=");tmp.append(REMARK1);tmp.append("&REMARK2=");tmp.append(REMARK2);tmp.append("&RETURNTYPE=");tmp.append(RETURNTYPE);tmp.append("&TIMEOUT=");tmp.append(TIMEOUT);tmp.append("&PUB=");tmp.append(this.PUB32TR2);Map map = new HashMap();map.put("CCB_IBSVersion","V6");    //必输项map.put("MERCHANTID",MERCHANTID);map.put("BRANCHID",BRANCHID);map.put("POSID",POSID);map.put("ORDERID",ORDERID);map.put("PAYMENT",PAYMENT);map.put("CURCODE",CURCODE);map.put("TXCODE",TXCODE);map.put("REMARK1",REMARK1);map.put("REMARK2",REMARK2);map.put("RETURNTYPE",RETURNTYPE);map.put("TIMEOUT",TIMEOUT);map.put("MAC", MD5.md5Str(tmp.toString()));//请求二维码生成链接串logger.info("入参:"+map);String post = HttpClientUtil.httpPost(this.bankURL, map);logger.info("第一次响应的信息:"+post);CrcodeResponse crcodeResponse= JSONObject.parseObject(post,CrcodeResponse.class);if(crcodeResponse.getSUCCESS()!=null   &&  crcodeResponse.getSUCCESS().equals("true") ) {try {String   payUrl=crcodeResponse.getPAYURL();String   response=HttpClientUtil.httpGet(payUrl, "utf-8");String qrurl = JSONObject.parseObject(response).getString("QRURL");String decode = URLDecoder.decode(qrurl, "utf-8");logger.info("二维码信息:"+decode);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 查询支付是否成功* @param ORDERDATE  订单时间* @param ORDERID   订单号码*///服务器反馈public  void  searchIsPayForWeb(String ORDERDATE,String ORDERID) {logger.info("===========================================查询商户是否支付成功====================");logger.info("入参:ORDERDATE"+ORDERDATE+"\t"+"ORDERID:"+ORDERID);//商户代码// String MERCHANTID ="";//分行代码//  String BRANCHID="";//柜台号//String POSID="";//订单日期   ORDERDATE 与 ORDERID 必须有一个输入// String ORDERDATE="20160811";//起始时间   元素必须有,但值可为空String BEGORDERTIME="00:00:00";//订单截止时间   元素必须有,但值可为空String ENDORDERTIME="23:59:59";//订单号   元素必须有,但值可为空// String ORDERID = "";//查询密码    必输项,主管或操作员的登录密码String QUPWD="";//流水类型 TYPE   必输项  0支付流水   1退款流水String TYPE="0";//交易码String TXCODE="410408";//流水状态  必须项    0未结算流水    1已结算流水String KIND="0";//交易状态    必须项   0失败   1成功   2不确定   3全部    已结算流水查询不支持全部String STATUS="1";//  查询方式 SEL_TYPE     必输项   1页面形式   2文件返回形式   3xml页面形式String SEL_TYPE="3";//页码pageString PAGE = "1";//操作员String OPERATOR="";String BEGORDERID="";String ENDORDERID="";//预留字段String CHANNEL = "";String bankURLSearch="https://ibsbjstar.ccb.com.cn/app/ccbMain";String param ="MERCHANTID="+this.MERCHANTID+"&BRANCHID="+this.BRANCHID+"&POSID="+this.POSID+"&ORDERDATE="+ORDERDATE+"&BEGORDERTIME="+BEGORDERTIME+"&ENDORDERTIME="+ENDORDERTIME+"&BEGORDERID="+BEGORDERID+"&ENDORDERID="+ENDORDERID+"&QUPWD=&TXCODE="+TXCODE+"&SEL_TYPE="+SEL_TYPE+"&OPERATOR="+OPERATOR;if("410408".equals(TXCODE)){param ="MERCHANTID="+MERCHANTID+"&BRANCHID="+BRANCHID+"&POSID="+POSID+"&ORDERDATE="+ORDERDATE+"&BEGORDERTIME="+BEGORDERTIME+"&ENDORDERTIME="+ENDORDERTIME+"&ORDERID="+ORDERID+"&QUPWD=&TXCODE="+TXCODE+"&TYPE="+TYPE+"&KIND="+KIND+"&STATUS="+STATUS+"&SEL_TYPE="+SEL_TYPE+"&PAGE="+PAGE+"&OPERATOR="+OPERATOR+"&CHANNEL="+CHANNEL;}Map map = new HashMap();map.put("MERCHANTID",this.MERCHANTID);map.put("BRANCHID",this.BRANCHID);map.put("POSID",this.POSID);map.put("ORDERDATE",ORDERDATE);map.put("BEGORDERTIME",BEGORDERTIME);map.put("ENDORDERTIME",ENDORDERTIME);map.put("BEGORDERID",BEGORDERID);map.put("ENDORDERID",ENDORDERID);map.put("QUPWD",QUPWD);map.put("TXCODE",TXCODE);if("410408".equals(TXCODE)){map.put("TYPE",TYPE);map.put("KIND",KIND);map.put("STATUS",STATUS);map.put("ORDERID",ORDERID);map.put("PAGE",PAGE);map.put("CHANNEL",CHANNEL);}map.put("SEL_TYPE",SEL_TYPE);map.put("OPERATOR",OPERATOR);map.put("MAC",MD5.md5Str(param));logger.info("入参"+map);String ret = HttpClientUtil.httpPost(bankURLSearch, map);ret = ret.replaceAll("\\n", "").replaceAll("\\t", "").replaceAll("\\r", "");if(ret !=null   &&  !ret.equals("")){JAXBContext jaxbContext=null;Unmarshaller unmarshaller=null;Document document=null;try {logger.info("ret::"+ret);jaxbContext = JAXBContext.newInstance(Document.class);unmarshaller = jaxbContext.createUnmarshaller();document= (Document)unmarshaller.unmarshal(new StringReader(ret));logger.info("document==={}"+document);}catch (Exception   e){e.printStackTrace();}}}}

3.实体类

1)建行生成二维码第一次响应实体类

package com.baiyou.qrcode.pojo;import java.io.Serializable;/*** 建行响应信息* @author yangjie**/
public class CrcodeResponse  implements Serializable{/*** 响应成功信息*/private  String  SUCCESS;/***二次请求路径*/private   String   PAYURL;public String getSUCCESS() {return SUCCESS;}public void setSUCCESS(String sUCCESS) {SUCCESS = sUCCESS;}public String getPAYURL() {return PAYURL;}public void setPAYURL(String pAYURL) {PAYURL = pAYURL;}
}

2)回调入参的实体类

package com.baiyou.qrcode.pojo;import lombok.Data;import java.io.Serializable;@Data
public class PayCallBackEntity  implements Serializable {private String POSID; //商户柜台代码private String BRANCHID;//分行代码private String ORDERID; //定单号private String PAYMENT; //付款金额private String CURCODE;  //币种private String REMARK1;  //备注一private String REMARK2;  //备注二private String ACC_TYPE;  //账户类型  服务器通知中有此字段返回且参与验签private String SUCCESS;  //成功标志  成功-Y,失败-Nprivate String TYPE;   //接口类型  分行业务人员在P2员工渠道后台设置防钓鱼的开关。 1.开关关闭时,无此字段返回且不参与验签 2.开关打开时,有此字段返回且参与验签。参数值为 1-防钓鱼接口private String REFERER;  //Referer信息  分行业务人员在P2员工渠道后台设置防钓鱼开关。 1.开关关闭时,无此字段返回且不参与验签。 2.开关打开时,有此字段返回且参与验签private String CLIENTIP;  //客户端IP  分行业务人员在P2员工渠道后台设置防钓鱼的开关。 1.开关关闭时,无此字段返回且不参与验签 2.开关打开时,有此字段返回且参与验签。参数值为 客户在建行系统中的IPprivate String ACCDATE;  //系统记账日期  商户登陆商户后台设置返回记账日期的开关 1.开关关闭时,无此字段返回且不参与验签。 2.开关打开时,有此字段返回且参与验签。参数值格式为YYYYMMDD(如20100907)。private String USRMSG; //支付账户信息  分行业务人员在P2员工渠道后台设置防钓鱼开关和返回账户信息的开关。 1.开关关闭时,无此字段返回且不参与验签。2.开关打开但支付失败时,无此字段返回且不参与验签。3.开关打开且支付成功时,有此字段返回且参与验签。无PAYTYPE返回时,参数值格式如下:“姓名|账号加密后的密文”。有PAYTYPE返回时,该参数值为空。private String USRINFO;   //客户加密信息   分行业务人员在P2员工渠道后台设置防钓鱼开关和客户信息加密返回的开关。 1.开关关闭时,无此字段返回且不参与验签private String PAYTYPE;  //支付方式   ALIPAY:支付宝 WEIXIN:微信 为空:建行龙支付 该字段有返回时参与验签,无此字段返回时不参与验签。private String SIGN;  //数字签名
}

3)建行回调的信息,将xml转化实体类

package com.baiyou.qrcode.pojo;import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.util.ArrayList;
import java.util.List;/*** 查询建行响应的类*/
@XmlRootElement(name = "DOCUMENT")
public class Document {/*** 返回码   交易返回码,成功时总为 000000*/@XmlElement(name = "RETURN_CODE")private String   RETURN_CODE;/*** 响应信息*/@XmlElement(name = "RETURN_MSG")private   String   RETURN_MSG;/*** 当前页*/@XmlElement(name = "CURPAGE")private String    CURPAGE;/*** 总页数*/@XmlElement(name = "PAGECOUNT")private   String   PAGECOUNT;/*** 总笔数*/@XmlElement(name = "TOTAL")private   String   TOTAL;/*** 支付总金额*/@XmlElement(name = "PAYAMOUNT")private   String    PAYAMOUNT;/*** 退款总金额*/@XmlElement(name = "REFUNDAMOUNT")private   String    REFUNDAMOUNT;@XmlElement(name = "QUERYORDER")private List<QueryOrder>  queryOrders=new ArrayList<>();@XmlTransientpublic String getRETURN_CODE() {return RETURN_CODE;}public void setRETURN_CODE(String RETURN_CODE) {this.RETURN_CODE = RETURN_CODE;}@XmlTransientpublic String getRETURN_MSG() {return RETURN_MSG;}public void setRETURN_MSG(String RETURN_MSG) {this.RETURN_MSG = RETURN_MSG;}@XmlTransientpublic String getCURPAGE() {return CURPAGE;}public void setCURPAGE(String CURPAGE) {this.CURPAGE = CURPAGE;}@XmlTransientpublic String getPAGECOUNT() {return PAGECOUNT;}public void setPAGECOUNT(String PAGECOUNT) {this.PAGECOUNT = PAGECOUNT;}@XmlTransientpublic String getTOTAL() {return TOTAL;}public void setTOTAL(String TOTAL) {this.TOTAL = TOTAL;}@XmlTransientpublic String getPAYAMOUNT() {return PAYAMOUNT;}public void setPAYAMOUNT(String PAYAMOUNT) {this.PAYAMOUNT = PAYAMOUNT;}@XmlTransientpublic String getREFUNDAMOUNT() {return REFUNDAMOUNT;}public void setREFUNDAMOUNT(String REFUNDAMOUNT) {this.REFUNDAMOUNT = REFUNDAMOUNT;}@XmlTransientpublic List<QueryOrder> getQueryOrders() {return queryOrders;}public void setQueryOrders(List<QueryOrder> queryOrders) {this.queryOrders = queryOrders;}@Overridepublic String toString() {return "Document{" +"RETURN_CODE='" + RETURN_CODE + '\'' +", RETURN_MSG='" + RETURN_MSG + '\'' +", CURPAGE='" + CURPAGE + '\'' +", PAGECOUNT='" + PAGECOUNT + '\'' +", TOTAL='" + TOTAL + '\'' +", PAYAMOUNT='" + PAYAMOUNT + '\'' +", REFUNDAMOUNT='" + REFUNDAMOUNT + '\'' +", queryOrders=" + queryOrders +'}';}/*** 子类   详细信息*/public static class  QueryOrder{/*** 商户代码*/@XmlElement(name = "MERCHANTID")private   String    MERCHANTID;/*** 分行代码*/@XmlElement(name = "BRANCHID")private   String   BRANCHID;/*** 柜台号码*/@XmlElement(name = "POSID")private   String   POSID;/*** 订单号*/@XmlElement(name = "ORDERID")private   String  ORDERID;/*** 支付/退款交易时间*/@XmlElement(name = "ORDERDATE")private   String  ORDERDATE;/*** 记录日期*/@XmlElement(name = "ACCDATE")private   String    ACCDATE;/*** 支付金额*/@XmlElement(name = "AMOUNT")private   String   AMOUNT;/*** 支付、退款状态*/@XmlElement(name = "STATUSCODE")private  String   STATUSCODE;/*** 退款金额*/@XmlElement(name = "STATUS")private  String  STATUS;/*** 签名串*/@XmlElement(name = "SIGN")private String   SIGN;@XmlTransientpublic String getMERCHANTID() {return MERCHANTID;}public void setMERCHANTID(String MERCHANTID) {this.MERCHANTID = MERCHANTID;}@XmlTransientpublic String getBRANCHID() {return BRANCHID;}public void setBRANCHID(String BRANCHID) {this.BRANCHID = BRANCHID;}@XmlTransientpublic String getPOSID() {return POSID;}public void setPOSID(String POSID) {this.POSID = POSID;}@XmlTransientpublic String getORDERID() {return ORDERID;}public void setORDERID(String ORDERID) {this.ORDERID = ORDERID;}@XmlTransientpublic String getORDERDATE() {return ORDERDATE;}public void setORDERDATE(String ORDERDATE) {this.ORDERDATE = ORDERDATE;}@XmlTransientpublic String getACCDATE() {return ACCDATE;}public void setACCDATE(String ACCDATE) {this.ACCDATE = ACCDATE;}@XmlTransientpublic String getAMOUNT() {return AMOUNT;}public void setAMOUNT(String AMOUNT) {this.AMOUNT = AMOUNT;}@XmlTransientpublic String getSTATUSCODE() {return STATUSCODE;}public void setSTATUSCODE(String STATUSCODE) {this.STATUSCODE = STATUSCODE;}@XmlTransientpublic String getSTATUS() {return STATUS;}public void setSTATUS(String STATUS) {this.STATUS = STATUS;}@XmlTransientpublic String getSIGN() {return SIGN;}public void setSIGN(String SIGN) {this.SIGN = SIGN;}@Overridepublic String toString() {return "QueryOrder{" +"MERCHANTID='" + MERCHANTID + '\'' +", BRANCHID='" + BRANCHID + '\'' +", POSID='" + POSID + '\'' +", ORDERID='" + ORDERID + '\'' +", ORDERDATE='" + ORDERDATE + '\'' +", ACCDATE='" + ACCDATE + '\'' +", AMOUNT='" + AMOUNT + '\'' +", STATUSCODE='" + STATUSCODE + '\'' +", STATUS='" + STATUS + '\'' +", SIGN='" + SIGN + '\'' +'}';}}
}

4.回调接口

package com.baiyou.qrcode.controller;import com.baiyou.qrcode.jianghang.JIanghang;
import com.baiyou.qrcode.pojo.PayCallBackEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
import java.util.Map;/*** 建行回调信息*/
@RestController
@RequestMapping(value = "/lis/qecode")
public class ReposeControlller {Logger logger = LoggerFactory.getLogger(ReposeControlller.class);/****/@RequestMapping(value = "/notify")public   String   reposeController( PayCallBackEntity   payCallBackEntity, HttpServletResponse  response){logger.info("payCallBackEntity ={}"+payCallBackEntity);System.out.println("payCallBackEntity = " + payCallBackEntity);String success = payCallBackEntity.getSUCCESS();String orderId = payCallBackEntity.getORDERID();String payment = payCallBackEntity.getPAYMENT();logger.info("success: -" + success);logger.info("orderId: -" + orderId);if ("Y".equals(success)) {JIanghang  jIanghang=new JIanghang();jIanghang.searchIsPayForWeb("", orderId);} else {//支付失败}return "ok";}
}

备注:我是基于web接入处理的。你也可以参考https://blog.csdn.net/TimorRed/article/details/105070419这位大佬的,我也是借鉴这位大佬。

java聚合支付之建行相关推荐

  1. Java 聚合支付 实战 XorPay

    请看效果 支付项目成果视频 效果很简单: 用户输入手机号登录. 登录成功,也注册成功,然后请求支付二维码. 用户扫码付款,然后后端接收支付回调,更改用户已支付. 用户点击按钮刷新页面,发现已支付,查看 ...

  2. java对接支付宝微信银联_经典设计模式之策略模式【如何重构聚合支付平台,对接【支付宝,微信,银联支付】】(示例代码)...

    写在前面:设计模式源于生活,而又高于生活! 为什么要使用设计模式重构代码 使用设计模式可以重构整体架构代码.提高代码复用性.扩展性.减少代码冗余问题. Java高级工程师装逼的技能! 什么是策略模式 ...

  3. java对接聚合支付(计全付)

    目录 背景 准备工作,注册获取开发参数 开发 下单接口 回调接口 查询订单接口 背景 项目中本来是使用微信和支付宝分开的收款码收款,现在需要实现一张二维码图片,微信/支付宝 都能扫码付款 这里可以先看 ...

  4. 建行聚合支付及支付宝二维码开发经验(C语言)

    由于笔者之前专业只是学习电子电路相关知识,参加工作后接手了一个对接建行的聚合支付二维码项目.之前我更改过设备中支付宝二维码的bug,而不是完整的开发工作.所以这是我第一次真正的对接一个API的项目,让 ...

  5. 建行聚合支付及支付宝二维码开发经验(C语言2)

    这篇文章本来是存在有道云中的,修改了部分代码在这里也发表一次吧. 本文章共分为两个部分:第一部分为linux的libcurl库的介绍和使用.第二部分为decode后链接生成二维码的方式. 1.linu ...

  6. 快钱 java demo_快钱聚合支付(一码付)对接demo

    备注:以下代码基于PHP laravel框架,引用了自带的函数.array_get($array, "key") 为数组中取元素,类似于$array["key" ...

  7. java第四方聚合支付,2017年第四方和第三方聚合支付平台排名

    今年,很多商店或超市都不再只有支付宝和微信钱包的选择支付模式,而且一种新的支付方式 – 聚合支付正在出现.聚合支付在第三方支付与商家之间,支付许可证没有限制.这种方式是通过各种第三方支付平台,合作银行 ...

  8. 精讲23种设计模式-策略模式~聚合短信服务和聚合支付服务

    文章目录 一.设计模式 1. 为什么需要使用设计模式 2. 设计模式的分类 3. 什么是策略模式 4. 为什么叫做策略模式 5. 策略模式优缺点 6. 策略模式应用场景 7. Spring框架中使用的 ...

  9. java在线支付---13.java在线支付所有源码:

    13.java在线支付所有源码: 创梦综合技术qq交流群:CreDream:251572072 ------------------------------------- a.新建工程payment ...

  10. 付呗聚合支付快速教程——导读

    一.前文 本专栏基于Java Spring Boot后端+微信小程序前端实现自建软件系统 通过本专栏,可快速对接付呗接口,快速集成付呗聚合支付 集成付呗聚合支付,目的是 微信支付的费率更低 分账提现更 ...

最新文章

  1. 算法小论——第三章 又把新桃换旧符
  2. FACTORY设计模式【让吃货也能理解的程序】
  3. 如何使scp命令在主机之间复制时不用输入密码
  4. 利用KMP算法判断一个树是否是另一个树的子树
  5. 5. 连续时间马氏过程-强Markov族
  6. java table 数据绑定,ireport5.6使用table组件,如何用table显示javaBean数据源
  7. VUE使用Stylus插件
  8. python字符串一(字符串的书写输入输出)
  9. 启动两个tomcat,两个端口,两个tomcat都启动时回显示端口被占用
  10. ERP系统重新打开订单的后台限制解析
  11. 杭州有那些APP外包公司?
  12. Jmeter下载与安装
  13. elementUI中upload上传组件点击上传按钮,选择文件框弹出前进行提示点击确定则继续弹框选择文件上传
  14. android安装包解析错误
  15. 内卷的国货彩妆下,完美日记还能“火”多久?
  16. java下载excel导入excel读取excel数据,将数据插入数据库
  17. oracle数据库(表、视图、索引、事务)
  18. 照片文件损坏能修复吗?
  19. 谁打开了便携笔记本的潘多拉盒子
  20. 今年你们年终奖是啥?漂亮不?

热门文章

  1. Cisco 思科模拟器命令
  2. antd table input 失焦的问题
  3. PPT封面怎样设计才更赏心悦目
  4. Python计算中国GDP在那一年超越美国GDP(假设)
  5. oracle cude报错,转载oracle rollup和cube函数使用心得
  6. intro是啥意思_Intro是什么意思?
  7. WordPress网站配置腾讯云cdn缓存
  8. u盘安全弹出有什么用?数据丢失还能恢复吗
  9. PHPstudy使用教程
  10. SpringBoot自定义Starter(二十四)