123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197 |
- package com.tencent.business;
- import com.tencent.common.*;
- import com.tencent.common.report.ReporterFactory;
- import com.tencent.common.report.protocol.ReportReqData;
- import com.tencent.common.report.service.ReportService;
- import com.tencent.protocol.refund_query_protocol.RefundOrderData;
- import com.tencent.protocol.refund_query_protocol.RefundQueryReqData;
- import com.tencent.protocol.refund_query_protocol.RefundQueryResData;
- import com.tencent.service.RefundQueryService;
- import org.slf4j.LoggerFactory;
- import org.xml.sax.SAXException;
- import javax.xml.parsers.ParserConfigurationException;
- import java.io.IOException;
- import java.util.List;
- /**
- * User: rizenguo
- * Date: 2014/12/2
- * Time: 18:51
- */
- public class RefundQueryBusiness {
- public RefundQueryBusiness() throws IllegalAccessException, ClassNotFoundException, InstantiationException {
- refundQueryService = new RefundQueryService();
- }
- public interface ResultListener{
- //API返回ReturnCode不合法,支付请求逻辑错误,请仔细检测传过去的每一个参数是否合法,或是看API能否被正常访问
- void onFailByReturnCodeError(RefundQueryResData refundQueryResData);
- //API返回ReturnCode为FAIL,支付API系统返回失败,请检测Post给API的数据是否规范合法
- void onFailByReturnCodeFail(RefundQueryResData refundQueryResData);
- //支付请求API返回的数据签名验证失败,有可能数据被篡改了
- void onFailBySignInvalid(RefundQueryResData refundQueryResData);
- //退款查询失败
- void onRefundQueryFail(RefundQueryResData refundQueryResData);
- //退款查询成功
- void onRefundQuerySuccess(RefundQueryResData refundQueryResData);
- }
- //打log用
- private static Log log = new Log(LoggerFactory.getLogger(RefundQueryBusiness.class));
- //执行结果
- private static String result = "";
- //查询到的结果
- private static String orderListResult = "";
- private RefundQueryService refundQueryService;
- public String getOrderListResult() {
- return orderListResult;
- }
- public void setOrderListResult(String orderListResult) {
- RefundQueryBusiness.orderListResult = orderListResult;
- }
- /**
- * 运行退款查询的业务逻辑
- * @param refundQueryReqData 这个数据对象里面包含了API要求提交的各种数据字段
- * @param resultListener 商户需要自己监听被扫支付业务逻辑可能触发的各种分支事件,并做好合理的响应处理
- * @throws Exception
- */
- public void run(RefundQueryReqData refundQueryReqData,RefundQueryBusiness.ResultListener resultListener) throws Exception {
- //--------------------------------------------------------------------
- //构造请求“退款查询API”所需要提交的数据
- //--------------------------------------------------------------------
- //接受API返回
- String refundQueryServiceResponseString;
- long costTimeStart = System.currentTimeMillis();
- //表示是本地测试数据
- log.i("退款查询API返回的数据如下:");
- refundQueryServiceResponseString = refundQueryService.request(refundQueryReqData);
- long costTimeEnd = System.currentTimeMillis();
- long totalTimeCost = costTimeEnd - costTimeStart;
- log.i("api请求总耗时:" + totalTimeCost + "ms");
- log.i(refundQueryServiceResponseString);
- //将从API返回的XML数据映射到Java对象
- RefundQueryResData refundQueryResData = (RefundQueryResData) Util.getObjectFromXML(refundQueryServiceResponseString, RefundQueryResData.class);
- ReportReqData reportReqData = new ReportReqData(
- refundQueryReqData.getDevice_info(),
- Configure.REFUND_QUERY_API,
- (int) (totalTimeCost),//本次请求耗时
- refundQueryResData.getReturn_code(),
- refundQueryResData.getReturn_msg(),
- refundQueryResData.getResult_code(),
- refundQueryResData.getErr_code(),
- refundQueryResData.getErr_code_des(),
- refundQueryResData.getOut_trade_no(),
- Configure.getIP()
- );
- long timeAfterReport;
- if(Configure.isUseThreadToDoReport()){
- ReporterFactory.getReporter(reportReqData).run();
- timeAfterReport = System.currentTimeMillis();
- Util.log("pay+report总耗时(异步方式上报):"+(timeAfterReport-costTimeStart) + "ms");
- }else{
- ReportService.request(reportReqData);
- timeAfterReport = System.currentTimeMillis();
- Util.log("pay+report总耗时(同步方式上报):"+(timeAfterReport-costTimeStart) + "ms");
- }
- if (refundQueryResData == null || refundQueryResData.getReturn_code() == null) {
- setResult("Case1:退款查询API请求逻辑错误,请仔细检测传过去的每一个参数是否合法,或是看API能否被正常访问",Log.LOG_TYPE_ERROR);
- resultListener.onFailByReturnCodeError(refundQueryResData);
- return;
- }
- //Debug:查看数据是否正常被填充到scanPayResponseData这个对象中
- //Util.reflect(refundQueryResData);
- if (refundQueryResData.getReturn_code().equals("FAIL")) {
- ///注意:一般这里返回FAIL是出现系统级参数错误,请检测Post给API的数据是否规范合法
- setResult("Case2:退款查询API系统返回失败,请检测Post给API的数据是否规范合法",Log.LOG_TYPE_ERROR);
- resultListener.onFailByReturnCodeFail(refundQueryResData);
- } else {
- log.i("退款查询API系统成功返回数据");
- //--------------------------------------------------------------------
- //收到API的返回数据的时候得先验证一下数据有没有被第三方篡改,确保安全
- //--------------------------------------------------------------------
- if (!Signature.checkIsSignValidFromResponseString(refundQueryServiceResponseString)) {
- setResult("Case3:退款查询API返回的数据签名验证失败,有可能数据被篡改了",Log.LOG_TYPE_ERROR);
- resultListener.onFailBySignInvalid(refundQueryResData);
- return;
- }
- if (refundQueryResData.getResult_code().equals("FAIL")) {
- Util.log("出错,错误码:" + refundQueryResData.getErr_code() + " 错误信息:" + refundQueryResData.getErr_code_des());
- setResult("Case4:【退款查询失败】",Log.LOG_TYPE_ERROR);
- resultListener.onRefundQueryFail(refundQueryResData);
- //退款失败时再怎么延时查询退款状态都没有意义,这个时间建议要么再手动重试一次,依然失败的话请走投诉渠道进行投诉
- } else {
- //退款成功
- getRefundOrderListResult(refundQueryServiceResponseString);
- setResult("Case5:【退款查询成功】",Log.LOG_TYPE_INFO);
- resultListener.onRefundQuerySuccess(refundQueryResData);
- }
- }
- }
- /**
- * 打印出服务器返回的订单查询结果
- * @param refundQueryResponseString 退款查询返回API返回的数据
- * @throws ParserConfigurationException
- * @throws SAXException
- * @throws IOException
- */
- private void getRefundOrderListResult(String refundQueryResponseString) throws ParserConfigurationException, SAXException, IOException {
- List<RefundOrderData> refundOrderList = XMLParser.getRefundOrderList(refundQueryResponseString);
- int count = 1;
- for(RefundOrderData refundOrderData : refundOrderList){
- Util.log("退款订单数据NO" + count + ":");
- Util.log(refundOrderData.toMap());
- orderListResult += refundOrderData.toMap().toString();
- count++;
- }
- log.i("查询到的结果如下:");
- log.i(orderListResult);
- }
- public void setRefundQueryService(RefundQueryService service) {
- refundQueryService = service;
- }
- public String getResult() {
- return result;
- }
- public void setResult(String result) {
- RefundQueryBusiness.result = result;
- }
- public void setResult(String result,String type){
- setResult(result);
- log.log(type,result);
- }
- }
|