<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    休息食客

    隨心而動

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

    2015年9月14日 #

    當請求結束后,會受到微信服務器返回給我們的結果
    處理第三節(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里面的全部結點
            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)將結果都放入一個map里面去了,,筆者自己寫了一個返回類,把map里的結果都set到返回類中,
    最終都返回給調(diào)用這個現(xiàn)金紅包接口的其他業(yè)務。
    大家可以參考一下
    寫一個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è)務結果
     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")));
       }
      }
    將此結果返回出去吧!
    聲明:工具類代碼參考微信支付開發(fā)的demo,有些自己做了小改動。

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

    當把要發(fā)送的數(shù)據(jù)準備好之后,接下來是要寫https請求,把它發(fā)送給微信服務器
    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);
      //設置套接工廠
      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的沒用,可以刪掉,只要程序代碼沒有報錯的地方就行。
    到這里,如果發(fā)送請求,會失敗,它會說你沒有安裝證書,到商戶平臺上去下載證書,文檔里有說明
    下載后一共有4個證書,至少需要密鑰庫證書apiclient_cert.p12,因為信任庫證書rootca.pem我不會用(哪位大神會用教教我),
    文檔里也說了信任庫證書不用也行,證書安裝請仔細研究文檔,代碼上面已經(jīng)寫好了。

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

    聲明:工具類代碼參考微信支付開發(fā)的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 @ 2015-09-14 12:23 休息食客 閱讀(358) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 国产偷国产偷亚洲高清日韩| 国产精品嫩草影院免费| 亚洲线精品一区二区三区| 十八禁的黄污污免费网站| 亚洲国产精品成人久久蜜臀 | 99久久免费观看| 亚洲国产精品一区第二页| 免费一级毛片无毒不卡| 亚洲AV无码成人精品区天堂| 日本黄色动图免费在线观看| 亚洲福利在线观看| 84pao强力永久免费高清| 亚洲综合亚洲国产尤物| 久久亚洲精品人成综合网| 毛片无码免费无码播放| 亚洲一级在线观看| 四虎影院免费视频| 高潮内射免费看片| 久久夜色精品国产亚洲| 久久精品免费一区二区| 精品亚洲456在线播放| 又色又污又黄无遮挡的免费视 | 国产成人无码区免费网站| 婷婷亚洲久悠悠色悠在线播放| 91短视频免费在线观看| 亚洲中文字幕无码中文字| 免费成人黄色大片| 男人天堂免费视频| 亚洲乱码日产精品BD在线观看| 日本一区免费电影| a级黄色毛片免费播放视频| 亚洲日本国产精华液| 成人永久免费高清| 成人精品一区二区三区不卡免费看| 亚洲精品第五页中文字幕| 日韩免费视频网站| 成人性做爰aaa片免费看| 日本亚洲免费无线码| 2048亚洲精品国产| 在线观看H网址免费入口| 污网站在线观看免费|