口袋通对接工具类

时间:2021-03-14 15:45:53
  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+"&timestamp="+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 }