package com.starcharge.component.pay.weixin; import java.nio.charset.Charset; import java.util.Date; import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.starcharge.wios.service.UserPayBillService; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import com.ihidea.core.util.ServletUtilsEx; import com.ihidea.core.util.XMLUtilsEx; /** * 微信支付回调接口 * @author kevin */ @Controller public class WeixinPayController { private final static Logger logger = LoggerFactory.getLogger(WeixinPayController.class); @Autowired private UserPayBillService userPayBillService; @SuppressWarnings("unchecked") @RequestMapping(value = "/weixin.pay.notify.do") public void notify(HttpServletRequest request, HttpServletResponse response) throws Exception { String xmlStr = IOUtils.toString(request.getInputStream(), Charset.defaultCharset()); logger.info("收到微信支付回调,数据:"+xmlStr); Map<String, String> requestMap = XMLUtilsEx.deserialize(xmlStr, Map.class); // 通知状态 String returnCode = requestMap.get("return_code"); // 订单状态 String resultCode = requestMap.get("result_code"); String signStr = requestMap.get("sign"); // 商户订单号 String out_trade_no = requestMap.get("out_trade_no"); requestMap.remove("sign"); String signedStr = WeixinPayCore.getSign(requestMap); Map<String, String> responseMap = new HashMap<String, String>(); if (StringUtils.equals("SUCCESS", returnCode) && StringUtils.equals("SUCCESS", resultCode) && StringUtils.isNotBlank(signStr) && signStr.equals(signedStr)) { // 支付成功更新账单 payBillSuccess(requestMap); responseMap.put("return_code", "SUCCESS"); responseMap.put("return_msg", "ok"); } else { responseMap.put("return_code", "FAIL"); responseMap.put("return_msg", requestMap.get("return_msg")); } ServletUtilsEx.renderText(response, "<xml>" + XMLUtilsEx.serialize(responseMap) + "</xml>"); } public void payBillSuccess(Map requestMap){ // 商户订单号 String out_trade_no = (String)requestMap.get("out_trade_no"); logger.info("支付成功:"+out_trade_no); // 交易号 String transaction_id = (String)requestMap.get("transaction_id"); // 微信openId String openId = (String)requestMap.get("openid"); // 附加数据 String attach = (String)requestMap.get("attach"); // 更新支付信息 int source = StringUtils.equals(attach, "2") ? 2 : 1; userPayBillService.paySuccess(out_trade_no.split("_")[0], 3, openId, transaction_id, new Date(), source); } }