工商銀行支付接口-處理工行支付成功後的消息通知

由於工行的支付接口目前是沒有向B2B商戶提供按訂單號查詢訂單狀態的,因此處理訂單成功支付後的消息就顯得非常重要了,以下爲魯炬在做銀行支付項目時處理工行訂單支付成功通知的核心代碼。

 

  /**
   * 處理工行支付成功通知
   */
  public void notifyDate(String notifyDataBase64, String signMsg, String merVAR, String realPath) {
    String encoding = "gbk";
    log.debug("接收工行通知信息原文:notifyData:" + notifyDataBase64);
    log.debug("接收工行通知信息原文:signMsg:" + signMsg);
    log.debug("接收工行通知信息原文:merVAR:" + merVAR);
    byte[] notifyDataBytes = null;
    String notifyData = null;
    try {
      notifyDataBytes = ReturnValue.base64dec(notifyDataBase64.getBytes(encoding));
      notifyData = new String(notifyDataBytes, encoding);
      log.debug("接收工行通知信息:notifyData:base64解碼後:" + notifyData);
    } catch(UnsupportedEncodingException e) {
      log.error("工行解析通知內容出錯:", e);
      throw new RuntimeException(e);
    }
    String dir = realPath + "/resources/files/bank/icbc/crt/";
    //獲取工行證書
    byte[] bCert = null;
    try {
      FileInputStream fis = new FileInputStream(dir + "admin.crt");
      bCert = new byte[fis.available()];
      fis.read(bCert);
      fis.close();
    } catch(IOException e) {
      log.error("讀取admin.crt,文件出錯:", e);
      throw new RuntimeException(e);
    }
    byte[] bSign = cn.com.infosec.icbc.ReturnValue.base64dec((signMsg.getBytes()));
    byte[] bSrc = notifyDataBytes;
    //開始驗籤
    int recode = -1;
    try {
      recode = cn.com.infosec.icbc.ReturnValue.verifySign(bSrc, bSrc.length, bCert, bSign);
    } catch(Exception e) {
      log.error("驗簽出錯:", e);
      throw new RuntimeException(e);
    }
    if(recode != 0) {
      log.debug("工行驗籤失敗驗證返回碼:" + recode);
      return;
    }
    log.debug("工行驗籤成功,開始解析通知內容");
    //解析通知內容 : 訂單號、是否支付成功、金額
    //notifyData
    XmlParser xmlParser = new XmlParser(new ByteArrayInputStream(notifyDataBytes));
    String orderId = xmlParser.getElementText("/B2CRes/orderInfo/subOrderInfoList/subOrderInfo/orderid");
    String amount = xmlParser.getElementText("/B2CRes/orderInfo/subOrderInfoList/subOrderInfo/amount");
    String tranStat = xmlParser.getElementText("/B2CRes/bank/tranStat");
    log.debug("工行訂單支付成功通知: 訂單號:" + orderId + " 支付狀態:" + tranStat + " 金額:" + amount);
    if(!"1".equals(tranStat)) {
      log.debug("訂單狀態爲未支付成功,返回");
      return;
    }
    //查詢訂單信息
    ExamOrder examOrder = this.examOrderService.queryExamOrderByOrderNum(orderId);
    int examOrderMoney = (new Double(examOrder.getMoney() * 100)).intValue();
    if(!amount.equals(Integer.valueOf(examOrderMoney).toString())) {
      log.debug("實際支付訂單金額與應付金額不等,返回");
      return;
    }
    //更新訂單狀態爲已結算
    try {
      log.debug("更新訂單" + orderId + "狀態爲已結算");
      this.examOrderService.updateSuccessOrder(orderId);
    } catch(Exception e) {
      log.error("更新訂單狀態爲已結算出錯", e);
      throw new RuntimeException(e);
    }
  }


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章