休息食客

          隨心而動

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            16 隨筆 :: 7 文章 :: 2 評論 :: 0 Trackbacks
          當把要發送的數據準備好之后,接下來是要寫https請求,把它發送給微信服務器
          String reback = HttpClientUtil.sendHttpsUrl("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", data);
          需要抓取異常,并處理好異常
          寫一個HttpClientUtil類
          import java.io.BufferedReader;
          import java.io.ByteArrayInputStream;
          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.io.InputStream;
          import java.io.InputStreamReader;
          import java.io.OutputStream;
          import java.io.OutputStreamWriter;
          import java.net.HttpURLConnection;
          import java.net.URL;
          import java.security.KeyManagementException;
          import java.security.KeyStore;
          import java.security.KeyStoreException;
          import java.security.NoSuchAlgorithmException;
          import java.security.SecureRandom;
          import java.security.UnrecoverableKeyException;
          import java.security.cert.Certificate;
          import java.security.cert.CertificateException;
          import java.security.cert.CertificateFactory;
          import java.security.cert.X509Certificate;
          import java.util.HashMap;
          import java.util.Map;
          import javax.net.ssl.HttpsURLConnection;
          import javax.net.ssl.KeyManagerFactory;
          import javax.net.ssl.SSLContext;
          import javax.net.ssl.TrustManagerFactory;
          import com.yxht.core.common.tools.LoadProperties;
          import com.yxht.core.modules.WechatPay.client.TenpayHttpClient;
          /**
           * Http客戶端工具類<br/>
           * 這是內部調用類,請不要在外部調用。
           * @author miklchen
           *
           */
          public class HttpClientUtil {
           
           /**
            * 發送請求(微信支付用,發紅包等等)
            * @param url
            * @param params
            * @return
            * @throws Exception
            */
           public static String sendHttpsUrl(String sendUrl, String params) throws Exception{
            String jsonStr = "";
            String certificate_path = "d\:\\rootca.pem"; //信任庫證書
            String keystore_path = "d\:\\apiclient_cert.p12"; //密鑰庫證書
            String password = "xxxxxxxx"; //商戶號,也是加載證書的密碼
           
            // 聲明SSL上下文  
                  SSLContext sslContext = null;  
                  // 實例化主機名驗證接口  
                  sslContext = getSSLContext(password, keystore_path, certificate_path);  
                  if (sslContext != null) {  
                      HttpsURLConnection.setDefaultSSLSocketFactory(sslContext  
                              .getSocketFactory());  
                  }  
            URL url = new URL(sendUrl);
            HttpsURLConnection con = (HttpsURLConnection) url.openConnection();
            con.setRequestMethod("POST");
            con.setDoOutput(true);
            con.setDoInput(true);
            con.setUseCaches(false);
            //設置套接工廠
            con.setSSLSocketFactory(sslContext.getSocketFactory());
            OutputStreamWriter writer = new OutputStreamWriter(
              con.getOutputStream(), "UTF-8");
            writer.write(params);
            writer.flush();
            writer.close();
            InputStream in = con.getInputStream();
            BufferedReader db = new BufferedReader(new InputStreamReader(in, "UTF-8"));
            String tmp = "";
            while ((tmp = db.readLine()) != null) {
             jsonStr += tmp;
            }
            return jsonStr;
           
           }
           
           /**
               * 獲得SSLSocketFactory.
               * @param password
               *            密碼
               * @param keyStorePath
               *            密鑰庫路徑
               * @param trustStorePath
               *            信任庫路徑
               * @return SSLSocketFactory
               * @throws Exception
               */  
              public static SSLContext getSSLContext(String password,  
                      String keyStorePath, String trustStorePath) throws Exception {  
                  // 實例化密鑰庫  
                  KeyManagerFactory keyManagerFactory = KeyManagerFactory  
                          .getInstance(KeyManagerFactory.getDefaultAlgorithm());  
                  // 獲得密鑰庫  
                  KeyStore keyStore = getKeyStore(password, keyStorePath);  
                  // 初始化密鑰工廠  
                  keyManagerFactory.init(keyStore, password.toCharArray());  
           
                  // 實例化信任庫  
          //        TrustManagerFactory trustManagerFactory = TrustManagerFactory  
          //                .getInstance(TrustManagerFactory.getDefaultAlgorithm());  
          //        // 獲得信任庫  
          //        KeyStore trustStore = getKeyStore(password, trustStorePath);  
          //        // 初始化信任庫  
          //        trustManagerFactory.init(trustStore);  
                  // 實例化SSL上下文  
                  SSLContext ctx = SSLContext.getInstance("TLS");  
                  // 初始化SSL上下文  
                  ctx.init(keyManagerFactory.getKeyManagers(),  
                          null, null);  
                  // 獲得SSLSocketFactory  
                  return ctx;  
              }  
             
              /**
               * 獲得KeyStore.
               * @param keyStorePath
               *            密鑰庫路徑
               * @param password
               *            密碼
               * @return 密鑰庫
               * @throws Exception
               */  
              public static KeyStore getKeyStore(String password, String keyStorePath)  
                      throws Exception {  
                  // 實例化密鑰庫  
                  KeyStore ks = KeyStore.getInstance("PKCS12");  
                  // 獲得密鑰庫文件流  
                  FileInputStream is = new FileInputStream(keyStorePath);  
                  // 加載密鑰庫  
                  ks.load(is, password.toCharArray());  
                  // 關閉密鑰庫文件流  
                  is.close();  
                  return ks;  
              }  
          }
          有些import的沒用,可以刪掉,只要程序代碼沒有報錯的地方就行。
          到這里,如果發送請求,會失敗,它會說你沒有安裝證書,到商戶平臺上去下載證書,文檔里有說明
          下載后一共有4個證書,至少需要密鑰庫證書apiclient_cert.p12,因為信任庫證書rootca.pem我不會用(哪位大神會用教教我),
          文檔里也說了信任庫證書不用也行,證書安裝請仔細研究文檔,代碼上面已經寫好了。

          最后最后,,請發送請求吧!!!

          聲明:工具類代碼參考微信支付開發的demo,有些自己做了小改動。

          PS:需要引入http相關jar包,httpcore-4.2.3.jar,httpmine-4.2.3.jar,httpclient-4.2.3.jar,httpclient-cache-4.2.3.jar。一樣,
          還是去https://repository.sonatype.org里面找吧,如果是maven建立的項目,就把他們引入到pom.xml里面去吧!
          posted on 2015-09-14 12:23 休息食客 閱讀(361) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 雷州市| 泌阳县| 邹城市| 常州市| 织金县| 安新县| 恩平市| 张家川| 安溪县| 曲阜市| 漳浦县| 招远市| 文登市| 平度市| 桃江县| 郸城县| 资溪县| 松原市| 左云县| 鄂温| 广河县| 安顺市| 泰安市| 青河县| 贵阳市| 龙口市| 阿勒泰市| 阳春市| 齐齐哈尔市| 平阴县| 永登县| 阿城市| 溆浦县| 六盘水市| 香河县| 永安市| 湖南省| 咸阳市| 新和县| 广河县| 遵义市|