자바, 위 챗 결제 사용 - 일괄 결제 인터페이스 시작

11322 단어
package com.tenpay.util;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.InetAddress;
import java.net.URL;
import java.security.KeyStore;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import javax.net.ssl.SSLContext;

import org.apache.http.Consts;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContexts;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.glassfish.jersey.internal.util.Base64;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import com.zhiweism.util.MD5;
import com.zhiweism.util.Util;

/*
 *           
 *   :   
 */
public class WXRequestUtil {
	
	public static void main(String[] args) {
		SendPayment("  ","20170106113324",1,"1");
	}
	
	/*
	 *       
	 * body	    
	 * out_trade_no	   
	 * total_fee	    		     
	 * product_id	  ID
	 */
	public static Map<String,String> SendPayment(String body,String out_trade_no,double total_fee,String product_id){
		String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
		String xml = WXParamGenerate(body,out_trade_no,total_fee,product_id);
		String res = httpsRequest(url,"POST",xml);
		
		Map<String,String> data = null;
		try {
			data = doXMLParse(res);
		} catch (Exception e) {
		}
		return data;
	}
	
	public static String NonceStr(){
		String res = Base64.encodeAsString(Math.random()+"::"+new Date().toString()).substring(0, 30);
		return res;
	}
	
	 public static String GetIp() {
        InetAddress ia=null;
        try {
            ia=InetAddress.getLocalHost();
            String localip=ia.getHostAddress();
            return localip;
        } catch (Exception e) {
            return null;
        }
    }
	 
	 public static String GetSign(Map<String,String> param){
		String StringA =  Util.formatUrlMap(param, false, false);
		String stringSignTemp = MD5.md5(StringA+"&key="+ConstantUtil.API_KEY).toUpperCase();
		return stringSignTemp;
	 }
	 
	 //Map xml  
	 public static String GetMapToXML(Map<String,String> param){
		 StringBuffer sb = new StringBuffer();
		 sb.append("<xml>");
		 for (Map.Entry<String,String> entry : param.entrySet()) { 
			    sb.append("<"+ entry.getKey() +">");
			    sb.append(entry.getValue());
			    sb.append("</"+ entry.getKey() +">");
		}  
		 sb.append("</xml>");
		 return sb.toString();
	 }
	
	
	//          
	public static String WXParamGenerate(String description,String out_trade_no,double total_fee,String product_id){
		int fee = (int)(total_fee * 100.00);
		Map<String,String> param = new HashMap<String,String>();
		param.put("appid", ConstantUtil.APP_ID);
		param.put("mch_id", ConstantUtil.MCH_ID);
		param.put("nonce_str",NonceStr());
		param.put("body", description);
		param.put("out_trade_no",out_trade_no);
		param.put("total_fee", fee+"");
		param.put("spbill_create_ip", GetIp());
		param.put("notify_url", ConstantUtil.WEIXIN_NOTIFY);
		param.put("trade_type", "NATIVE");
		param.put("product_id", product_id+"");
		
		String sign = GetSign(param);
		
		param.put("sign", sign);
		return GetMapToXML(param);
	}
	
	//        
    public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {  
      try {  
          URL url = new URL(requestUrl);  
          HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
          
          conn.setDoOutput(true);  
          conn.setDoInput(true);  
          conn.setUseCaches(false);  
          //       (GET/POST)  
          conn.setRequestMethod(requestMethod);  
          conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");  
          //  outputStr  null          
          if (null != outputStr) {  
              OutputStream outputStream = conn.getOutputStream();  
              //         
              outputStream.write(outputStr.getBytes("UTF-8"));  
              outputStream.close();  
          }  
          //             
          InputStream inputStream = conn.getInputStream();  
          InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");  
          BufferedReader bufferedReader = new BufferedReader(inputStreamReader);  
          String str = null;
          StringBuffer buffer = new StringBuffer();  
          while ((str = bufferedReader.readLine()) != null) {  
              buffer.append(str);  
          }  
          //       
          bufferedReader.close();  
          inputStreamReader.close();  
          inputStream.close();  
          inputStream = null;  
          conn.disconnect();  
          return buffer.toString();  
      } catch (ConnectException ce) {  
          System.out.println("    :{}"+ ce);  
      } catch (Exception e) {  
          System.out.println("https    :{}"+ e);  
      }  
      return null;  
    }  
      
