由于公司最近要求和口袋通对接微商城,所以用到了口袋通的API,其实和微信开放平台的API很像,那么在上代码之前先说说口袋通吧,口袋通也是随着微信的浪潮诞生自白鸦之手,都是基于微信开放平台,对微信公众账号做二次开发,不过目前口袋通完全免费,和他们对接的过程中,有过一些沟通,反馈挺快的。
/**
*
* @Description: 口袋通对接工具类
* @author zhangJun
* @date 2014-1-23 下午1:52:29
*/
public class KouDaiTongUtil {
public static final String KDT_URL="http://open.koudaitong.com/api/entry";
public static final String APP_ID="";
public static final String SECRET="";
public static final String FORMAT="json"; //响应格式
public static final String SIGN_METHOD="md5"; //参数的加密方法
public static final String V="1.0";//API协议版本
/**
* 通用构造API请求参数
* @param appId 在口袋通后台获取
* @param format 可选,指定响应格式。默认json,目前支持格式为json
* @param method 调用API的接口名称,参照口袋通
* @param signMethod 可选,参数的加密方法选择。默认为md5
* @param timestamp 时间戳 方法内部会处理成格式为yyyy-mm-dd HH:mm:ss
* @param v API协议版本,可选值:1.0
* @param paramMap(调用api的参数,key为参数名称,需要和调用口袋通方法参数名称相同,否则调用不成功)
* @return
* @throws UnsupportedEncodingException
*/
public static String constructParam(String appId,String secret,String format,String method,String signMethod,Date timestamp,String v,Map paramMap) throws UnsupportedEncodingException {
String timestampStr=DateUtils.DateToString(timestamp, DateUtils.YYYY_MM_DD_HH_MM_SS);
//遵循API对参数进行升序排列
Map map=new TreeMap();
//通讯系统参数
map.put("app_id", appId);
map.put("format", format);
map.put("method", method);
map.put("sign_method", signMethod);
map.put("timestamp", timestampStr);
map.put("v", v);
//应用参数
map.putAll(paramMap);
StringBuffer systemStr=new StringBuffer();
//头加secret
systemStr.append(SECRET);
Set> set=map.entrySet();
for(Iterator> it= set.iterator();it.hasNext();){
Map.Entry entry=it.next();
systemStr.append(entry.getKey()+entry.getValue());
}
//尾加secret
systemStr.append(SECRET);
//拼接应用参数
Set> paramSet=paramMap.entrySet();
StringBuffer appStr=new StringBuffer();
for(Iterator> it=paramSet.iterator();it.hasNext();){
appStr.append("&");
Map.Entry entry=it.next();
if(containWhiteSpace((String)entry.getValue().toString())){
appStr.append(entry.getKey()+"="+URLEncoder.encode((String)entry.getValue(),"utf-8"));
}else{
appStr.append(entry.getKey()+"="+entry.getValue());
}
}
//32位md5加密
String sign=Md5CyptoUtil.md5(systemStr.toString());
String param="sign="+sign+"×tamp="+URLEncoder.encode(timestampStr,"utf-8")+"&v="+v+"&app_id="+APP_ID+"&method="+method+"&sign_method="+signMethod+"&format="+format+appStr;
return param;
}
/**
*
* @param 判断是否包含空字符串
* @return
*/
public static boolean containWhiteSpace(String input){
Pattern pattern = Pattern.compile("\\s");
Matcher matcher = pattern.matcher(input);
boolean flag = matcher.find();
return flag;
}
/**
* 发送get请求
* @param url
* @param param
* @return
*/
public static String sendGet(String url,String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
URLConnection connection = realUrl.openConnection();
connection.connect();
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 口袋同通用请求方法返回json字符串
* @param method 调用API的接口名称来源KdtMethodListEnum
* @param paramMap(调用api的参数,key为参数名称,需要和调用口袋通方法参数名称相同,否则调用不成功)
* @return
* @throws UnsupportedEncodingException
*/
public static Map sendRequest(String method,Map paramMap) throws UnsupportedEncodingException{
Map resultMap=new HashMap();
String param = constructParam(APP_ID,SECRET, FORMAT, method, SIGN_METHOD, new Date(), V, paramMap);
String reponse= sendGet(KDT_URL,param);
JSONObject jsonObject=JSONObject.fromObject(reponse);
//请求发生错误
if(jsonObject.containsKey("error_response")){
int errorCode=Integer.parseInt(JSONObject.fromObject(jsonObject.get("error_response")).get("code").toString());
String msg=JSONObject.fromObject(jsonObject.get("error_response")).get("msg").toString();
KdtErrorCodeEnum codeEnum=KdtErrorCodeEnum.getKdtErrorCodeEnumByCode(errorCode);
resultMap.put("status", "FAILED");
resultMap.put("message","请求失败,"+msg+",错误码:"+errorCode+"错误名称:"+codeEnum.name+"解决方案:"+codeEnum.scheme);
}else{
resultMap.put("status", "SUCCESS");
resultMap.put("result", reponse);
}
return resultMap;
}
测试方法
/**
* 获取交易订单(如果参数都不传就会下拉所有订单)
* @param status 订单状态
* @param startCreated 订单创建起始时间
* @param endCreated 订单创建结束时间
* @param startPayDate 支付起始时间
* @param endPayDate 支付结束时间
* @param buyerNick 昵称
* @param pageNo 页数
* @param pageSize 每页条数
* @return
* @throws UnsupportedEncodingException
*/
public Map getOrderListByCondition(KdtOrderStatusEnum status,Date startCreated,Date endCreated,Date startPayDate,Date endPayDate,String buyerNick,Integer pageNo,Integer pageSize) throws UnsupportedEncodingException{
String method=KdtMethodListEnum.KDT_TRADES_SOLD_GET.vlaue; //查询卖家已卖出的交易列表
Map paramMap=new HashMap();
if(status!=null){
paramMap.put("status", status.type);
}
if(startCreated!=null){
paramMap.put("start_created", DateUtils.DateToString(startCreated,DateUtils.YYYY_MM_DD_HH_MM_SS));
}
if(endCreated!=null){
paramMap.put("end_created", DateUtils.DateToString(endCreated,DateUtils.YYYY_MM_DD_HH_MM_SS));
}
if(startPayDate!=null){
paramMap.put("start_pay", DateUtils.DateToString(startPayDate,DateUtils.YYYY_MM_DD_HH_MM_SS));
}
if(endPayDate!=null){
paramMap.put("end_pay", DateUtils.DateToString(endPayDate,DateUtils.YYYY_MM_DD_HH_MM_SS));
}
if(!StringUtils.isBlank(buyerNick)){
paramMap.put("buyer_nick", buyerNick);
}
if(pageNo!=null){
paramMap.put("page_no", pageNo);
}
if(pageSize!=null){
paramMap.put("page_size", pageSize);
}
Map map=KouDaiTongUtil.sendRequest(method,paramMap);
return map;
}