工商银行支付接口-处理工行支付成功后的消息通知
2013-01-30 10:10
260 查看
由于工行的支付接口目前是没有向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); } }
相关文章推荐
- 微信模板消息接口-给用户发送订单成功信息/支付成功等等
- 银行支付回调接口通知失败后,过段时间又通知成功
- 支付宝中的手机网站支付接口,php版 notify_url.php 异步通知页面未成功执行
- 个人处理结算异步通知接口(被回调对象)
- c# 支付宝新版接口异步通知notify_url、Return_url处理
- PHP开发微信支付代码及支付通知处理
- php编写微信公众平台消息处理接口教程
- 微信小程序之支付后调用SDK的异步通知及验证处理订单
- Onvif事件处理模块之基本通知接口模式(NVC部分)
- MediaPlayer接收通知消息的处理流程
- WPF的消息机制(三)- WPF内部的5个窗口之处理激活和关闭的消息窗口以及系统资源通知窗口
- 工行支付接口开发(Java版)体会和问题解决
- 支付宝接口支付成功但是return_url验证失败
- 基于WF设计业务流程平台_消息收集、通知接口
- 工行的支付接口
- php处理苹果支付接口回调
- MOOON-server新消息处理接口
- 工商银行支付接口 B2C PHP ecshop
- android alipay(移动支付,异步通知发起失败,但是支付成功)
- Qt之事件过滤器 截获消息通知 自定义消息处理事件解析.