出问题的代码如下:
package com.hotel.app.account.h5alipy.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import org.apache.commons.httpclient.HttpClient;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import com.hotel.app.account.h5alipy.config.AlipayConfig;
import com.hotel.app.account.h5alipy.sign.MD5;
import com.hotel.app.account.h5alipy.sign.RSA;
/* *
*类名:AlipayNotify
*功能:支付宝通知处理类
*详细:处理支付宝各接口通知返回
*版本:3.3
*日期:2012-08-17
*说明:
*以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
*该代码仅供学习和研究支付宝接口使用,只是提供一个参考
*************************注意*************************
*调试通知返回时,可查看或改写log日志的写入TXT里的数据,来检查通知返回是否正常
*/
public class AlipayNotify {
/**
* 支付宝消息验证地址
*/
private static final String HTTPS_VERIFY_URL = "https://mapi.alipay.com/gateway.do?service=notify_verify&";
/**
* 验证消息是否是支付宝发出的合法消息,验证callback
* @param params 通知返回来的参数数组
* @return 验证结果
*/
public static boolean verifyReturn(Map<String, String> params) {
String sign = "";
//获取返回时的签名验证结果
if(params.get("sign") != null) {sign = params.get("sign");}
//验证签名
boolean isSign = getSignVeryfy(params, sign, true);
//写日志记录(若要调试,请取消下面两行注释)
//String sWord = "isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
//AlipayCore.logResult(sWord);
//判断isSign是否为true
//isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (isSign) {
return true;
} else {
return false;
}
}
/**
* 验证消息是否是支付宝发出的合法消息,验证服务器异步通知
* @param params 通知返回来的参数数组
* @return 验证结果
*/
public static boolean verifyNotify(Map<String, String> params) throws Exception {
//获取是否是支付宝服务器发来的请求的验证结果
String responseTxt = "true";
try {
//XML解析notify_data数据,获取notify_id
Document document = DocumentHelper.parseText(params.get("notify_data"));
String notify_id = document.selectSingleNode( "//notify/notify_id" ).getText();
responseTxt = verifyResponse(notify_id);
} catch(Exception e) {
responseTxt = e.toString();
}
//获取返回时的签名验证结果
String sign = "";
if(params.get("sign") != null) {sign = params.get("sign");}
boolean isSign = getSignVeryfy(params, sign,false);
//写日志记录(若要调试,请取消下面两行注释)
//String sWord = "responseTxt=" + responseTxt + "\n isSign=" + isSign + "\n 返回回来的参数:" + AlipayCore.createLinkString(params);
//AlipayCore.logResult(sWord);
//判断responsetTxt是否为true,isSign是否为true
//responsetTxt的结果不是true,与服务器设置问题、合作身份者ID、notify_id一分钟失效有关
//isSign不是true,与安全校验码、请求时的参数格式(如:带自定义参数等)、编码格式有关
if (isSign && responseTxt.equals("true")) {
return true;
} else {
return false;
}
}
/**
* 解密
* @param inputPara 要解密数据
* @return 解密后结果
*/
public static Map<String, String> decrypt(Map<String, String> inputPara) throws Exception {
inputPara.put("notify_data", RSA.decrypt(inputPara.get("notify_data"), AlipayConfig.private_key, AlipayConfig.input_charset));
return inputPara;
}
/**
* 根据反馈回来的信息,生成签名结果
* @param Params 通知返回来的参数数组
* @param sign 比对的签名结果
* @param isSort 是否排序
* @return 生成的签名结果
*/
private static boolean getSignVeryfy(Map<String, String> Params, String sign, boolean isSort) {
//过滤空值、sign与sign_type参数
Map<String, String> sParaNew = AlipayCore.paraFilter(Params);
//获取待签名字符串
String preSignStr = "";
if(isSort) {
preSignStr = AlipayCore.createLinkString(sParaNew);
} else {
preSignStr = AlipayCore.createLinkStringNoSort(sParaNew);
}
//获得签名验证结果
boolean isSign = false;
if(AlipayConfig.sign_type.equals("MD5") ) {
isSign = MD5.verify(preSignStr, sign, AlipayConfig.key, AlipayConfig.input_charset);
}
if(AlipayConfig.sign_type.equals("0001")){
isSign = RSA.verify(preSignStr, sign, AlipayConfig.ali_public_key, AlipayConfig.input_charset);
}
return isSign;
}
/**
* 获取远程服务器ATN结果,验证返回URL
* @param notify_id 通知校验ID
* @return 服务器ATN结果
* 验证结果集:
* invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
private static String verifyResponse(String notify_id) {
//获取远程服务器ATN结果,验证是否是支付宝服务器发来的请求
String partner = AlipayConfig.partner;
String veryfy_url = HTTPS_VERIFY_URL + "partner=" + partner + "¬ify_id=" + notify_id;
return checkUrl(veryfy_url);
}
/**
* 获取远程服务器ATN结果
* @param urlvalue 指定URL路径地址
* @return 服务器ATN结果
* 验证结果集:
* invalid命令参数不对 出现这个错误,请检测返回处理中partner和key是否为空
* true 返回正确信息
* false 请检查防火墙或者是服务器阻止端口问题以及验证时间是否超过一分钟
*/
private static String checkUrl(String urlvalue) {
String inputLine = "";
try {
URL url = new URL(urlvalue);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
BufferedReader in = new BufferedReader(new InputStreamReader(urlConnection
.getInputStream()));
inputLine = in.readLine().toString();
/* StringBuffer result = new StringBuffer();
DefaultHttpClient httpClient = new DefaultHttpClient();
// 使用的请求方式是GET
HttpGet httpGet = new HttpGet(urlvalue);
try{
HttpResponse response = httpClient.execute(httpGet);
HttpEntity httpEntity = response.getEntity();
if(httpEntity != null) {
InputStream inputStream = httpEntity.getContent();
byte[] responseByte = new byte[2048];
int len = 0;
while((len = inputStream.read(responseByte)) != -1) {
result.append(new String(responseByte, 0, len));
}
}
} catch(ClientProtocolException e) {
e.printStackTrace();
} catch(IOException e) {
e.printStackTrace();
} finally{
// 关闭http请求
httpClient.getConnectionManager().shutdown();
}*/
//return result.toString();
} catch (Exception e) {
e.printStackTrace();
inputLine = "";
}
return inputLine;
}
}
服务器为weblogic时 <span style="font-family: 宋体, 'Arial Narrow', arial, serif;">private static String checkUrl(String urlvalue) 该方法有问题,提示ssl验证有问题</span>
1.解决方法 修改weblogic 服务器的ssl配置,将其服务器名验证 选择 无
2.解决方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
package
verifier;
import
javax.net.ssl.SSLSession;
import
weblogic.security.SSL.HostnameVerifier;
/**
* 自定义的主机名验证类
* @since 2013-10-14
* @version 1.0.0
*/
public
class
CustomerVerifier
implements
HostnameVerifier {
/**
* 验证方法。
* @since 2013-10-14
* @param arg0
* @param arg1
* @return
* @see weblogic.security.SSL.HostnameVerifier#verify(java.lang.String,
* javax.net.ssl.SSLSession)
*
*/
@Override
public
boolean
verify(String arg0, SSLSession arg1) {
System.out.println(
"this is the CustomerVerifier by Loy, arg0 = "
+ arg0 +
", arg1 = "
+ arg1);
return
true
;
}
}
|