1. 程式人生 > >驗證支付寶來帳簽名 MD5

驗證支付寶來帳簽名 MD5

public static Map<String,String> data(context ctxt){

               Map<String,String> map =new HashMap<String,String>();

              String nofitime=ctxt.getValueAt("notifytime");//這是支付寶傳過來的引數

              ....................

                map.put("notifytime",nofitime);

                  ...............

                return map;

}

//
在actIion裡呼叫
  Map<String,String> params=this.data(context);

 if(AlipayNotify.verfy(params){

     //簽名驗證通過執行業務

}

 //AlipayNotify類

public class AlipayNotify{

          //支付寶驗證訊息地址

         private static final String HTTPS_URL="https://mapi.alipay.com/gateway.do?service=notify_verify&";

        //驗證是否是支付寶發出的訊息

public static boolean verify(Map<String,String> params){

        String responseTxt="false";

     /** 需要驗證支付寶URL地址才用

         if(params.get("notify_id") !=null){

        String notify_id=params.get("notify_id");

        responseTxt=verifyResponse(notify_id);

        }

        */

     String sign="  ";

      if(params.get("sign") !=null){

       sign=params.get("sign");

      }

      boolean isSign=getSignVeryfy(params,sign);

      //寫日誌記錄(需要除錯取消兩行註釋)

     //String words="responseTxt="+responseTxt+"\n isSgin="+"\n返回來的引數"+createLinkString(params);

     //logResult(words);

   if(isSign){

     return true;

    }esle{

    return false;

  }

}

在常量類 AlipayConfig裡新增

      public static String paratner =" ";//合作者身份ID   固定值

      public static String key="";//商戶的私密 固定值

      public static Sting log_path="D\\";t//除錯建立txt資料夾路徑

      public static Stirng input_charset="UTF-8";//設定字元格式

      public static String sign_type="MD5";//簽名方式 不需要修改

      //生成簽名結果,根據反饋過來的資料

  public static boolean getSignVeryfy(Map<String,String> params,String sign){

      //過濾空值,sgin與sign_type引數 paraFilter

         Map<String,String> paramNew=paraFilter(Params);;

     //把陣列所有元素排序  按照 ?引數=引數值 ?的模式用? 字元拼接成字元 cteateLinkString

     String preSignStr=cteateLinkString(paramNew);

     //獲得簽名驗證結果

       boolean isSign=false;

       if(AlipayConfig,sign_type.equals("MD5"){

         isSign=MD5.verify(preSignStr,AlipayConfig.key,AlipayConfig.input_charset

       }

       retrun isSign;

   }

    //verify簽名字元 ,簽名結果,金鑰,編碼格式

    public static boolean verify(String text,String sign,String key, String input_charset){

       text=text+key;

       String mysign=DigestUtils.md5Hex(getContentBytes(text,inut_cahrset)); //md5Hex這是框架方法

       if(mysign.equals(sign)){

          return true;

       }else{

         return false;

       }

    }

  private static byte[] getContentBytes(String content,,String charset){

   if(charset ==null || "".equals(charset)){

     return content.getBytes();

   }

  try{

    return content.getBytes(charset);

  }catch(UnsupportedEncoding e){

     }

 }

   //verifyResponse方法 獲取遠端伺服器ATN結果,驗證是否是支付寶伺服器傳送過的請求,驗證返回URL

    private static String verifyResponse(String notify_id){

              String partner= AlipayConfig.partner;

             String verfy_url=HTTPS_URL+"partner="+partner+"&notify_id="+notify_id;

             return checkUrl(verfy_url);

   }

    //checkUrl方法

     public static String checkUrl(String urlValue){

     String inputline="";

       URL url=new URL(urlValue);

       HttpURLConnection urlconnection=(HttpURLConnection)url.openConnection();

       BufferedReader in =new BufferedReader(new InputStreamReader(urlconnection.getInputStream());

       inputline=in.readLine().toString();

      //這裡需要捕捉異常

      return inputline;

    }

   ////過濾空值,sgin與sign_type引數 paraFilter 方法

    public static Map<String,String>paraFilter(Map<String,String> map){

      Map<String,String> result=new HashMap<String,Stirng>();

      if(map ==null || map.size()<=0){

        return result;

       }

       for(String key map.keySet()){

        Stirng value=map.get(key);

          if(value == null || value.equals("") || key.equlasIgnoreCase("sign") || key.equlasIgnoreCase("sign_type"){

               continue;

            }

            result.put(key,value);

       }

        return result;

    }

       //把陣列所有元素排序  按照 ?引數=引數值 ?的模式用? 字元拼接成字元 cteateLinkString  方法  

      public static Map<String,String> cteateLinkString (Map<String,String> params){

          List<Stirng>keys=new ArrayList<String>(params.keySet());

         Collections.sort(keys);

        String prestr="";

        for(int i=0;i<keys.size();i++){

             String key =keys.get(i);

           String value =params.get(Key);

           if(i ==keys.size() -1){//拼接式不包括最後一個?字元

               prestr=prestr+key+"="+value;

            }else{

                  prestr=prest+key +"="+value+"&";

              }

        }

       return prestr;

     } 

 //日誌方法  logResult

     public static void logResult(String word){

         FileWrite writer=null;

        try{

      writer=new FileWriter(AlipayConfig.log_path+"alipay_log"+System.currentTimeMills()+".txt");

       writer.write(word);

       }catch(exception e){

       }finally{

      if(writer !=null){

         writer.close();

             }

         }

     }

}