1、下载dom4j包,在我的资源中有下载。
2、代码实现,以下只列出接口类,其他相关类在微信包中有。若找不到的可以加我QQ:383010096
import java.io.BufferedReader;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/wxnotify")
public class WeiXinController {
@Autowired
private TOrderService tOrderService ;
@Autowired
private TMemberOpenService tMemberOpenService ;
@Autowired
private TRechargeLogService tRechargeLogService ;
@Autowired
private TMemberAccountService tMemberAccountService ;
@Autowired
private TMemberService tMemberService ;
@RequestMapping(value = { "/getPayNotify" }, method = { RequestMethod.POST })
@ResponseBody
public String getPayNotify(HttpServletRequest request,HttpServletResponse response) throws Exception {
BufferedReader reader = null ;
reader = request.getReader() ;
String line = "" ;
String xmlString = null ;
StringBuffer inputString = new StringBuffer() ;
while( (line = reader.readLine()) != null ){
inputString.append(line) ;
}
xmlString = inputString.toString() ;
request.getReader().close();
Map<String, String> map = new HashMap<>() ;
String result_code = "" ;
String return_code = "" ;
String out_trade_no = "" ;
map = XMLUtil.doXMLParse(xmlString) ;
result_code = map.get("result_code") ;
out_trade_no = map.get("out_trade_no") ;
return_code = map.get("return_code") ;
if( checkSign(xmlString)){
//订单操作
if( result_code.toLowerCase().equals("success") ){
//业务处理
}
return returnXML(result_code) ;
}
else{
return returnXML("FAIL") ;
}
}
private boolean checkSign(String xmlString){
Map<String,String> map = null ;
try{
map = XMLUtil.doXMLParse(xmlString) ;
}
catch(Exception e){
e.printStackTrace();
return false ;
}
String signFromAPIResponse = map.get("sign").toString() ;
if( StringUtils.isEmpty(signFromAPIResponse) ){
return false ;
}
map.put("sign", "") ;
String signForAPIResponse = getSign(map) ;
if( !signForAPIResponse.equals(signFromAPIResponse) ){
return false ;
}
return true ;
}
private String getSign(Map<String,String> map){
SortedMap<String, String> signParams = new TreeMap<String, String>();
for (Map.Entry<String, String> stringStringEntry : map.entrySet()) {
signParams.put(stringStringEntry.getKey(), stringStringEntry.getValue());
}
signParams.remove("sign");
String sign = createSign("UTF-8", signParams);
return sign;
}
private static String createSign(String characterEncoding,SortedMap<String,String> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
sb.append("key=" + WeiXinConfig.PARTNER_KEY);//最后加密时添加商户密钥,由于key值放在最后,所以不用添加到SortMap里面去,单独处理,编码方式采用UTF-8
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
private String returnXML(String return_code) {
return "<xml><return_code><![CDATA["
+ return_code
+ "]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
private boolean doPayResult( String out_trade_no ){
/**
* 1、查询是否是订单,若是订单,进行订单处理;
* 2、不是订单,查询是否是开通会员,若是,进行开通会员处理;
* 3、不是开通会员,充值处理
*/
TOrder order = tOrderService.getOne(out_trade_no) ;
if( order != null ){
return this.doOrderPay(order) ;
}
else{
TMemberOpen open = tMemberOpenService.getByOpenId(out_trade_no) ;
if( open != null ){
return this.doOpenMemberPay(open) ;
}
else{
TRechargeLog recharge = tRechargeLogService.getOne(out_trade_no) ;
if( recharge != null ){
return this.doRechargePay(recharge) ;
}
}
}
return true ;
}
}