HttpClient post请求 手机直冲案例

HttpClentDeliver 发货通用类

package net.etongbao.vasp.onpay.product;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.net.URLDecoder;import java.net.URLEncoder;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.protocol.HTTP;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/** * 请求客户端通用类 * * @author Fu Wei * */public class HttpClientDeliver {private static final Logger LOG = LoggerFactory.getLogger(HttpClientDeliver.class);public static final String CONTENT_TYPE = "application/x-www-form-urlencoded";/** * post请求 * * @param descUrl * @param strEntity * @return InputStream */public static InputStream clientPostDeliver(String descUrl, String strEntity) {DefaultHttpClient httpclient = new DefaultHttpClient();try {// 目标地址HttpPost httppost = new HttpPost(descUrl);LOG.debug("执行请求{}", httppost.getRequestLine());// 构造字符串数据StringEntity reqEntity = new StringEntity(strEntity);// 设置类型reqEntity.setContentType(CONTENT_TYPE);// 设置请求的数据httppost.setEntity(reqEntity);// 执行HttpResponse rsp = httpclient.execute(httppost);HttpEntity entity = rsp.getEntity();return entity.getContent();} catch (UnsupportedEncodingException e) {LOG.error("不支持的编码错误{}", e);httpclient.getConnectionManager().shutdown();} catch (ClientProtocolException e) {LOG.error("客户端协议错误{}", e);httpclient.getConnectionManager().shutdown();} catch (IOException e) {LOG.error("IO错误{}", e);httpclient.getConnectionManager().shutdown();} finally {// 当不再需要HttpClient的实例,关闭连接管理器,以确保立即释放所有系统资源,//当前不关闭管理器,否则在响应的大数据量内容只获取部分。//httpclient.getConnectionManager().shutdown();}return null;}/** * 系统使用UTF-8编码,中文字符需要把中文字替换成UTF-8编码 * * @param content * @param encoding * @return */public static String encode(final String content, final String encoding) {try {return URLEncoder.encode(content, encoding != null ? encoding : HTTP.DEFAULT_CONTENT_CHARSET);} catch (UnsupportedEncodingException e) {LOG.error("非法参数错误{}", e);throw new IllegalArgumentException(e);}}/** * 系统使用UTF-8 解码 * * @param content * @param encoding * @return */public static String decode(final String content, final String encoding) {try {return URLDecoder.decode(content, encoding != null ? encoding : HTTP.DEFAULT_CONTENT_CHARSET);} catch (UnsupportedEncodingException e) {LOG.error("非法参数错误{}", e);throw new IllegalArgumentException(e);}}}

手机直冲类

package net.etongbao.vasp.tc.resources.onpay;import static net.etongbao.common.utils.HttpClientDeliver.encode;import static net.etongbao.common.utils.HttpClientDeliver.decode;import static net.etongbao.common.utils.CheckUtils.isEmpty;import java.io.InputStream;import java.util.Date;import java.util.HashMap;import java.util.Map;import net.etongbao.common.utils.HttpClientDeliver;import net.etongbao.vasp.tc.resources.IDeliverGoods;import org.springframework.stereotype.Component;/** * 手机充值类 直冲模式和预查询都可以使用此类 <br> * 使用command来区分直冲和预查询模式 * <p> * 预查询模式优点:通过预查询模式,如遇见运营商维护以及没有对应商品等情况,<br> * 预查询接口会直接返回相关信息,这样的订单无需再次下单,可提高订单成功率 如果采用预查询模式, 则不能先预查询然后用“直冲请求”进行提交。 * <p> * 注意:预查询模式必须是在预查询(command=2)查询之后,再进行提交(command=1)。 * * @author Fu Wei * */@Componentpublic class MobileRecharge extends AbstractOnpay implements IDeliverGoods {//预查询模式private String RES_URL_SELECT = "xxxxx";//直冲模式private String RES_URL = "xxxx";// 预查询模式public int command = 0;public int getCommand() {return command;}/** * 设置域查询模式 <br> * 直冲模式:command=0 直接进行充值 默认为直冲模式<br> * 预查询模式:先通过预查询(command=2)查询是否可下单, <br> * 返回可下单后, 在代理商商城对用户扣款后,,再将原有信息再次提交(command=1) * * @param command */public void setCommand(int command) {this.command = command;}@Overridepublic Map<String, Object> execute(Map<String, Object> deliverMap) {// 产品idString prodid = String.valueOf(deliverMap.get("PDC_NO"));// 代理商订单号String orderid = String.valueOf(deliverMap.get("TSC_NO"));// 充值号码String mobilenum = String.valueOf(deliverMap.get("MOBILE_NUM"));String mark = MARK;StringBuilder sb = new StringBuilder(9);StringBuilder sbStrEntity = null;sb.append("prodid=").append(prodid).append(PARAMETER_SEPARATOR);sb.append("agentid=").append(AGENT_ID).append(PARAMETER_SEPARATOR);sb.append("backurl=").append(BACKURL).append(PARAMETER_SEPARATOR);sb.append("returntype=").append(RETURN_TYPE).append(PARAMETER_SEPARATOR);sb.append("orderid=").append(orderid).append(PARAMETER_SEPARATOR);sb.append("mobilenum=").append(mobilenum).append(PARAMETER_SEPARATOR);sb.append("source=").append(SOURCE).append(PARAMETER_SEPARATOR);// 预查询模式String url = RES_URL; if (command > 0) {sb.append("command=").append(command).append(PARAMETER_SEPARATOR);url = RES_URL_SELECT; }mark = !isEmpty(mark)? encode(mark, ENCODING):mark;sb.append("mark=").append(mark).append(PARAMETER_SEPARATOR);sbStrEntity = new StringBuilder(sb);sb.append("merchantKey=").append(MERCHANT_KEY);LOG.debug("MERCHANT_KEY:{}",sb);String verifystring = getVerifystring(sb.toString());sbStrEntity.append("verifystring=").append(verifystring);LOG.debug("客户端进行请求URL:{},参数串:{}", url, sbStrEntity.toString());// 发货InputStream in = HttpClientDeliver.clientPostDeliver(url, sbStrEntity.toString());Map<String, Object> resMap = null;// 获取响应mapMap<String, String> xmlMap = xmlParse(in);// 获取产品idprodid = xmlMap.get("prodid");// 获取代理商商城订单orderid = xmlMap.get("orderid");// 获取直冲接口平台订单号String tranid = xmlMap.get("tranid");// 获取返回码String resultno = xmlMap.get("resultno");// 获取预留字段mark = xmlMap.get("mark");// 获取响应摘要码String retVerifystring = xmlMap.get("verifystring");// 验证摘要串if (checkVerifystring(prodid, orderid, tranid, resultno, mark, retVerifystring)) {LOG.debug("订单号:{},响应摘要码验证成功", orderid);resMap = new HashMap<String, Object>();// 判断是否下单成功if (resultno.equals("0000")) {resMap.put("RES_TSC_NO", xmlMap.get("tranid"));} else {resMap.put("RES_TSC_NO", "");}resMap.put("DLVR_RET_CODE", resultno);resMap.put("DLVR_RET_DESC", resultNoMap.get(resultno));resMap.put("RES_TIME", new Date());resMap.put("RESERVED", mark);} else {LOG.debug("订单号:{},响应摘要码验证失败", orderid);}return resMap;}/** * 验证响应摘要串 * * @param prodid * @param orderid * @param tranid * @param resultno * @param mark * @param retVerifystring * @return */private boolean checkVerifystring(String prodid, String orderid, String tranid, String resultno, String mark,String retVerifystring) {StringBuilder sb = new StringBuilder(6);sb.append("prodid=").append(prodid).append(PARAMETER_SEPARATOR);sb.append("orderid=").append(orderid).append(PARAMETER_SEPARATOR);sb.append("tranid=").append(tranid).append(PARAMETER_SEPARATOR);sb.append("resultno=").append(resultno).append(PARAMETER_SEPARATOR);mark = !isEmpty(mark)? decode(mark, ENCODING):mark;sb.append("mark=").append(mark).append(PARAMETER_SEPARATOR);sb.append("merchantKey=").append(MERCHANT_KEY);return getVerifystring(sb.toString()).equals(retVerifystring);}}

抽象 AbstractOnpay.java

有山就有路,有河就能渡。

HttpClient post请求 手机直冲案例

相关文章:

你感兴趣的文章:

标签云: