- 浏览: 182448 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
yjc2020:
问个问题,spring batch 批量写数据时能否做日志输出 ...
spring Batch实现数据库大数据量读写 -
JimmyLincole:
yjc2020 写道JimmyLincole 写道1楼的问题, ...
spring Batch实现数据库大数据量读写 -
yjc2020:
JimmyLincole 写道1楼的问题,解决方法可以看一下这 ...
spring Batch实现数据库大数据量读写 -
JimmyLincole:
1楼的问题,解决方法可以看一下这个:The issue her ...
spring Batch实现数据库大数据量读写 -
yjc2020:
我也遇到了1楼的错误 Reader must be open ...
spring Batch实现数据库大数据量读写
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 * */ @Component public 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; } @Override public Map<String, Object> execute(Map<String, Object> deliverMap) { // 产品id String 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; // 获取响应map Map<String, String> xmlMap = xmlParse(in); // 获取产品id prodid = 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
package net.etongbao.vasp.tc.resources.onpay; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.w3c.dom.DOMException; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; import net.etongbao.common.utils.HttpClientDeliver; import net.etongbao.common.utils.KeyedDigestMD5; import net.etongbao.vasp.tc.resources.IDeliverGoods; import static net.etongbao.common.utils.CheckUtils.isEmpty; /** * 发货类 * * @author Fu Wei * */ public abstract class AbstractOnpay { public static final String PARAMETER_SEPARATOR = "&"; public static final String ENCODING = "UTF-8"; public static final String DECODING = "UTF-8"; public static final Logger LOG = LoggerFactory.getLogger(AbstractOnpay.class); // 代理商ID 代理商在19pay代理平台的登录名 String AGENT_ID = "xxxxx"; // 直冲请求返回url 非空(当returntype为2时可为空) String BACKURL = ""; // 返回类型 1表示post返回 2表示返回XML信息 String RETURN_TYPE = "2"; // 预留字段 预留字段,代理商系统返回时原样带回 String MARK = ""; // 加密串 String MERCHANT_KEY = "xxxxxx"; // 代理商来源 代理商商城请填写esales String SOURCE = "esales"; Map<String, String> resultNoMap = new HashMap<String, String>(); public AbstractOnpay() { resultNoMap.put("0000", "下单成功"); resultNoMap.put("0001", "支付失败"); resultNoMap.put("0999", "未开通直冲功能"); resultNoMap.put("1000", "下单失败,未扣款,重新提交订单"); resultNoMap.put("1001", "传入参数不完整"); resultNoMap.put("1002", "验证摘要串验证失败"); resultNoMap.put("1022", "充值号码格式错误 "); resultNoMap.put("1003", "代理商验证失败"); resultNoMap.put("1004", "代理商未激活"); resultNoMap.put("1005", "没有对应充值产品"); resultNoMap.put("1006", "系统异常,请稍后重试"); resultNoMap.put("1007", "账户余额不足"); resultNoMap.put("1016", "交易密码验证错误,请联系管理员 "); resultNoMap.put("1008", "此产品超出当天限额 ,请联系业务人员"); resultNoMap.put("1009", "没有对应订单"); resultNoMap.put("1010", "产品与手机号不匹配"); resultNoMap.put("1011", "定单号不允许重复"); resultNoMap.put("1012", "IP地址不符合要求"); resultNoMap.put("1013", "运营商系统升级,暂不能充值"); resultNoMap.put("1015", "无法查到对应号段"); resultNoMap.put("1017", "话费新加的充值限制,同一个号码10秒内只能充值一次"); } /** * 获取节点元素 * * @param in * @return */ protected Element getXmlElement(InputStream in) { try { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(in); // 获得根节点StuInfo Element el = doc.getDocumentElement(); return el; } catch (DOMException e) { LOG.error("DOM错误", e); } catch (ParserConfigurationException e) { LOG.error("DocumentBuilder 创建失败", e); } catch (SAXException e) { LOG.error("XML文档数据格式验证失败", e); } catch (IOException e) { LOG.error("流操作失败", e); } return null; } /** * 解析发货响应xml * * @param in * @return */ protected Map<String, String> xmlParse(InputStream in) { Map<String, String> xmlMap = new HashMap<String, String>(); Element el = getXmlElement(in); NodeList nodeList = el.getElementsByTagName("item"); for (int i = 0; i < nodeList.getLength(); i++) { Node node = nodeList.item(i); NamedNodeMap nodeMap = node.getAttributes(); String name = nodeMap.getNamedItem("name").getNodeValue(); String value = nodeMap.getNamedItem("value").getNodeValue(); if (name.equals("mark") && !isEmpty(value)) { value = HttpClientDeliver.decode(value,DECODING); } xmlMap.put(name, value); } return xmlMap; } /** * 获取验证摘要串 * * @param merchantKey 加密串 * @param srcString 源串 * @return */ protected static String getVerifystring(String strSrc) { return KeyedDigestMD5.getKeyedDigest(strSrc, ""); } }
发货接口
package net.etongbao.vasp.tc.resources; import java.util.Map; /** * 发货接口 * * @author Fu Wei * */ public interface IDeliverGoods { /**执行接口操作 * * @param deliverMap */ public Map<String,Object> execute(Map<String,Object> deliverMap); }
发表评论
-
apache
2013-04-16 13:31 10261.Apache POI 处理office文档用到的 ... -
java获取上一天日期
2012-07-26 10:56 1558long currMi = System.cur ... -
System.currentTimeMillis() vs. new Date() vs. Calendar.getInstance().getTime()
2012-07-26 10:53 1788System.currentTimeMillis() i ... -
TODO XXX FIXME 自定义标签
2012-01-29 11:44 8631 TODO 表示需要实现,但目前还未实 ... -
Oracle中的Blob字段的处理
2012-01-12 09:19 2414Oracle中的Bloc字段的处理较其他字段来说,会有 ... -
csv格式读取通用类
2012-01-06 10:33 4875需要添加javacsv.jar 支持 import s ... -
plsql developer格式化sql为java代码
2011-07-22 10:55 1700plsql developer格式化sql后直接cop ... -
Spring Quartz Batch
2011-07-15 15:18 2239WEB-INF\web.xml <context-p ... -
使用Quartz或Timer完成时序调度工作
2011-07-15 13:39 970使用Quartz或Timer完成时序调度工作 ... -
几种常用的Java数据源解决方案
2011-03-21 11:21 1050Java中的数据源就是javax.sql.DataSour ... -
java反射
2011-03-19 08:48 1137/** * @Title: 反射方式调用构造方法 ... -
150道java基础选择题
2011-02-24 12:49 2145150道java基础选择题
相关推荐
try(CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(url); StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8")); ...
在使用HttpClient发送POST请求时,我们需要关心两个方面的问题:一是如何忽略证书验证过程,二是如何发送POST请求。对于前者,我们可以使用X509TrustManager来忽略证书验证过程。对于后者,我们可以使用HttpPost对象...
本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...
接下来,我们将探讨如何使用HTTPClient发送POST请求并附带JSON数据。首先,你需要创建一个`CloseableHttpClient`实例,然后使用`HttpPost`对象来指定请求URL。在POST请求中,我们将使用`EntityBuilder`来构建包含...
在这个场景中,我们关注的是如何使用HttpClient来发送POST请求并传输JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于API接口的数据传递。 首先,我们需要引入Apache HttpClient...
HttpClient post请求(用于key-value格式的参数), post请求(用于请求json格式的参数),加入了请求头以及token认证,成功之后读取服务器返回过来的json字符串数据
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...
字符集使用UTF-8编码,数据通讯统一采用 HTTP 协议通讯,使用POST 方法请求并传递参数。 POST请求Content-Type 设置为application/x-www-form-urlencoded 除此之外,我们对请求添加签名的校验,key设置为X-Sign 接口...
"httpclient post json数据"这个主题就是关于如何使用C#的HttpClient类来向Web API发送POST请求,并且以JSON格式传输数据。下面将详细解释这一过程。 首先,理解JSON(JavaScript Object Notation)是一种轻量级的...
httpclient的用法,发送get请求和post请求,设置header
3. **HttpClient POST请求**: POST请求常用于向服务器提交数据。下面是一个POST请求的例子,包括设置请求头和请求体: ```java import org.apache.http.HttpEntity; import org.apache....
本文将深入探讨如何使用HttpClient进行GET和POST请求,并提供相关的代码示例。 首先,GET请求是最常见的HTTP请求类型,通常用于获取资源。在HttpClient中,发送GET请求可以通过`HttpGet`类实现。以下是一个简单的...
### 使用HttpClient发送POST请求,并获取响应内容 #### 一、简介 在现代软件开发中,尤其是在Web应用领域,客户端与服务器之间的通信是非常重要的环节。Java作为一种广泛应用的编程语言,提供了多种方式来实现这一...
接下来,我们讨论如何使用HttpClient进行GET请求。GET请求通常用于获取资源,不涉及请求体: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...
1. **HttpClient的基本使用**:介绍HttpClient类的基本概念,包括如何创建实例,设置请求头,以及发送GET和POST请求。 2. **封装的设计**:讨论如何设计一个网络请求的通用接口或类,比如定义方法如`SendGetAsync`...
2. **执行请求**:同POST请求,通过HttpClient的`execute()`方法发送请求。 3. **处理响应**:同样获取`HttpResponse`,解析响应码和响应内容。 ### 文件下载 HttpClient提供了一种便捷的方式来下载文件: 1. **...
httpclient get/post请求工具类(map参数封装),方便调用
在这个场景下,`ConnectionServlet`可能负责接收`HttpClient`发送的GET或POST请求,处理后返回数据。 文件`4.8通过HttpClient异步请求数据`可能是一个示例代码或教程,讲述了如何在Android应用的4.8版本中使用`...
本篇文章将深入探讨HttpClient的异步请求特性,以及如何使用它来发送GET和POST请求。 在Java中,同步请求会阻塞调用线程,直到服务器返回响应。然而,异步请求允许程序在等待响应的同时继续执行其他任务,提高了...