欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-03-13 15:17:09
1.1 解析微信回调数据 inputstream instream = request.getinputstream(); bytearrayoutputstr...

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版v3验证数据合法性(deom),希望对大家有所帮助