Skip to content

Commit

Permalink
update mch pay
Browse files Browse the repository at this point in the history
  • Loading branch information
liyiorg committed Jul 9, 2015
1 parent c14649d commit 5e65ba0
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 22 deletions.
32 changes: 32 additions & 0 deletions src/main/java/weixin/popular/bean/paymch/MchNotifyXml.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package weixin.popular.bean.paymch;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
public class MchNotifyXml {

protected String return_code;

protected String return_msg;

public String getReturn_code() {
return return_code;
}

public void setReturn_code(String return_code) {
this.return_code = return_code;
}

public String getReturn_msg() {
return return_msg;
}

public void setReturn_msg(String return_msg) {
this.return_msg = return_msg;
}


}
32 changes: 10 additions & 22 deletions src/main/java/weixin/popular/example/PayMchNotifyServlet.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,16 @@
package weixin.popular.example;

import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import weixin.popular.bean.paymch.MchBaseResult;
import weixin.popular.bean.paymch.MchNotifyXml;
import weixin.popular.bean.paymch.MchPayNotify;
import weixin.popular.util.ExpireSet;
import weixin.popular.util.MapUtil;
import weixin.popular.util.SignatureUtil;
import weixin.popular.util.StreamUtils;
import weixin.popular.util.XMLConverUtil;

/**
Expand All @@ -37,32 +33,24 @@ public class PayMchNotifyServlet extends HttpServlet{
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//获取请求数据
String xml = StreamUtils.copyToString(request.getInputStream(), Charset.forName("utf-8"));
Map<String, String> map = MapUtil.xmlToMap(xml);

MchPayNotify payNotify = XMLConverUtil.convertToObject(MchPayNotify.class,request.getInputStream());
//已处理 去重
if(expireSet.contains(map.get("transaction_id"))){
if(expireSet.contains(payNotify.getTransaction_id())){
return;
}

//签名验证
String sign = SignatureUtil.generateSign(map,key);
if(!sign.equals(map.get("sign"))){
MchBaseResult baseResult = new MchBaseResult();
baseResult.setReturn_code("FAIL");
baseResult.setReturn_msg("ERROR");
response.getOutputStream().write(XMLConverUtil.convertToXML(baseResult).getBytes());
}else{
//对象转换
MchPayNotify payNotify = XMLConverUtil.convertToObject(MchPayNotify.class, xml);
if(SignatureUtil.validateAppSignature(payNotify,key)){
expireSet.add(payNotify.getTransaction_id());
MchBaseResult baseResult = new MchBaseResult();
MchNotifyXml baseResult = new MchNotifyXml();
baseResult.setReturn_code("SUCCESS");
baseResult.setReturn_msg("OK");
response.getOutputStream().write(XMLConverUtil.convertToXML(baseResult).getBytes());

}else{
MchNotifyXml baseResult = new MchNotifyXml();
baseResult.setReturn_code("FAIL");
baseResult.setReturn_msg("ERROR");
response.getOutputStream().write(XMLConverUtil.convertToXML(baseResult).getBytes());
}
}


}
12 changes: 12 additions & 0 deletions src/main/java/weixin/popular/util/SignatureUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import weixin.popular.bean.pay.PayNativeInput;
import weixin.popular.bean.pay.PayNotify;
import weixin.popular.bean.pay.PayWarn;
import weixin.popular.bean.paymch.MchPayNotify;

public class SignatureUtil {

Expand Down Expand Up @@ -132,4 +133,15 @@ public static boolean validateAppSignature(PayWarn payWarn,String paySignKey) {
return payWarn.getAppsignature().equals(generatePaySign(map,paySignKey));
}

/**
* 验证 mch pay notify sign 签名
* @param mchPayNotify
* @param key mch key
* @return
*/
public static boolean validateAppSignature(MchPayNotify mchPayNotify,String key) {
Map<String, String> map = MapUtil.objectToMap(mchPayNotify);
return mchPayNotify.getSign().equals(generateSign(map,key));
}

}

0 comments on commit 5e65ba0

Please sign in to comment.