    //         
    public static String httpsRequest2(String requestUrl, String requestMethod, String outputStr) throws Exception {  
          KeyStore keyStore  = KeyStore.getInstance("PKCS12");  
          StringBuilder res = new StringBuilder("");  
          FileInputStream instream = new FileInputStream(new File("/home/apiclient_cert.p12"));  
          try {  
              keyStore.load(instream, "".toCharArray());  
          } finally {  
              instream.close();  
          }  

          // Trust own CA and all self-signed certs  
          SSLContext sslcontext = SSLContexts.custom()  
                  .loadKeyMaterial(keyStore, "1313329201".toCharArray())  
                  .build();  
          // Allow TLSv1 protocol only  
          SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(  
                  sslcontext,  
                  new String[] { "TLSv1" },  
                  null,  
                  SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);  
          CloseableHttpClient httpclient = HttpClients.custom()  
                  .setSSLSocketFactory(sslsf)  
                  .build();  
          try {  

              HttpPost httpost = new HttpPost("https://api.mch.weixin.qq.com/secapi/pay/refund");  
              httpost.addHeader("Connection", "keep-alive");  
              httpost.addHeader("Accept", "*/*");  
              httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");  
              httpost.addHeader("Host", "api.mch.weixin.qq.com");  
              httpost.addHeader("X-Requested-With", "XMLHttpRequest");  
              httpost.addHeader("Cache-Control", "max-age=0");  
              httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) ");  
               StringEntity entity2 = new StringEntity(outputStr ,Consts.UTF_8);  
               httpost.setEntity(entity2);  
              System.out.println("executing request" + httpost.getRequestLine());  

              CloseableHttpResponse response = httpclient.execute(httpost);  
               
              try {  
                  HttpEntity entity = response.getEntity();  
                    
                  System.out.println("----------------------------------------");  
                  System.out.println(response.getStatusLine());  
                  if (entity != null) {  
                      System.out.println("Response content length: " + entity.getContentLength());  
                      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));  
                      String text = "";
                      res.append(text);  
                      while ((text = bufferedReader.readLine()) != null) {  
                          res.append(text);  
                          System.out.println(text);  
                      }  
                       
                  }  
                  EntityUtils.consume(entity);  
              } finally {  
                  response.close();  
              }  
          } finally {  
              httpclient.close();  
          }  
          return  res.toString();  
            
    }
      
    //xml    
    public static Map<String, String> doXMLParse(String strxml) throws Exception {  
          strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");  
          if(null == strxml || "".equals(strxml)) {  
              return null;  
          }  
            
          Map<String,String> m = new HashMap<String,String>();   
          InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));  
          SAXBuilder builder = new SAXBuilder();  
          Document doc = builder.build(in);  
          Element root = doc.getRootElement();  
          List list = root.getChildren();  
          Iterator it = list.iterator();  
          while(it.hasNext()) {  
              Element e = (Element) it.next();  
              String k = e.getName();  
              String v = "";  
              List children = e.getChildren();  
              if(children.isEmpty()) {  
                  v = e.getTextNormalize();  
              } else {  
                  v = getChildrenText(children);  
              }  
                
              m.put(k, v);  
          }  
            
          //     
          in.close();   
          return m;  
    }  
      
    public static String getChildrenText(List children) {  
          StringBuffer sb = new StringBuffer();  
          if(!children.isEmpty()) {  
              Iterator it = children.iterator();  
              while(it.hasNext()) {  
                  Element e = (Element) it.next();  
                  String name = e.getName();  
                  String value = e.getTextNormalize();  
                  List list = e.getChildren();  
                  sb.append("<" + name + ">");  
                  if(!list.isEmpty()) {  
                      sb.append(getChildrenText(list));  
                  }  
                  sb.append(value);  
                  sb.append("</" + name + ">");  
              }  
          }   
          return sb.toString();  
    }
}

좋은 웹페이지 즐겨찾기