驗證支付寶來帳簽名 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+"¬ify_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();
}
}
}
}