ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java聚合支付之建行

2021-04-13 19:57:39  阅读:712  来源: 互联网

标签:建行 map 聚合 String java private return import public


前缀:

       因为工作的需要,需要聚合支付来完成收费,因为本人写过工行聚合支付,来对比一下俩家聚合支付,工行聚合文档网上直接有(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";
		//建行交易码  统一为530550
		String TXCODE = "530550";
		//备注1
		String REMARK1 = "";
		//备注2
		String REMARK2 = "";
		/**
		 * 返回类型   0或空:返回二维码页面,只支持建行龙支付;
		 1:返回 JSON 格式【二维码信息串】,只支持建行龙支付;
		 2:返回聚合扫码二维码页面;
		 3:返回聚合扫码 JSON格式【二维码信息串】聚合扫码只能上送 2 或 3
		 4:返回聚合银联二维码信息串
		 */
		String RETURNTYPE="3";
		//失效时间     格式YYYYMMDDHHMMSS
		String 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 block
				e.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";
		//页码page
		String 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,失败-N
    private String TYPE;   //接口类型  分行业务人员在P2员工渠道后台设置防钓鱼的开关。 1.开关关闭时,无此字段返回且不参与验签 2.开关打开时,有此字段返回且参与验签。参数值为 1-防钓鱼接口

    private String REFERER;  //Referer信息  分行业务人员在P2员工渠道后台设置防钓鱼开关。 1.开关关闭时,无此字段返回且不参与验签。 2.开关打开时,有此字段返回且参与验签
    private String CLIENTIP;  //客户端IP  分行业务人员在P2员工渠道后台设置防钓鱼的开关。 1.开关关闭时,无此字段返回且不参与验签 2.开关打开时,有此字段返回且参与验签。参数值为 客户在建行系统中的IP
    private 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<>();
     @XmlTransient
    public String getRETURN_CODE() {
        return RETURN_CODE;
    }

    public void setRETURN_CODE(String RETURN_CODE) {
        this.RETURN_CODE = RETURN_CODE;
    }
    @XmlTransient
    public String getRETURN_MSG() {
        return RETURN_MSG;
    }

    public void setRETURN_MSG(String RETURN_MSG) {
        this.RETURN_MSG = RETURN_MSG;
    }
    @XmlTransient
    public String getCURPAGE() {
        return CURPAGE;
    }

    public void setCURPAGE(String CURPAGE) {
        this.CURPAGE = CURPAGE;
    }
    @XmlTransient
    public String getPAGECOUNT() {
        return PAGECOUNT;
    }

    public void setPAGECOUNT(String PAGECOUNT) {
        this.PAGECOUNT = PAGECOUNT;
    }
    @XmlTransient
    public String getTOTAL() {
        return TOTAL;
    }

    public void setTOTAL(String TOTAL) {
        this.TOTAL = TOTAL;
    }
    @XmlTransient
    public String getPAYAMOUNT() {
        return PAYAMOUNT;
    }

    public void setPAYAMOUNT(String PAYAMOUNT) {
        this.PAYAMOUNT = PAYAMOUNT;
    }
    @XmlTransient
    public String getREFUNDAMOUNT() {
        return REFUNDAMOUNT;
    }

    public void setREFUNDAMOUNT(String REFUNDAMOUNT) {
        this.REFUNDAMOUNT = REFUNDAMOUNT;
    }
    @XmlTransient
    public List<QueryOrder> getQueryOrders() {
        return queryOrders;
    }

    public void setQueryOrders(List<QueryOrder> queryOrders) {
        this.queryOrders = queryOrders;
    }

    @Override
    public 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;

        @XmlTransient
        public String getMERCHANTID() {
            return MERCHANTID;
        }

        public void setMERCHANTID(String MERCHANTID) {
            this.MERCHANTID = MERCHANTID;
        }
        @XmlTransient
        public String getBRANCHID() {
            return BRANCHID;
        }

        public void setBRANCHID(String BRANCHID) {
            this.BRANCHID = BRANCHID;
        }
        @XmlTransient
        public String getPOSID() {
            return POSID;
        }

        public void setPOSID(String POSID) {
            this.POSID = POSID;
        }
        @XmlTransient
        public String getORDERID() {
            return ORDERID;
        }

        public void setORDERID(String ORDERID) {
            this.ORDERID = ORDERID;
        }
        @XmlTransient
        public String getORDERDATE() {
            return ORDERDATE;
        }

        public void setORDERDATE(String ORDERDATE) {
            this.ORDERDATE = ORDERDATE;
        }
        @XmlTransient
        public String getACCDATE() {
            return ACCDATE;
        }

        public void setACCDATE(String ACCDATE) {
            this.ACCDATE = ACCDATE;
        }
        @XmlTransient
        public String getAMOUNT() {
            return AMOUNT;
        }

        public void setAMOUNT(String AMOUNT) {
            this.AMOUNT = AMOUNT;
        }
        @XmlTransient
        public String getSTATUSCODE() {
            return STATUSCODE;
        }

        public void setSTATUSCODE(String STATUSCODE) {
            this.STATUSCODE = STATUSCODE;
        }
        @XmlTransient
        public String getSTATUS() {
            return STATUS;
        }

        public void setSTATUS(String STATUS) {
            this.STATUS = STATUS;
        }
        @XmlTransient
        public String getSIGN() {
            return SIGN;
        }

        public void setSIGN(String SIGN) {
            this.SIGN = SIGN;
        }

        @Override
        public 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这位大佬的,我也是借鉴这位大佬。

标签:建行,map,聚合,String,java,private,return,import,public
来源: https://blog.csdn.net/weixin_42121557/article/details/115676182

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有