休息食客

          隨心而動

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            16 隨筆 :: 7 文章 :: 2 評論 :: 0 Trackbacks

          2015年9月14日 #

          當請求結(jié)束后,會受到微信服務(wù)器返回給我們的結(jié)果
          處理第三節(jié)中的reback
          //將接收到的返回信息
            Map<String,Object> mso = new HashMap<String,Object>();
             mso = XMLParser.getMapFromXML(reback);
          需要抓取異常
          寫一個XMLParser類
          import org.w3c.dom.Document;
          import org.w3c.dom.Element;
          import org.w3c.dom.Node;
          import org.w3c.dom.NodeList;
          import org.xml.sax.SAXException;
          import javax.xml.parsers.DocumentBuilder;
          import javax.xml.parsers.DocumentBuilderFactory;
          import javax.xml.parsers.ParserConfigurationException;
          import java.io.IOException;
          import java.io.InputStream;
          import java.util.HashMap;
          import java.util.Map;
          /**
           * User: rizenguo
           * Date: 2014/11/1
           * Time: 14:06
           */
          public class XMLParser {
              public static Map<String,Object> getMapFromXML(String xmlString) throws ParserConfigurationException, IOException, SAXException {
                  //這里用Dom的方式解析回包的最主要目的是防止API新增回包字段
                  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                  DocumentBuilder builder = factory.newDocumentBuilder();
                  InputStream is =  Util.getStringStream(xmlString);
                  Document document = builder.parse(is);
                  //獲取到document里面的全部結(jié)點
                  NodeList allNodes = document.getFirstChild().getChildNodes();
                  Node node;
                  Map<String, Object> map = new HashMap<String, Object>();
                  int i=0;
                  while (i < allNodes.getLength()) {
                      node = allNodes.item(i);
                      if(node instanceof Element){
                          map.put(node.getNodeName(),node.getTextContent());
                      }
                      i++;
                  }
                  return map;
              }
             
          }
          好吧,到這里,已經(jīng)將結(jié)果都放入一個map里面去了,,筆者自己寫了一個返回類,把map里的結(jié)果都set到返回類中,
          最終都返回給調(diào)用這個現(xiàn)金紅包接口的其他業(yè)務(wù)。
          大家可以參考一下
          寫一個WechatCashHongbaoSendRsp類
          public class WechatCashHongbaoSendRsp {
           
           private String return_code;                 //返回狀態(tài)碼
           private String return_msg;                  //返回信息
           
           //以下字段在return_code為SUCCESS的時候有返回
           private String sign;                        //簽名
           private String result_code;                 //業(yè)務(wù)結(jié)果
           private String err_code;                    //錯誤代碼
           private String err_code_des;                //錯誤代碼描述
           
           //以下字段在return_code和result_code都為SUCCESS的時候有返回
           private String mch_billno;                  //商戶訂單號
           private String mch_id;                      //商戶號
           private String wxappid;                     //公眾賬號appid
           private String re_openid;                   //用戶openid
           private String total_amount;                //付款金額
           private String send_time;                   //發(fā)放成功時間
           private String send_listid;                 //微信單號
           
           public String getReturn_code() {
            return return_code;
           }
           public void setReturn_code(String return_code) {
            this.return_code = return_code;
           }
           public String getReturn_msg() {
            return return_msg;
           }
           public void setReturn_msg(String return_msg) {
            this.return_msg = return_msg;
           }
           public String getSign() {
            return sign;
           }
           public void setSign(String sign) {
            this.sign = sign;
           }
           public String getResult_code() {
            return result_code;
           }
           public void setResult_code(String result_code) {
            this.result_code = result_code;
           }
           public String getErr_code() {
            return err_code;
           }
           public void setErr_code(String err_code) {
            this.err_code = err_code;
           }
           public String getErr_code_des() {
            return err_code_des;
           }
           public void setErr_code_des(String err_code_des) {
            this.err_code_des = err_code_des;
           }
           public String getMch_billno() {
            return mch_billno;
           }
           public void setMch_billno(String mch_billno) {
            this.mch_billno = mch_billno;
           }
           public String getMch_id() {
            return mch_id;
           }
           public void setMch_id(String mch_id) {
            this.mch_id = mch_id;
           }
           public String getWxappid() {
            return wxappid;
           }
           public void setWxappid(String wxappid) {
            this.wxappid = wxappid;
           }
           public String getRe_openid() {
            return re_openid;
           }
           public void setRe_openid(String re_openid) {
            this.re_openid = re_openid;
           }
           public String getTotal_amount() {
            return total_amount;
           }
           public void setTotal_amount(String total_amount) {
            this.total_amount = total_amount;
           }
           public String getSend_time() {
            return send_time;
           }
           public void setSend_time(String send_time) {
            this.send_time = send_time;
           }
           public String getSend_listid() {
            return send_listid;
           }
           public void setSend_listid(String send_listid) {
            this.send_listid = send_listid;
           }
          }
          將map里的值都set進來
          WechatCashHongbaoSendRsp rsp = new WechatCashHongbaoSendRsp();
            rsp.setReturn_code(String.valueOf(mso.get("return_code")));
            rsp.setReturn_msg(String.valueOf(mso.get("return_msg")));
           
            //以下字段在return_code為SUCCESS的時候有返回
            if(String.valueOf(mso.get("return_code")).equals("SUCCESS")){
             rsp.setSign(String.valueOf(mso.get("sign")));
             rsp.setResult_code(String.valueOf(mso.get("result_code")));
             rsp.setErr_code(String.valueOf(mso.get("err_code")));
             rsp.setErr_code_des(String.valueOf(mso.get("err_code_des")));
             
             //以下字段在return_code為SUCCESS的時候有返回
             if(String.valueOf(mso.get("result_code")).equals("SUCCESS")) {
              rsp.setMch_billno(String.valueOf(mso.get("mch_billno")));
              rsp.setMch_id(String.valueOf(mso.get("mch_id")));
              rsp.setWxappid(String.valueOf(mso.get("wxappid")));
              rsp.setRe_openid(String.valueOf(mso.get("re_openid")));
              rsp.setTotal_amount(String.valueOf(mso.get("total_amount")));
              rsp.setSend_time(String.valueOf(mso.get("send_time")));
              rsp.setSend_listid(String.valueOf(mso.get("send_listid")));
             }
            }
          將此結(jié)果返回出去吧!
          聲明:工具類代碼參考微信支付開發(fā)的demo,有些自己做了小改動。

          最后說一點點,開發(fā)這個應(yīng)用接口,除了在加載證書那里遇到困難,其他地方還是比較順利的,然后筆者寫這篇博客,希望將
          自己的研究的東西分享出去,有哪些不對的地方,或者不好的地方,請指教,畢竟當局者迷旁觀者清。
          posted @ 2015-09-15 11:44 休息食客 閱讀(309) | 評論 (0)編輯 收藏

          當把要發(fā)送的數(shù)據(jù)準備好之后,接下來是要寫https請求,把它發(fā)送給微信服務(wù)器
          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/>
           * 這是內(nèi)部調(diào)用類,請不要在外部調(diào)用。
           * @author miklchen
           *
           */
          public class HttpClientUtil {
           
           /**
            * 發(fā)送請求(微信支付用,發(fā)紅包等等)
            * @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);
            //設(shè)置套接工廠
            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());  
                  // 關(guān)閉密鑰庫文件流  
                  is.close();  
                  return ks;  
              }  
          }
          有些import的沒用,可以刪掉,只要程序代碼沒有報錯的地方就行。
          到這里,如果發(fā)送請求,會失敗,它會說你沒有安裝證書,到商戶平臺上去下載證書,文檔里有說明
          下載后一共有4個證書,至少需要密鑰庫證書apiclient_cert.p12,因為信任庫證書rootca.pem我不會用(哪位大神會用教教我),
          文檔里也說了信任庫證書不用也行,證書安裝請仔細研究文檔,代碼上面已經(jīng)寫好了。

          最后最后,,請發(fā)送請求吧!!!

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

          PS:需要引入http相關(guān)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 @ 2015-09-14 12:23 休息食客 閱讀(362) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 巴彦淖尔市| 钟山县| 沭阳县| 师宗县| 义马市| 福贡县| 凤城市| 凤翔县| 探索| 高安市| 忻城县| 额敏县| 邯郸县| 永善县| 临夏市| 南昌市| 龙海市| 定日县| 读书| 湖州市| 阿鲁科尔沁旗| 密云县| 滦平县| 洛川县| 磐石市| 雷山县| 咸宁市| 黄平县| 容城县| 海丰县| 崇阳县| 古浪县| 扶沟县| 桃园县| 宜章县| 元谋县| 南宫市| 封开县| 修文县| 务川| 卓尼县|