品优购-检测支付状态 4.1 需求分析及实现思路 4.1.1 需求分析 当用户支付成功后跳转到成功页面 2 实现思路 我们通过 HttpClient 工具类实现对远程支付接口的调用。 接口链接:https://api.mch.weixin.qq.com/pay/orderquery 具体参数参见“查询订单”API, 我们在 controller 方法中轮询调用查询订单(间隔 3 秒), 当返回状态为 success 时,我们会在 controller 方法返回结果。前端代码收到结果后跳转到成 功页面。 2 检测支付状态-后端代码 4.2.1 服务接口层

在 pinyougou-pay-interface 的 WeixinPayService.java 中新增方法定义 

/**
  * 查询支付状态 
  * @param out_trade_no 
  */
 public Map queryPayStatus(String out_trade_no);

服务实现层 
在 pinyougou-pay-service 的 WeixinPayServiceImpl.java 中实现方法 

@Override 
 public Map queryPayStatus(String out_trade_no) {
  Map param=new HashMap(); 
  param.put("appid", appid);//公众账号 ID 
  param.put("mch_id", partner);//商户号 
  param.put("out_trade_no", out_trade_no);//订单号 
  param.put("nonce_str", WXPayUtil.generateNonceStr());//随机字符串 
  String url="https://api.mch.weixin.qq.com/pay/orderquery";   
  try {
   String xmlParam = WXPayUtil.generateSignedXml(param, partnerkey);  
   HttpClient client=new HttpClient(url); 
   client.setHttps(true); 
client.setXmlParam(xmlParam); 
   client.post(); 
   String result = client.getContent();    
   Map<String, String> map = WXPayUtil.xmlToMap(result); 
   System.out.println(map); 
   return map;    
  } catch (Exception e) {
   e.printStackTrace(); 
   return null; 
  } 
 }

控制层 
在 pinyougou-cart-web 的 PayController.java 新增方法 

/**
  * 查询支付状态 
  * @param out_trade_no 
  * @return
  */
 @RequestMapping("/queryPayStatus")
 public Result queryPayStatus(String out_trade_no){
  Result result=null;   
  while(true){
//调用查询接口 
   Map<String,String> map = weixinPayService.queryPayStatus(out_trade_no); 
   if(map==null){//出错    
    result=new  Result(false, "支付出错"); 
    break; 
   }   
   if(map.get("trade_state").equals("SUCCESS")){//如果成功     
    result=new  Result(true, "支付成功"); 
    break; 
   }   
   try {
    Thread.sleep(3000);//间隔三秒 
   } catch (InterruptedException e) {
    e.printStackTrace(); 
   }       
  }
  return result; 
 }