New file |
| | |
| | | package com.taxi591.bankapi.service; |
| | | |
| | | import com.alibaba.fastjson2.JSON; |
| | | import com.alibaba.fastjson2.TypeReference; |
| | | import com.ruoyi.common.exception.ServiceException; |
| | | import com.ruoyi.common.utils.DateUtils; |
| | | import com.taxi591.bankapi.dto.ChargeBillRequest; |
| | | import com.taxi591.bankapi.dto.ChargeBillResponse; |
| | | import com.taxi591.bankapi.dto.CovertPayBackResult; |
| | | import com.taxi591.bankapi.utils.Base64; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import java.io.UnsupportedEncodingException; |
| | | import java.util.function.Function; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | @Service |
| | | @Slf4j |
| | | public class BankService { |
| | | |
| | | @Autowired |
| | | SignatureAndVerification signatureAndVerification; |
| | | |
| | | static final String TIMESTAMP_PATTERN = "yyyyMMddHHmmssSSS"; |
| | | |
| | | /** |
| | | * 创建银行应答 |
| | | * @param request 银行请求对象 |
| | | * @param dealResult 是否处理成功 |
| | | * @return |
| | | */ |
| | | public String createResponse(ChargeBillRequest request,Boolean dealResult){ |
| | | ChargeBillResponse response = new ChargeBillResponse(request); |
| | | response.getMessage().getHead().setReturnCode(dealResult?"0000":"1111"); |
| | | response.getMessage().getHead().setReturnMessage(dealResult?"处理成功":"处理失败"); |
| | | response.getMessage().getInfo().setRefundFlag("false"); |
| | | response.getMessage().getHead().setTimeStamp(DateUtils.dateTimeNow(TIMESTAMP_PATTERN)); |
| | | if (!dealResult){ |
| | | if (Integer.parseInt(request.getMessage().getInfo().getResendTimes())==3){ |
| | | response.getMessage().getInfo().setRefundFlag("true"); |
| | | }else{ |
| | | response.getMessage().getInfo().setRefundFlag("false"); |
| | | } |
| | | } |
| | | String respJSON = JSON.toJSONString(response); |
| | | String sign = signatureAndVerification.signWhithsha1withrsa(respJSON); |
| | | String respStr = null; |
| | | try { |
| | | respStr = sign + "||" + new String(org.apache.commons.codec.binary.Base64.encodeBase64(respJSON.getBytes("utf-8"))); |
| | | } catch (UnsupportedEncodingException e) { |
| | | } |
| | | return respStr; |
| | | } |
| | | |
| | | /** |
| | | * 处理支付回调数据 |
| | | * @param httpRequest http请求对象 |
| | | * @param consumer 处理函数 |
| | | * @return |
| | | */ |
| | | public CovertPayBackResult covertPayCallBack(HttpServletRequest httpRequest, Function<ChargeBillRequest,Boolean> consumer) { |
| | | CovertPayBackResult result = new CovertPayBackResult(); |
| | | String requestContent = ""; |
| | | try { |
| | | // 接收报文 |
| | | requestContent = SignatureAndVerification.getRequestBody(httpRequest).trim(); |
| | | String sign = requestContent.substring(0, |
| | | requestContent.indexOf("||"));; |
| | | String requestBody = requestContent.substring(sign |
| | | .length() + 2);; |
| | | Pattern p=Pattern.compile("\""); |
| | | Matcher m=p.matcher(requestBody); |
| | | while(m.find()){ |
| | | requestBody=requestBody.replace(m.group(), ""); |
| | | } |
| | | String request = new String(Base64.decodeFast(requestBody)); |
| | | log.info("-----ChargeBillController------------解析完成后的requestBody-------{}" + request); |
| | | ChargeBillRequest chargeBillRequest = JSON.parseObject(request, |
| | | new TypeReference<ChargeBillRequest>() { |
| | | }); |
| | | if (chargeBillRequest==null){ |
| | | log.error("支付回调解析失败:{}",requestContent); |
| | | throw new ServiceException("支付回调解析失败"); |
| | | } |
| | | boolean isok = signatureAndVerification.read_cer_and_verify_sign(requestBody,sign); |
| | | if (!isok){ |
| | | throw new ServiceException("支付回调验签失败"); |
| | | } |
| | | Boolean dealBack = true; |
| | | if (consumer!=null){ |
| | | dealBack = consumer.apply(chargeBillRequest); |
| | | } |
| | | result.setResult(chargeBillRequest); |
| | | result.setBack(createResponse(chargeBillRequest,dealBack)); |
| | | }catch (ServiceException e){ |
| | | result.setBack(e.getMessage()); |
| | | throw e; |
| | | }catch (Exception e){ |
| | | log.error("解析异常:{}",requestContent,e); |
| | | throw new ServiceException("支付回调解析异常"); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | |
| | | public void covertBillTo(){ |
| | | |
| | | |
| | | } |
| | | |
| | | |
| | | |
| | | } |