微信支付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),希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!