微信支付java版V3验证数据合法性(Deom)
时间:2021-04-02 09:46:42|栏目:JAVA代码|点击: 次
1.1 解析微信回调数据
InputStream inStream = request.getInputStream();
ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
outSteam.close();
inStream.close();
/** 获取微信调用notify_url的返回XML信息 */
String result = new String(outSteam.toByteArray(), "utf-8");
result结果就是微信回调返回的XML数据。
1.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 = doc.getRootElement();
for (Iterator iterator = root.elementIterator(); iterator.hasNext();) {
Element e = (Element) iterator.next();
smap.put(e.getName(), e.getText());
}
return smap;
}
返回的是有序的Map格式数据,取值以smap.get("字段名")来获取数据。
1.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 = smap.entrySet();
Iterator it = es.iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
String k = (String) entry.getKey();
String v = (String) entry.getValue();
if (!"sign".equals(k) && null != v && !"".equals(v) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + apiKey);
/** 验证的签名 */
String sign = MD5Util.MD5Encode(sb.toString(), "utf-8").toUpperCase();
/** 微信端返回的合法签名 */
String validSign = ((String) smap.get("sign")).toUpperCase();
return validSign.equals(sign);
}
个人建议:验证微信签名合法性之前可以先判断微信返回的return_code和result_code是不是SUCCESS。
上一篇:java 判断二进制文件的方法
栏 目:JAVA代码
下一篇:HttpClient实现调用外部项目接口工具类的示例
本文地址:http://www.codeinn.net/misctech/93004.html


阅读排行
- 1Java Swing组件BoxLayout布局用法示例
- 2java中-jar 与nohup的对比
- 3Java邮件发送程序(可以同时发给多个地址、可以带附件)
- 4Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type异常
- 5Java中自定义异常详解及实例代码
- 6深入理解Java中的克隆
- 7java读取excel文件的两种方法
- 8解析SpringSecurity+JWT认证流程实现
- 9spring boot里增加表单验证hibernate-validator并在freemarker模板里显示错误信息(推荐)
- 10深入解析java虚拟机




