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();
}
}
}
}