微信支付java版V3验证数据合法性(Deom)
1.1解析微信回调数据
InputStreaminStream=request.getInputStream();
ByteArrayOutputStreamoutSteam=newByteArrayOutputStream();
byte[]buffer=newbyte[1024];
intlen=0;
while((len=inStream.read(buffer))!=-1){
outSteam.write(buffer,0,len);
}
outSteam.close();
inStream.close();
/**获取微信调用notify_url的返回XML信息*/
Stringresult=newString(outSteam.toByteArray(),"utf-8");
result结果就是微信回调返回的XML数据。
1.2解析微信返回的XML数据
/**
*传入微信回调返回的XML信息
*以Map形式返回便于取值
*dom4j解析XML,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值为空
*@paramstrXML
*@return
*@throwsDocumentException
*/
@SuppressWarnings("rawtypes")
publicstaticSortedMap<String,String>dom4jXMLParse(StringstrXML)throwsDocumentException{
SortedMap<String,String>smap=newTreeMap<String,String>();
Documentdoc=DocumentHelper.parseText(strXML);
Elementroot=doc.getRootElement();
for(Iteratoriterator=root.elementIterator();iterator.hasNext();){
Elemente=(Element)iterator.next();
smap.put(e.getName(),e.getText());
}
returnsmap;
}
返回的是有序的Map格式数据,取值以smap.get("字段名")来获取数据。
1.3验证微信返回签名的合法性
/**
*是否微信V3签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
*传入微信返回信息解析后的SortedMap格式参数数据
*验证消息是否是微信发出的合法消息
*@paramsmap
*@paramapiKey设置的密钥
*@return验证结果
*/
@SuppressWarnings("rawtypes")
publicstaticbooleanisWechatSign(SortedMap<String,String>smap,StringapiKey){
StringBuffersb=newStringBuffer();
Setes=smap.entrySet();
Iteratorit=es.iterator();
while(it.hasNext()){
Map.Entryentry=(Map.Entry)it.next();
Stringk=(String)entry.getKey();
Stringv=(String)entry.getValue();
if(!"sign".equals(k)&&null!=v&&!"".equals(v)&&!"key".equals(k)){
sb.append(k+"="+v+"&");
}
}
sb.append("key="+apiKey);
/**验证的签名*/
Stringsign=MD5Util.MD5Encode(sb.toString(),"utf-8").toUpperCase();
/**微信端返回的合法签名*/
StringvalidSign=((String)smap.get("sign")).toUpperCase();
returnvalidSign.equals(sign);
}
个人建议:验证微信签名合法性之前可以先判断微信返回的return_code和result_code是不是SUCCESS。
以上所述是小编给大家介绍的微信支付java版V3验证数据合法性(Deom),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!