1 package com.frame.util; 2 3 import java.io.BufferedReader; 4 import java.io.InputStreamReader; 5 import java.io.UnsupportedEncodingException; 6 import java.net.URL; 7 import java.net.URLConnection; 8 import java.net.URLEncoder; 9 import java.util.Date; 10 import java.util.HashMap; 11 import java.util.Iterator; 12 import java.util.Map; 13 import java.util.Set; 14 import java.util.TreeMap; 15 import java.util.regex.Matcher; 16 import java.util.regex.Pattern; 17 18 import net.sf.json.JSONArray; 19 import net.sf.json.JSONObject; 20 21 import org.apache.commons.codec.digest.DigestUtils; 22 23 /** 24 * 25 * @Description: 口袋通对接工具类 26 * @author 27 * @date 28 */ 29 public class KouDaiTongUtil { 30 public static final String KDT_URL="http://open.koudaitong.com/api/entry"; 31 public static final String APP_ID=""; 32 public static final String SECRET=""; 33 public static final String FORMAT="json"; //响应格式 34 public static final String SIGN_METHOD="md5"; //参数的加密方法 35 public static final String V="1.0";//API协议版本 36 /** 37 * 通用构造API请求参数 38 * @param appId 在口袋通后台获取 39 * @param format 可选,指定响应格式。默认json,目前支持格式为json 40 * @param method 调用API的接口名称,参照口袋通 41 * @param signMethod 可选,参数的加密方法选择。默认为md5 42 * @param timestamp 时间戳 方法内部会处理成格式为yyyy-mm-dd HH:mm:ss 43 * @param v API协议版本,可选值:1.0 44 * @param paramMap(调用api的参数,key为参数名称,需要和调用口袋通方法参数名称相同,否则调用不成功) 45 * @return 46 * @throws UnsupportedEncodingException 47 */ 48 public static String constructParam(String appId,String secret,String format,String method,String signMethod,Date timestamp,String v,Map<String,Object> paramMap) throws UnsupportedEncodingException { 49 String timestampStr=new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(timestamp); 50 //遵循API对参数进行升序排列 51 Map<String,Object> map=new TreeMap<String,Object>(); 52 //加密参数(升序排列) 53 map.put("app_id", appId); 54 map.put("format", format); 55 map.put("method", method); 56 map.put("sign_method", signMethod); 57 map.put("timestamp", timestampStr); 58 map.put("v", v); 59 //应用参数 60 map.putAll(paramMap); 61 StringBuffer systemStr=new StringBuffer(); 62 //头加secret 63 systemStr.append(SECRET); 64 Set<Map.Entry<String, Object>> set=map.entrySet(); 65 for(Iterator<Map.Entry<String, Object>> it= set.iterator();it.hasNext();){ 66 Map.Entry<String, Object> entry=it.next(); 67 systemStr.append(entry.getKey()+entry.getValue()); 68 } 69 //尾加secret 70 systemStr.append(SECRET); 71 //拼接应用参数 72 Set<Map.Entry<String, Object>> paramSet=paramMap.entrySet(); 73 StringBuffer appStr=new StringBuffer(); 74 for(Iterator<Map.Entry<String, Object>> it=paramSet.iterator();it.hasNext();){ 75 appStr.append("&"); 76 Map.Entry<String, Object> entry=it.next(); 77 if(containWhiteSpace((String)entry.getValue().toString())){ 78 appStr.append(entry.getKey()+"="+URLEncoder.encode((String)entry.getValue(),"utf-8")); 79 }else{ 80 appStr.append(entry.getKey()+"="+entry.getValue()); 81 } 82 } 83 //32位md5加密 84 String sign=DigestUtils.md5Hex(systemStr.toString()); 85 String param="sign="+sign+"×tamp="+URLEncoder.encode(timestampStr,"utf-8")+"&v="+v+"&app_id="+APP_ID+"&method="+method+"&sign_method="+signMethod+"&format="+format+appStr; 86 System.out.println("URL:"+KDT_URL+"?"+param); 87 return param; 88 } 89 90 91 /** 92 * 93 * @param 判断是否包含空字符串 94 * @return 95 */ 96 public static boolean containWhiteSpace(String input){ 97 Pattern pattern = Pattern.compile("\\s"); 98 Matcher matcher = pattern.matcher(input); 99 boolean flag = matcher.find(); 100 return flag; 101 } 102 /** 103 * 发送get请求 104 * @param url 105 * @param param 106 * @return 107 */ 108 public static String sendGet(String url,String param) { 109 String result = ""; 110 BufferedReader in = null; 111 try { 112 String urlNameString = url + "?" + param; 113 URL realUrl = new URL(urlNameString); 114 URLConnection connection = realUrl.openConnection(); 115 connection.connect(); 116 in = new BufferedReader(new InputStreamReader( 117 connection.getInputStream())); 118 String line; 119 while ((line = in.readLine()) != null) { 120 result += line; 121 } 122 } catch (Exception e) { 123 System.out.println("发送GET请求出现异常!" + e); 124 e.printStackTrace(); 125 } 126 finally { 127 try { 128 if (in != null) { 129 in.close(); 130 } 131 } catch (Exception e2) { 132 e2.printStackTrace(); 133 } 134 } 135 return result; 136 } 137 /** 138 * 口袋同通用请求方法返回json字符串 139 * @param method 调用API的接口名称来源KdtMethodListEnum 140 * @param paramMap(调用api的参数,key为参数名称,需要和调用口袋通方法参数名称相同,否则调用不成功) 141 * @return 142 * @throws UnsupportedEncodingException 143 */ 144 public static Map<String,Object> sendRequest(String method,Map<String,Object> paramMap) throws UnsupportedEncodingException{ 145 Map<String,Object> resultMap=new HashMap<String,Object>(); 146 String param = constructParam(APP_ID,SECRET, FORMAT, method, SIGN_METHOD, new Date(System.currentTimeMillis() + 8*60 * 60 * 1000), V,paramMap);/////////////////////////////////////////////////// 147 String reponse= sendGet(KDT_URL,param); 148 JSONObject jsonObject=JSONObject.fromObject(reponse); 149 //请求发生错误 150 if(jsonObject.containsKey("error_response")){ 151 int errorCode=Integer.parseInt(JSONObject.fromObject(jsonObject.get("error_response")).get("code").toString()); 152 String msg=JSONObject.fromObject(jsonObject.get("error_response")).get("msg").toString(); 153 resultMap.put("status", "FAILED"); 154 resultMap.put("message","请求失败,"+msg+",错误码:"+errorCode); 155 }else{ 156 resultMap.put("status", "SUCCESS"); 157 resultMap.put("result", reponse); 158 } 159 return resultMap; 160 } 161 162 /** 163 * 获取交易订单(如果参数都不传就会下拉所有订单) 164 * @param status 订单状态 165 * @param startCreated 订单创建起始时间 166 * @param endCreated 订单创建结束时间 167 * @param startPayDate 支付起始时间 168 * @param endPayDate 支付结束时间 169 * @return map 170 * @throws UnsupportedEncodingException 171 */ 172 public static Map<String,Object> getOrderListByCondition(String status,String startCreated,String endCreated,String startPayDate,String endPayDate) throws UnsupportedEncodingException{ 173 String method="kdt.trades.sold.get"; //查询卖家已卖出的交易列表 174 Map<String,Object> paramMap=new HashMap<String,Object>(); 175 if(status!=null){ 176 paramMap.put("status", status); 177 } 178 if(startCreated!=null){ 179 paramMap.put("start_created", startCreated); 180 } 181 if(endCreated!=null){ 182 paramMap.put("end_created", endCreated); 183 } 184 if(startPayDate!=null){ 185 paramMap.put("start_pay", startPayDate); 186 } 187 if(endPayDate!=null){ 188 paramMap.put("end_pay", endPayDate); 189 } 190 Map<String,Object> map=KouDaiTongUtil.sendRequest(method,paramMap); 191 return map; 192 } 193 public static String getValue(Map map, String key) { 194 Object obj = map.get(key); 195 if (obj == null) { 196 return ""; 197 } 198 return String.valueOf(obj); 199 } 200 public static void main(String[] args) throws UnsupportedEncodingException{ 201 System.out.println(new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis() + 8*60 * 60 * 1000))); 202 Map<String,Object> map=KouDaiTongUtil.getOrderListByCondition(null,"2014-07-01 00:00:00", null, null, null); 203 String ss=getValue(map,"result"); 204 System.out.println("*************"+ss); 205 JSONObject jsonObject=JSONObject.fromObject(ss); 206 //System.out.println(jsonObject); 207 JSONObject response=jsonObject.getJSONObject("response"); 208 JSONArray data=response.getJSONArray("trades"); 209 System.out.println(data.size()); 210 String save_sql=" begin "; 211 for(int i=0;i<data.size();i++){ 212 JSONObject info=data.getJSONObject(i); 213 String num=info.getString("num"); 214 String num_iid=info.getString("num_iid"); 215 String price=info.getString("price"); 216 String pic_path=info.getString("pic_path"); 217 String pic_thumb_path=info.getString("pic_thumb_path"); 218 String title=info.getString("title"); 219 String status=info.getString("status"); 220 String shipping_type=info.getString("shipping_type"); 221 String post_fee=info.getString("post_fee"); 222 String total_fee=info.getString("total_fee"); 223 String discount_fee=info.getString("discount_fee"); 224 String payment=info.getString("payment"); 225 String created=info.getString("created"); 226 String pay_time=info.getString("pay_time"); 227 String pay_type=info.getString("pay_type"); 228 String consign_time=info.getString("consign_time"); 229 String buyer_area=info.getString("buyer_area"); 230 String tid=info.getString("tid"); 231 String weixin_user_id=info.getString("weixin_user_id"); 232 String buyer_nick=info.getString("buyer_nick"); 233 String buyer_message=info.getString("buyer_message"); 234 String seller_flag=info.getString("seller_flag"); 235 String trade_memo=info.getString("trade_memo"); 236 String receiver_city=info.getString("receiver_city"); 237 String receiver_district=info.getString("receiver_district"); 238 String receiver_name=info.getString("receiver_name"); 239 String receiver_state=info.getString("receiver_state"); 240 String receiver_address=info.getString("receiver_address"); 241 String receiver_zip=info.getString("receiver_zip"); 242 String receiver_mobile=info.getString("receiver_mobile"); 243 String feedback=info.getString("feedback"); 244 String outer_tid=info.getString("outer_tid"); 245 save_sql+=" insert into KDT_TRADES values('"+tid+"','"+num+"','"+num_iid+"','"+price+"','"+pic_path+"','"+pic_thumb_path+"','"+title+"','"+weixin_user_id+"','"+buyer_nick+"','"+buyer_message+"','"+seller_flag+"','"+trade_memo+"','"+receiver_city+"','"+receiver_district+"','"+receiver_name+"','"+receiver_state+"','"+receiver_address+"','"+receiver_zip+"','"+receiver_mobile+"','"+feedback+"','"+outer_tid+"','"+status+"','"+shipping_type+"','"+post_fee+"','"+total_fee+"','"+discount_fee+"','"+payment+"','"+created+"','"+pay_time+"','"+pay_type+"','"+consign_time+"','"+buyer_area+"'); "; 246 //int updateForSql = AccessDB.updateForSql(save_sql); 247 JSONArray orders=info.getJSONArray("orders"); 248 for(int j=0;j<orders.size();j++){//目前的所有交易只有 1 个子订单 249 JSONObject order_info=orders.getJSONObject(j); 250 String _trades_id=tid; 251 String _outer_sku_id=order_info.getString("outer_sku_id"); 252 String _title=order_info.getString("title"); 253 String _seller_nick=order_info.getString("seller_nick"); 254 String _price=order_info.getString("price"); 255 String _total_fee=order_info.getString("total_fee"); 256 String _payment=order_info.getString("payment"); 257 String _sku_properties_name=order_info.getString("sku_properties_name"); 258 String _pic_path=order_info.getString("pic_path"); 259 String _pic_thumb_path=order_info.getString("pic_thumb_path"); 260 String _buyer_messages=order_info.getString("buyer_messages"); 261 String _num_iid=order_info.getString("num_iid"); 262 String _num=order_info.getString("num"); 263 String _sku_id=order_info.getString("sku_id"); 264 //String _discount_fee=order_info.getString("discount_fee"); 265 save_sql+=" insert into KDT_ORDERS values('"+_trades_id+"','"+_num_iid+"','"+_sku_id+"','"+_num+"','"+_outer_sku_id+"','"+_title+"','"+_seller_nick+"','"+_price+"','"+_total_fee+"','0','"+payment+"','"+_sku_properties_name+"','"+_pic_path+"','"+_pic_thumb_path+"','"+_buyer_messages+"'); "; 266 //int updateForSql1 = AccessDB.updateForSql(save_sql); 267 // System.out.println("_title"+_title); 268 // System.out.println("_trades_id"+_trades_id); 269 } 270 271 //System.out.println(orders); 272 // System.out.println("weixin_user_id:"+weixin_user_id); 273 // System.out.println("title:"+title); 274 } 275 save_sql+=" end; "; 276 System.out.println("save_sql:"+save_sql); 277 //int updateForSql = AccessDB.updateForSql(save_sql); 278 System.out.println("OK"); 279 280 // JSONArray orders=data.optJSONArray("orders"); 281 // System.out.println(orders); 282 // JSONArray data=response.getJSONArray("data"); 283 // JSONObject info=data.getJSONObject(0); 284 // String province=info.getString("province"); 285 // String city=info.getString("city"); 286 // String district=info.getString("district"); 287 // String address=info.getString("address"); 288 // System.out.println(province+city+district+address); 289 290 291 } 292 293 294 }