RefundQueryBusiness.java 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. package com.tencent.business;
  2. import com.tencent.common.*;
  3. import com.tencent.common.report.ReporterFactory;
  4. import com.tencent.common.report.protocol.ReportReqData;
  5. import com.tencent.common.report.service.ReportService;
  6. import com.tencent.protocol.refund_query_protocol.RefundOrderData;
  7. import com.tencent.protocol.refund_query_protocol.RefundQueryReqData;
  8. import com.tencent.protocol.refund_query_protocol.RefundQueryResData;
  9. import com.tencent.service.RefundQueryService;
  10. import org.slf4j.LoggerFactory;
  11. import org.xml.sax.SAXException;
  12. import javax.xml.parsers.ParserConfigurationException;
  13. import java.io.IOException;
  14. import java.util.List;
  15. /**
  16. * User: rizenguo
  17. * Date: 2014/12/2
  18. * Time: 18:51
  19. */
  20. public class RefundQueryBusiness {
  21. public RefundQueryBusiness() throws IllegalAccessException, ClassNotFoundException, InstantiationException {
  22. refundQueryService = new RefundQueryService();
  23. }
  24. public interface ResultListener{
  25. //API返回ReturnCode不合法,支付请求逻辑错误,请仔细检测传过去的每一个参数是否合法,或是看API能否被正常访问
  26. void onFailByReturnCodeError(RefundQueryResData refundQueryResData);
  27. //API返回ReturnCode为FAIL,支付API系统返回失败,请检测Post给API的数据是否规范合法
  28. void onFailByReturnCodeFail(RefundQueryResData refundQueryResData);
  29. //支付请求API返回的数据签名验证失败,有可能数据被篡改了
  30. void onFailBySignInvalid(RefundQueryResData refundQueryResData);
  31. //退款查询失败
  32. void onRefundQueryFail(RefundQueryResData refundQueryResData);
  33. //退款查询成功
  34. void onRefundQuerySuccess(RefundQueryResData refundQueryResData);
  35. }
  36. //打log用
  37. private static Log log = new Log(LoggerFactory.getLogger(RefundQueryBusiness.class));
  38. //执行结果
  39. private static String result = "";
  40. //查询到的结果
  41. private static String orderListResult = "";
  42. private RefundQueryService refundQueryService;
  43. public String getOrderListResult() {
  44. return orderListResult;
  45. }
  46. public void setOrderListResult(String orderListResult) {
  47. RefundQueryBusiness.orderListResult = orderListResult;
  48. }
  49. /**
  50. * 运行退款查询的业务逻辑
  51. * @param refundQueryReqData 这个数据对象里面包含了API要求提交的各种数据字段
  52. * @param resultListener 商户需要自己监听被扫支付业务逻辑可能触发的各种分支事件,并做好合理的响应处理
  53. * @throws Exception
  54. */
  55. public void run(RefundQueryReqData refundQueryReqData,RefundQueryBusiness.ResultListener resultListener) throws Exception {
  56. //--------------------------------------------------------------------
  57. //构造请求“退款查询API”所需要提交的数据
  58. //--------------------------------------------------------------------
  59. //接受API返回
  60. String refundQueryServiceResponseString;
  61. long costTimeStart = System.currentTimeMillis();
  62. //表示是本地测试数据
  63. log.i("退款查询API返回的数据如下:");
  64. refundQueryServiceResponseString = refundQueryService.request(refundQueryReqData);
  65. long costTimeEnd = System.currentTimeMillis();
  66. long totalTimeCost = costTimeEnd - costTimeStart;
  67. log.i("api请求总耗时:" + totalTimeCost + "ms");
  68. log.i(refundQueryServiceResponseString);
  69. //将从API返回的XML数据映射到Java对象
  70. RefundQueryResData refundQueryResData = (RefundQueryResData) Util.getObjectFromXML(refundQueryServiceResponseString, RefundQueryResData.class);
  71. ReportReqData reportReqData = new ReportReqData(
  72. refundQueryReqData.getDevice_info(),
  73. Configure.REFUND_QUERY_API,
  74. (int) (totalTimeCost),//本次请求耗时
  75. refundQueryResData.getReturn_code(),
  76. refundQueryResData.getReturn_msg(),
  77. refundQueryResData.getResult_code(),
  78. refundQueryResData.getErr_code(),
  79. refundQueryResData.getErr_code_des(),
  80. refundQueryResData.getOut_trade_no(),
  81. Configure.getIP()
  82. );
  83. long timeAfterReport;
  84. if(Configure.isUseThreadToDoReport()){
  85. ReporterFactory.getReporter(reportReqData).run();
  86. timeAfterReport = System.currentTimeMillis();
  87. Util.log("pay+report总耗时(异步方式上报):"+(timeAfterReport-costTimeStart) + "ms");
  88. }else{
  89. ReportService.request(reportReqData);
  90. timeAfterReport = System.currentTimeMillis();
  91. Util.log("pay+report总耗时(同步方式上报):"+(timeAfterReport-costTimeStart) + "ms");
  92. }
  93. if (refundQueryResData == null || refundQueryResData.getReturn_code() == null) {
  94. setResult("Case1:退款查询API请求逻辑错误,请仔细检测传过去的每一个参数是否合法,或是看API能否被正常访问",Log.LOG_TYPE_ERROR);
  95. resultListener.onFailByReturnCodeError(refundQueryResData);
  96. return;
  97. }
  98. //Debug:查看数据是否正常被填充到scanPayResponseData这个对象中
  99. //Util.reflect(refundQueryResData);
  100. if (refundQueryResData.getReturn_code().equals("FAIL")) {
  101. ///注意:一般这里返回FAIL是出现系统级参数错误,请检测Post给API的数据是否规范合法
  102. setResult("Case2:退款查询API系统返回失败,请检测Post给API的数据是否规范合法",Log.LOG_TYPE_ERROR);
  103. resultListener.onFailByReturnCodeFail(refundQueryResData);
  104. } else {
  105. log.i("退款查询API系统成功返回数据");
  106. //--------------------------------------------------------------------
  107. //收到API的返回数据的时候得先验证一下数据有没有被第三方篡改,确保安全
  108. //--------------------------------------------------------------------
  109. if (!Signature.checkIsSignValidFromResponseString(refundQueryServiceResponseString)) {
  110. setResult("Case3:退款查询API返回的数据签名验证失败,有可能数据被篡改了",Log.LOG_TYPE_ERROR);
  111. resultListener.onFailBySignInvalid(refundQueryResData);
  112. return;
  113. }
  114. if (refundQueryResData.getResult_code().equals("FAIL")) {
  115. Util.log("出错,错误码:" + refundQueryResData.getErr_code() + " 错误信息:" + refundQueryResData.getErr_code_des());
  116. setResult("Case4:【退款查询失败】",Log.LOG_TYPE_ERROR);
  117. resultListener.onRefundQueryFail(refundQueryResData);
  118. //退款失败时再怎么延时查询退款状态都没有意义,这个时间建议要么再手动重试一次,依然失败的话请走投诉渠道进行投诉
  119. } else {
  120. //退款成功
  121. getRefundOrderListResult(refundQueryServiceResponseString);
  122. setResult("Case5:【退款查询成功】",Log.LOG_TYPE_INFO);
  123. resultListener.onRefundQuerySuccess(refundQueryResData);
  124. }
  125. }
  126. }
  127. /**
  128. * 打印出服务器返回的订单查询结果
  129. * @param refundQueryResponseString 退款查询返回API返回的数据
  130. * @throws ParserConfigurationException
  131. * @throws SAXException
  132. * @throws IOException
  133. */
  134. private void getRefundOrderListResult(String refundQueryResponseString) throws ParserConfigurationException, SAXException, IOException {
  135. List<RefundOrderData> refundOrderList = XMLParser.getRefundOrderList(refundQueryResponseString);
  136. int count = 1;
  137. for(RefundOrderData refundOrderData : refundOrderList){
  138. Util.log("退款订单数据NO" + count + ":");
  139. Util.log(refundOrderData.toMap());
  140. orderListResult += refundOrderData.toMap().toString();
  141. count++;
  142. }
  143. log.i("查询到的结果如下:");
  144. log.i(orderListResult);
  145. }
  146. public void setRefundQueryService(RefundQueryService service) {
  147. refundQueryService = service;
  148. }
  149. public String getResult() {
  150. return result;
  151. }
  152. public void setResult(String result) {
  153. RefundQueryBusiness.result = result;
  154. }
  155. public void setResult(String result,String type){
  156. setResult(result);
  157. log.log(type,result);
  158. }
  159. }