⽀付回调验证签名java版V3
⽀付java版V3验证数据合法性
概要:使⽤⽀付接⼝时,会返回或回调给商户XML数据,开发者需要验证返回的数据是否合法。
特别提醒:商户系统对于⽀付结果通知的内容⼀定要做签名验证,防⽌数据泄漏导致出现“假通知”,造成资⾦损失。
1.解析回调数据
InputStream inStream = InputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = ad(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
/** 获取调⽤notify_url的返回XML信息 */
String result = new ByteArray(), "utf-8");
result结果就是回调返回的XML数据。
2.解析返回的XML数据
/**
* 传⼊回调返回的XML信息
* 以Map形式返回便于取值
* dom4j解析XML,返回第⼀级元素键值对。如果第⼀级元素有⼦节点,则此节点的值为空
* @param strXML
* @return
* @throws DocumentException
*/
@SuppressWarnings("rawtypes")
public static SortedMap<String, String> dom4jXMLParse(String strXML) throws DocumentException {
SortedMap<String, String> smap = new TreeMap<String, String>();
Document doc = DocumentHelper.parseText(strXML);
Element root = RootElement();
for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
Element e = (Element) ();
smap.Name(), e.getText());
}
return smap;
}
返回的是有序的Map格式数据,取值以(“字段名”)来获取数据。
3.验证返回签名的合法性
/**
* 是否V3签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
* 传⼊返回信息解析后的SortedMap格式参数数据
* 验证消息是否是发出的合法消息
* @param smap
* @param apiKey 设置的密钥
* @return验证结果
*/
@SuppressWarnings("rawtypes")
public static boolean isWechatSign(SortedMap<String, String> smap,String apiKey) {
StringBuffer sb = new StringBuffer();
Set es = Set();
Iterator it = es.iterator();
while (it.hasNext()) {
使用dom4j解析xml文件Map.Entry entry = (Map.Entry) it.next();
String k = (String) Key();
String v = (String) Value();
if (!"sign".equals(k) && null != v && !"".equals(v) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + apiKey);
/** 验证的签名 */
String sign = MD5Util.String(), "utf-8").toUpperCase();
/** 端返回的合法签名 */
String validSign = ((String) ("sign")).toUpperCase();
return validSign.equals(sign);
}
验证回调签名合法性之后可以先判断返回的return_code和result_code是不是SUCCESS。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论