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

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

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

    休息食客

    隨心而動

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

    2015年2月5日 #

    當請求結束后,會受到微信服務器返回給我們的結果
    處理第三節中的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;
        }
       
    }
    好吧,到這里,已經將結果都放入一個map里面去了,,筆者自己寫了一個返回類,把map里的結果都set到返回類中,
    最終都返回給調用這個現金紅包接口的其他業務。
    大家可以參考一下
    寫一個WechatCashHongbaoSendRsp類
    public class WechatCashHongbaoSendRsp {
     
     private String return_code;                 //返回狀態碼
     private String return_msg;                  //返回信息
     
     //以下字段在return_code為SUCCESS的時候有返回
     private String sign;                        //簽名
     private String result_code;                 //業務結果
     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;                   //發放成功時間
     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")));
       }
      }
    將此結果返回出去吧!
    聲明:工具類代碼參考微信支付開發的demo,有些自己做了小改動。

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

    當把要發送的數據準備好之后,接下來是要寫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 @ 2015-09-14 12:23 休息食客 閱讀(358) | 評論 (0)編輯 收藏

    第一節講了怎么準備所有的參數,這里講怎么將這些參數組成xml(即要通過HTTPS發送的數據)
    大家可以先在網上了解一下java bean轉xml的相關知識
    1、我建了里一個請求參數類
    public class WechatCashHongbaoSendReq {
     
     private String nonce_str;             //隨機字符串
     private String sign;                  //簽名
     private String mch_billno;            //商戶訂單號
     private String mch_id;                //商戶號
     private String wxappid;               //公眾賬號appid
     private String send_name;             //商戶名稱
     private String re_openid;             //用戶openid
     private int total_amount;          //付款金額
     private int total_num;             //紅包發放總人數
     private String wishing;               //紅包祝福語
     private String client_ip;             //Ip地址
     private String act_name;              //活動名稱
     private String remark;                //備注
     
     public String getNonce_str() {
      return nonce_str;
     }
     public void setNonce_str(String nonce_str) {
      this.nonce_str = nonce_str;
     }
     public String getSign() {
      return sign;
     }
     public void setSign(String sign) {
      this.sign = sign;
     }
     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 getSend_name() {
      return send_name;
     }
     public void setSend_name(String send_name) {
      this.send_name = send_name;
     }
     public String getRe_openid() {
      return re_openid;
     }
     public void setRe_openid(String re_openid) {
      this.re_openid = re_openid;
     }
     public int getTotal_amount() {
      return total_amount;
     }
     public void setTotal_amount(int total_amount) {
      this.total_amount = total_amount;
     }
     public int getTotal_num() {
      return total_num;
     }
     public void setTotal_num(int total_num) {
      this.total_num = total_num;
     }
     public String getWishing() {
      return wishing;
     }
     public void setWishing(String wishing) {
      this.wishing = wishing;
     }
     public String getClient_ip() {
      return client_ip;
     }
     public void setClient_ip(String client_ip) {
      this.client_ip = client_ip;
     }
     public String getAct_name() {
      return act_name;
     }
     public void setAct_name(String act_name) {
      this.act_name = act_name;
     }
     public String getRemark() {
      return remark;
     }
     public void setRemark(String remark) {
      this.remark = remark;
     }
    }

    2、然后把13個參數都set進去
    WechatCashHongbaoSendReq sendReq = new WechatCashHongbaoSendReq();
      sendReq.setNonce_str(nonce_str);
      sendReq.setSign(sign);
      sendReq.setMch_billno(mch_billno);
      sendReq.setMch_id(mch_id);
      sendReq.setWxappid(wxappid);
      sendReq.setSend_name(send_name);
      sendReq.setRe_openid(re_openid);
      sendReq.setTotal_amount(total_amount);
      sendReq.setTotal_num(total_num);
      sendReq.setWishing(wishing);
      sendReq.setClient_ip(client_ip);
      sendReq.setAct_name(act_name);
      sendReq.setRemark(remark);
    3、將請求類轉為xml
    String data = Util.bean2XML(req).replaceAll("__", "_");    //為什么要加一個replaceAll("__", "_"),如果不加,會有什么情況,大家可以試試
    寫一個Util類,代碼如下:
    import com.thoughtworks.xstream.XStream;
    import com.thoughtworks.xstream.core.util.QuickWriter;
    import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
    import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
    import com.thoughtworks.xstream.io.xml.XppDriver;
    import java.io.*;
    import java.lang.reflect.Field;
    import java.util.Map;
    /**
     * User: rizenguo
     * Date: 2014/10/23
     * Time: 14:59
     */
    public class Util {
        //打log用
        /**
         * 通過反射的方式遍歷對象的屬性和屬性值,方便調試
         *
         * @param o 要遍歷的對象
         * @throws Exception
         */
        public static void reflect(Object o) throws Exception {
            Class cls = o.getClass();
            Field[] fields = cls.getDeclaredFields();
            for (int i = 0; i < fields.length; i++) {
                Field f = fields[i];
                f.setAccessible(true);
                Util.log(f.getName() + " -> " + f.get(o));
            }
        }
        public static byte[] readInput(InputStream in) throws IOException {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int len = 0;
            byte[] buffer = new byte[1024];
            while ((len = in.read(buffer)) > 0) {
                out.write(buffer, 0, len);
            }
            out.close();
            in.close();
            return out.toByteArray();
        }
        public static String inputStreamToString(InputStream is) throws IOException {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int i;
            while ((i = is.read()) != -1) {
                baos.write(i);
            }
            return baos.toString();
        }
        public static InputStream getStringStream(String sInputString) throws UnsupportedEncodingException {
            ByteArrayInputStream tInputStringStream = null;
            if (sInputString != null && !sInputString.trim().equals("")) {
                tInputStringStream = new ByteArrayInputStream(sInputString.getBytes("UTF-8"));
            }
            return tInputStringStream;
        }
        public static Object getObjectFromXML(String xml, Class tClass) {
            //將從API返回的XML數據映射到Java對象
         xstream.alias("xml", tClass);
            return xstream.fromXML(xml);
        }
        public static String getStringFromMap(Map<String, Object> map, String key, String defaultValue) {
            if (key == "" || key == null) {
                return defaultValue;
            }
            String result = (String) map.get(key);
            if (result == null) {
                return defaultValue;
            } else {
                return result;
            }
        }
        public static int getIntFromMap(Map<String, Object> map, String key) {
            if (key == "" || key == null) {
                return 0;
            }
            if (map.get(key) == null) {
                return 0;
            }
            return Integer.parseInt((String) map.get(key));
        }
        /**
         * 打log接口
         * @param log 要打印的log字符串
         * @return 返回log
         */
        public static String log(Object log){
            return log.toString();
        }
        /**
         * 讀取本地的xml數據,一般用來自測用
         * @param localPath 本地xml文件路徑
         * @return 讀到的xml字符串
         */
        public static String getLocalXMLString(String localPath) throws IOException {
            return Util.inputStreamToString(Util.class.getResourceAsStream(localPath));
        }
       
        /**
         * 將java對象轉為xml字符串
         * @param clazz
         * @return
         */
        public static String bean2XML(Object o){
         xstream.alias("xml", o.getClass());
         return xstream.toXML(o);
        }
       
        /**
      * 擴展xstream,使其支持CDATA塊
      *  
      * @date 2013-05-19
      */  
     private static XStream xstream = new XStream(new XppDriver() {  
         public HierarchicalStreamWriter createWriter(Writer out) {  
             return new PrettyPrintWriter(out) {  
                 // 對所有xml節點的轉換都增加CDATA標記  
                 boolean cdata = true;  
       
                 @SuppressWarnings("unchecked")  
                 public void startNode(String name, Class clazz) {  
                     super.startNode(name, clazz);  
                 }  
       
                 protected void writeText(QuickWriter writer, String text) {  
                     if (cdata) {  
                         writer.write("<![CDATA[");  
                         writer.write(text);  
                         writer.write("]]>");  
                     } else {  
                         writer.write(text);  
                     }  
                 }  
             };  
         }  
     });  
       
    }
    到這一步,已經完成了最終要發送出去的數據,然后是寫http請求方法。
    聲明:工具類代碼參考微信支付開發的demo,有些自己做了小改動。
    PS:需要引入xstream-1.3.1.jar包,大家可以去apache中央倉庫找https://repository.sonatype.org,輸入xstream就可以搜索到,并下載出來,如果你的項目是maven建立的,直接在pom.xml里面加上就行
    <dependency>
         <groupId>com.thoughtworks.xstream</groupId>
         <artifactId>xstream</artifactId>
         <version>1.3.1</version>
    </dependency>
    posted @ 2015-09-11 15:46 休息食客 閱讀(327) | 評論 (0)編輯 收藏

    開發之前,最好有一些微信開發的經驗,先看一下文檔,了解一下https://pay.weixin.qq.com/wiki/doc/api/cash_coupon.php?chapter=13_5
    文檔過了一遍之后,腦海里應該有些印象了,廢話不說,進入開發。
    準備參數,一個一個來。
    參數1:隨機字符串    nonce_str
    //獲取隨機數,這里設定長度20,只要不成長于32位
    String nonce_str = RandomStringGenerator.getRandomStringByLength(20); 

    寫一個RandomStringGenerator類,寫一個getRandomStringByLength靜態方法
    import java.util.Random;
    /**
     * User: rizenguo
     * Date: 2014/10/29
     */
    public class RandomStringGenerator {
        /**
         * 獲取一定長度的隨機字符串
         * @param length 指定字符串長度
         * @return 一定長度的字符串
         */
        public static String getRandomStringByLength(int length) {
            String base = "abcdefghijklmnopqrstuvwxyz0123456789";
            Random random = new Random();
            StringBuffer sb = new StringBuffer();
            for (int i = 0; i < length; i++) {
                int number = random.nextInt(base.length());
                sb.append(base.charAt(number));
            }
            return sb.toString();
        }
    }
    參數2 : 商戶號   mch_id
    String mch_id = “xxxxxxxx”;

    參數3 : 商戶訂單號  mch_billno

    String mch_billno = mch_id + GenerateSequenceUtil.generateSequenceNo();

    些一個GenerateSequenceUtil類,寫一個generateSequenceNo方法

    import java.text.DecimalFormat;
    import java.text.FieldPosition;
    import java.text.Format;
    import java.text.NumberFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
     
    import org.apache.log4j.Logger;
     
    public class GenerateSequenceUtil {
     
     /** .log */
     private static final Logger logger = Logger.getLogger(GenerateSequenceUtil.class);
     
     /** The FieldPosition. */
     private static final FieldPosition HELPER_POSITION = new FieldPosition(0);
     
     /** This Format for format the data to special format. */
     private final static Format dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
     
     /** This Format for format the number to special format. */
     private final static NumberFormat numberFormat = new DecimalFormat("0000");
     
     /** This int is the sequence number ,the default value is 0. */
     private static int seq = 0;
     
     private static final int MAX = 9999;
     
     /**
     * 時間格式生成序列
     * @return String
     */
     public static synchronized String generateSequenceNo() {
     
      Calendar rightNow = Calendar.getInstance();
       
      StringBuffer sb = new StringBuffer();
       
      dateFormat.format(rightNow.getTime(), sb, HELPER_POSITION);
       
      numberFormat.format(seq, sb, HELPER_POSITION);
       
      if (seq == MAX) {
       seq = 0;
      } else {
       seq++;
      }
       
      logger.info("THE SQUENCE IS :" + sb.toString());
       
      return sb.toString();
     }

    參數4: 公眾賬號appid   wxappid

    這個參數可以在微信開發者中心里面看到
    //微信分配的公眾賬號ID
    String wxappid = "wx8888888888888888";
    參數5 : 商戶名稱   send_name
    隨便寫
    String send_name = "測試者";   
    參數6 : 用戶openid   re_openid
    微信號和公眾號對應的唯一的加密過的字符串
    String re_openid = "xxxxxxxxxxxxxxxxxxxxxxx";
    參數7: 付款金額   total_amount
    int total_amount = 100;    單位分
    參數8 : 紅包發放總人數  total_num
    int total_num = 1;
    參數9 : 紅包祝福語   wishing
    隨便寫
    String wishing = "測試";
    參數10 : Ip地址   client_ip
    String client_ip = InetAddress.getLocalHost().getHostAddress().toString();
    這里可能報異常,需要抓取一下
    參數11 : 活動名稱   act_name
    隨便寫
    String act_name = "測試創建20150906";
    參數12 : 備注  remark
    隨便寫
    String remark = "測試";
    最后一個參數sign
    //簽名
      Map<String,Object> map = new HashMap<String,Object>();
      map.put("nonce_str", nonce_str);
      map.put("mch_billno", mch_billno);
      map.put("mch_id", mch_id);
      map.put("wxappid", wxappid);
      map.put("send_name", send_name);
      map.put("re_openid", re_openid);
      map.put("total_amount", total_amount);
      map.put("total_num", total_num);
      map.put("wishing", wishing);
      map.put("client_ip", client_ip);
      map.put("act_name", act_name);
      map.put("remark", remark);
      String sign = Signature.getSign(map);
    寫一個Signature類,代碼如下:
    import org.xml.sax.SAXException;
    import com.yxht.core.common.tools.LoadProperties;
    import javax.xml.parsers.ParserConfigurationException;
    import java.io.IOException;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Map;
    /**
     * User: rizenguo
     * Date: 2014/10/29
     * Time: 15:23
     */
    public class Signature {
        /**
         * 簽名算法
         * @param o 要參與簽名的數據對象
         * @return 簽名
         * @throws IllegalAccessException
         */
        public static String getSign(Object o) throws IllegalAccessException {
            ArrayList<String> list = new ArrayList<String>();
            Class cls = o.getClass();
            Field[] fields = cls.getDeclaredFields();
            for (Field f : fields) {
                f.setAccessible(true);
                if (f.get(o) != null && f.get(o) != "") {
                    list.add(f.getName() + "=" + f.get(o) + "&");
                }
            }
            int size = list.size();
            String [] arrayToSort = list.toArray(new String[size]);
            Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < size; i ++) {
                sb.append(arrayToSort[i]);
            }
            String result = sb.toString();
            result += "key=" + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";   //這里是開發者中心里面服務器配置里面的消息加解密密鑰
            Util.log("Sign Before MD5:" + result);
            result = MD5.MD5Encode(result).toUpperCase();
            Util.log("Sign Result:" + result);
            return result;
        }
        public static String getSign(Map<String,Object> map){
            ArrayList<String> list = new ArrayList<String>();
            for(Map.Entry<String,Object> entry:map.entrySet()){
                if(entry.getValue()!=""){
                    list.add(entry.getKey() + "=" + entry.getValue() + "&");
                }
            }
            int size = list.size();
            String [] arrayToSort = list.toArray(new String[size]);
            Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < size; i ++) {
                sb.append(arrayToSort[i]);
            }
            String result = sb.toString();
            result += "key=" + LoadProperties.getSystemdefaultValue("APP_KEY");
            result = MD5.MD5Encode(result).toUpperCase();
            return result;
        }
        /**
         * 從API返回的XML數據里面重新計算一次簽名
         * @param responseString API返回的XML數據
         * @return 新鮮出爐的簽名
         * @throws ParserConfigurationException
         * @throws IOException
         * @throws SAXException
         */
        public static String getSignFromResponseString(String responseString) throws IOException, SAXException, ParserConfigurationException {
            Map<String,Object> map = XMLParser.getMapFromXML(responseString);
            //清掉返回數據對象里面的Sign數據(不能把這個數據也加進去進行簽名),然后用簽名算法進行簽名
            map.put("sign","");
            //將API返回的數據根據用簽名算法進行計算新的簽名,用來跟API返回的簽名進行比較
            return Signature.getSign(map);
        }
        /**
         * 檢驗API返回的數據里面的簽名是否合法,避免數據在傳輸的過程中被第三方篡改
         * @param responseString API返回的XML數據字符串
         * @return API簽名是否合法
         * @throws ParserConfigurationException
         * @throws IOException
         * @throws SAXException
         */
        public static boolean checkIsSignValidFromResponseString(String responseString) throws ParserConfigurationException, IOException, SAXException {
            Map<String,Object> map = XMLParser.getMapFromXML(responseString);
            Util.log(map.toString());
            String signFromAPIResponse = map.get("sign").toString();
            if(signFromAPIResponse=="" || signFromAPIResponse == null){
                Util.log("API返回的數據簽名數據不存在,有可能被第三方篡改!!!");
                return false;
            }
            Util.log("服務器回包里面的簽名是:" + signFromAPIResponse);
            //清掉返回數據對象里面的Sign數據(不能把這個數據也加進去進行簽名),然后用簽名算法進行簽名
            map.put("sign","");
            //將API返回的數據根據用簽名算法進行計算新的簽名,用來跟API返回的簽名進行比較
            String signForAPIResponse = Signature.getSign(map);
            if(!signForAPIResponse.equals(signFromAPIResponse)){
                //簽名驗不過,表示這個API返回的數據有可能已經被篡改了
                Util.log("API返回的數據簽名驗證不通過,有可能被第三方篡改!!!");
                return false;
            }
            Util.log("恭喜,API返回的數據簽名驗證通過!!!");
            return true;
        }
    }
    先講到這里,所有參數都準備好了,下一步是組成xml
    聲明:工具類代碼參考微信支付開發的demo,有些自己做了小改動。
    posted @ 2015-09-10 15:35 休息食客 閱讀(878) | 評論 (0)編輯 收藏

         摘要: java解析xml文件的方式有幾種,下面介紹用dom4j方式解析1、先看一段xml內容 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->  1 <configs>  2 &nb...  閱讀全文
    posted @ 2015-02-11 17:23 休息食客 閱讀(419) | 評論 (0)編輯 收藏

    linux發行版:CentOS release 6.5 (Final)
    啟動系統后,沒有桌面,只是一個控制臺,如果要啟動桌面系統,如下步驟:
    1、啟動系統,登錄
    2、vi /etc/inittab
    3、將最后一行的id:3:initdefault:中的3換成5,即id:5:initdefault:.
    4、wq保存退出
    5、重啟系統即可。

    說明:如果將桌面系統切換成控制臺,反過來將5換成3重啟即可。 此方法只在上面說的發行版測試通過。
    posted @ 2015-02-11 11:01 休息食客 閱讀(359) | 評論 (1)編輯 收藏

    不允許將 NULL 值賦給 NOT NULL 列"TBSPACEID=3, TABLEID=34, COLNO=29"。

    SELECT C.TABSCHEMA, C.TABNAME, C.COLNAME   FROM SYSCAT.TABLES AS T,SYSCAT.COLUMNS AS C WHERE T.TBSPACEID = 3 AND T.TABLEID = 34 AND C.COLNO = 29 AND C.TABSCHEMA = T.TABSCHEMA AND C.TABNAME = T.TABNAME

    找出是哪一列不能插入空值。
    posted @ 2015-02-05 15:50 休息食客 閱讀(393) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 无码毛片一区二区三区视频免费播放 | 国产亚洲sss在线播放| 少妇性饥渴无码A区免费| 久久精品国产亚洲精品| 国产精品无码永久免费888| 亚洲中文字幕无码久久精品1| 一个人免费观看日本www视频| 精品亚洲视频在线观看 | 免费激情视频网站| 亚洲AV无码精品国产成人| 国产精品成人无码免费| 亚洲av无码成人影院一区 | 嫩草成人永久免费观看| 亚洲伊人久久大香线蕉苏妲己| 毛片无码免费无码播放| 亚洲视频精品在线观看| 免费国产成人高清在线观看网站| 亚洲一级毛片视频| 国产成人免费a在线资源| 成人免费网站久久久| 国产AV无码专区亚洲Av| 久久WWW免费人成一看片| 亚洲人成自拍网站在线观看 | APP在线免费观看视频| 中文字幕亚洲精品资源网| 香蕉97超级碰碰碰免费公| 亚洲AV无码国产一区二区三区| 一本色道久久88亚洲综合| 成在人线av无码免费高潮水| 亚洲最大的成网4438| 成人性生交大片免费看午夜a| 美女被暴羞羞免费视频| 亚洲成AV人片在线观看| 免费可以看黄的视频s色| 国产精品自拍亚洲| 久久亚洲成a人片| 最新猫咪www免费人成| 二个人看的www免费视频| 亚洲国产精品人久久电影| 亚洲国产成人影院播放| 永久黄色免费网站|