微信支付回调验证签名java版V3

微信支付java版V3验证数据合法性

概要:使用微信支付接口时,微信会返回或回调给商户XML数据,开发者需要验证微信返回的数据是否合法。

特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,防止数据泄漏导致出现“假通知”,造成资金损失。

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数据。

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(“字段名”)来获取数据。

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。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值