no message
This commit is contained in:
@ -3,6 +3,7 @@ package com.sczx.pay.config;
|
|||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.context.annotation.Profile;
|
||||||
import springfox.documentation.builders.ApiInfoBuilder;
|
import springfox.documentation.builders.ApiInfoBuilder;
|
||||||
import springfox.documentation.builders.ParameterBuilder;
|
import springfox.documentation.builders.ParameterBuilder;
|
||||||
import springfox.documentation.builders.PathSelectors;
|
import springfox.documentation.builders.PathSelectors;
|
||||||
@ -17,6 +18,7 @@ import java.util.Arrays;
|
|||||||
|
|
||||||
@Configuration
|
@Configuration
|
||||||
@EnableSwagger2
|
@EnableSwagger2
|
||||||
|
@Profile("!prod") // 除了prod环境外都启用
|
||||||
public class SwaggerConfig {
|
public class SwaggerConfig {
|
||||||
@Bean
|
@Bean
|
||||||
public Docket createRestApi() {
|
public Docket createRestApi() {
|
||||||
|
|||||||
@ -138,6 +138,55 @@ public class AliPayNotifyController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 支付宝退款结果通知
|
||||||
|
*/
|
||||||
|
@ApiOperation(value = "支付宝免押通知")
|
||||||
|
@PostMapping("/freeze/notify")
|
||||||
|
public String alipayFreezeNotify(HttpServletRequest request) {
|
||||||
|
try {
|
||||||
|
// 读取支付宝退款回调数据
|
||||||
|
Map<String, String> params = new HashMap<>();
|
||||||
|
Map<String, String[]> requestParams = request.getParameterMap();
|
||||||
|
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
|
||||||
|
String name = iter.next();
|
||||||
|
String[] values = requestParams.get(name);
|
||||||
|
String valueStr = "";
|
||||||
|
for (int i = 0; i < values.length; i++) {
|
||||||
|
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
|
||||||
|
}
|
||||||
|
params.put(name, valueStr);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("收到支付宝免押结果通知, 数据: {}", params);
|
||||||
|
|
||||||
|
// 验证签名
|
||||||
|
// 注意:支付宝退款通知的签名验证方式可能与支付通知不同
|
||||||
|
// 这里简化处理,实际应根据支付宝文档实现
|
||||||
|
|
||||||
|
|
||||||
|
String status = params.get("status");
|
||||||
|
|
||||||
|
if ("SUCCESS".equals(status)) {
|
||||||
|
log.warn("支付宝免押通知状态失败: {}", status);
|
||||||
|
// 处理免押通知
|
||||||
|
String outOrderNo = params.get("out_order_no");
|
||||||
|
String authNo = params.get("auth_no");
|
||||||
|
|
||||||
|
// 更新数据库中的免押支付状态
|
||||||
|
boolean success = alipayService.processFreezeNotify(outOrderNo,authNo);
|
||||||
|
if (success) {
|
||||||
|
log.info("支付宝免押处理完成,支付单号: {}, 支付宝授权资金订单号: {}",
|
||||||
|
outOrderNo, authNo);
|
||||||
|
return buildResponse("success");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理支付宝退款通知异常", e);
|
||||||
|
}
|
||||||
|
return buildResponse("failure");
|
||||||
|
}
|
||||||
|
|
||||||
private String buildResponse(String result) {
|
private String buildResponse(String result) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,19 @@
|
|||||||
|
package com.sczx.pay.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel("支付宝资金冻结请求参数")
|
||||||
|
@Data
|
||||||
|
public class AlipayFinishFreezeRequest {
|
||||||
|
private String companyId;
|
||||||
|
@ApiModelProperty(value = "支付宝资金授权订单号")
|
||||||
|
private String authNo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "解冻请求流水号")
|
||||||
|
private String outRequestNo;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "解冻金额")
|
||||||
|
private String amount;
|
||||||
|
}
|
||||||
16
src/main/java/com/sczx/pay/dto/AlipayFundFreezeRequest.java
Normal file
16
src/main/java/com/sczx/pay/dto/AlipayFundFreezeRequest.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package com.sczx.pay.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel("支付宝资金冻结请求参数")
|
||||||
|
@Data
|
||||||
|
public class AlipayFundFreezeRequest {
|
||||||
|
private String companyId;
|
||||||
|
private String outOrderNo;
|
||||||
|
private String title;
|
||||||
|
private String amount;
|
||||||
|
@ApiModelProperty(value = "支付宝资金授权订单号")
|
||||||
|
private String authNo;
|
||||||
|
}
|
||||||
14
src/main/java/com/sczx/pay/dto/AlipayFundFreezeResponse.java
Normal file
14
src/main/java/com/sczx/pay/dto/AlipayFundFreezeResponse.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package com.sczx.pay.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel("支付宝资金冻结响应参数")
|
||||||
|
@Data
|
||||||
|
public class AlipayFundFreezeResponse {
|
||||||
|
private boolean success;
|
||||||
|
private String message;
|
||||||
|
private String outTradeNo; // 商户订单号
|
||||||
|
private String orderStr; // 支付串(用于前端调起支付)
|
||||||
|
private String code; // 状态码
|
||||||
|
}
|
||||||
12
src/main/java/com/sczx/pay/dto/AlipayQueryFreezeRequest.java
Normal file
12
src/main/java/com/sczx/pay/dto/AlipayQueryFreezeRequest.java
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
package com.sczx.pay.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel("支付宝资金冻结请求参数")
|
||||||
|
@Data
|
||||||
|
public class AlipayQueryFreezeRequest {
|
||||||
|
private String companyId;
|
||||||
|
private String outOrderNo;
|
||||||
|
private String operationType;
|
||||||
|
}
|
||||||
@ -0,0 +1,14 @@
|
|||||||
|
package com.sczx.pay.dto;
|
||||||
|
|
||||||
|
import io.swagger.annotations.ApiModel;
|
||||||
|
import lombok.Data;
|
||||||
|
|
||||||
|
@ApiModel("支付宝资金冻结响应参数")
|
||||||
|
@Data
|
||||||
|
public class AlipayQueryFreezeResponse {
|
||||||
|
private boolean success;
|
||||||
|
private String message;
|
||||||
|
private String outTradeNo; // 商户订单号
|
||||||
|
private String authNo; // 支付串(用于前端调起支付)
|
||||||
|
private String code; // 状态码
|
||||||
|
}
|
||||||
@ -70,4 +70,11 @@ public interface OrderPayMapper {
|
|||||||
@Select("select * from zc_order_sub where payment_id = #{paymentId} order by suborder_id desc limit 1")
|
@Select("select * from zc_order_sub where payment_id = #{paymentId} order by suborder_id desc limit 1")
|
||||||
OrderSub getSubOrderByTradeNo(@Param("paymentId") String paymentId);
|
OrderSub getSubOrderByTradeNo(@Param("paymentId") String paymentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 免押成功,更新子订单状态
|
||||||
|
*/
|
||||||
|
@Update("update zc_order_sub set transaction_id = #{transactionId},pay_status = 'SUCCESS'" +
|
||||||
|
" where payment_id = #{authNo}")
|
||||||
|
int updateFreezeSubOrderPaymentStatus(@Param("authNo") String authNo,
|
||||||
|
@Param("transactionId") String transactionId);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -30,6 +30,26 @@ public interface AlipayService {
|
|||||||
*/
|
*/
|
||||||
AlipayResponse refundQuery(AlipayRefundRequest refundQueryRequest);
|
AlipayResponse refundQuery(AlipayRefundRequest refundQueryRequest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 资金授权冻结接口
|
||||||
|
*/
|
||||||
|
AlipayFundFreezeResponse fundFreeze(AlipayFundFreezeRequest alipayFundFreezeRequest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 撤销资金授权冻结接口
|
||||||
|
*/
|
||||||
|
AlipayFundFreezeResponse cancelFundFreeze(AlipayFundFreezeRequest alipayFundFreezeRequest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询资金授权冻结接口
|
||||||
|
*/
|
||||||
|
AlipayQueryFreezeResponse queryFundFreeze(AlipayQueryFreezeRequest alipayQueryFreezeRequest);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 完结冻结接口
|
||||||
|
*/
|
||||||
|
AlipayResponse finishFreeze(AlipayFinishFreezeRequest alipayFinishFreezeRequest);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证通知签名
|
* 验证通知签名
|
||||||
*/
|
*/
|
||||||
@ -44,4 +64,9 @@ public interface AlipayService {
|
|||||||
* 处理退款通知
|
* 处理退款通知
|
||||||
*/
|
*/
|
||||||
boolean processRefundNotify(Map<String, String> notifyMap);
|
boolean processRefundNotify(Map<String, String> notifyMap);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理免押通知
|
||||||
|
*/
|
||||||
|
boolean processFreezeNotify(String outOrderNo,String authNo);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,6 +11,7 @@ import com.sczx.pay.mapper.OrderPayMapper;
|
|||||||
import com.sczx.pay.mapper.PaymentRecordMapper;
|
import com.sczx.pay.mapper.PaymentRecordMapper;
|
||||||
import com.sczx.pay.mapper.RefundRecordMapper;
|
import com.sczx.pay.mapper.RefundRecordMapper;
|
||||||
import com.sczx.pay.sdk.WXPay;
|
import com.sczx.pay.sdk.WXPay;
|
||||||
|
import com.sczx.pay.thirdpart.integration.SyncInteg;
|
||||||
import com.sczx.pay.utils.WXPayUtil;
|
import com.sczx.pay.utils.WXPayUtil;
|
||||||
import com.sczx.pay.utils.IPUtils;
|
import com.sczx.pay.utils.IPUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
@ -51,6 +52,9 @@ public class WechatPayService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrderPayMapper orderPayMapper;
|
private OrderPayMapper orderPayMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SyncInteg syncInteg;
|
||||||
|
|
||||||
@Value("${wechat.pay.app-id}")
|
@Value("${wechat.pay.app-id}")
|
||||||
private String appId;
|
private String appId;
|
||||||
|
|
||||||
@ -271,7 +275,7 @@ public class WechatPayService {
|
|||||||
refundNotifyUrl
|
refundNotifyUrl
|
||||||
);
|
);
|
||||||
|
|
||||||
String path = certPath+companyConfig.getMchId()+".p12";
|
String path = certPath+"wechatpay-"+companyConfig.getMchId()+"/"+companyConfig.getMchId()+".p12";
|
||||||
String certAbsolutePath = getCertAbsolutePath(path);
|
String certAbsolutePath = getCertAbsolutePath(path);
|
||||||
wxPayConfig.setCertPath(certAbsolutePath);
|
wxPayConfig.setCertPath(certAbsolutePath);
|
||||||
|
|
||||||
@ -293,9 +297,14 @@ public class WechatPayService {
|
|||||||
/**
|
/**
|
||||||
* 记录退款信息到数据库
|
* 记录退款信息到数据库
|
||||||
*/
|
*/
|
||||||
private void recordRefundInfo(RefundRequest request, CompanyWechatConfig companyConfig, Map<String, String> result,BigDecimal totalFee) {
|
private void recordRefundInfo(RefundRequest request, CompanyWechatConfig companyConfig, Map<String, String> result, BigDecimal totalFee) {
|
||||||
try {
|
try {
|
||||||
RefundRecord refundRecord = new RefundRecord();
|
RefundRecord refundRecord = refundRecordMapper.getRefundRecordByOutRefundNo(request.getOutRefundNo());
|
||||||
|
if (refundRecord != null) {
|
||||||
|
logger.warn("已存在对应的退款记录,退款单号: {}", request.getOutRefundNo());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
refundRecord = new RefundRecord();
|
||||||
refundRecord.setCompanyId(request.getCompanyId());
|
refundRecord.setCompanyId(request.getCompanyId());
|
||||||
refundRecord.setOutTradeNo(request.getOutTradeNo());
|
refundRecord.setOutTradeNo(request.getOutTradeNo());
|
||||||
refundRecord.setOutRefundNo(request.getOutRefundNo());
|
refundRecord.setOutRefundNo(request.getOutRefundNo());
|
||||||
@ -316,6 +325,8 @@ public class WechatPayService {
|
|||||||
|
|
||||||
refundRecordMapper.insertRefundRecord(refundRecord);
|
refundRecordMapper.insertRefundRecord(refundRecord);
|
||||||
logger.info("退款记录已保存,退款单号: {}", request.getOutRefundNo());
|
logger.info("退款记录已保存,退款单号: {}", request.getOutRefundNo());
|
||||||
|
|
||||||
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
logger.error("保存退款记录异常,退款单号: {}", request.getOutRefundNo(), e);
|
logger.error("保存退款记录异常,退款单号: {}", request.getOutRefundNo(), e);
|
||||||
}
|
}
|
||||||
@ -416,6 +427,9 @@ public class WechatPayService {
|
|||||||
}else if (OrderStatus.equals("RERENT_WAIT_PAY")){
|
}else if (OrderStatus.equals("RERENT_WAIT_PAY")){
|
||||||
OrderSub orderSub = orderPayMapper.getSubOrderByTradeNo(outTradeNo);
|
OrderSub orderSub = orderPayMapper.getSubOrderByTradeNo(outTradeNo);
|
||||||
orderPayMapper.updateOrderStatusAndEndRentTime(orderMain.getOrderNo(),orderSub.getReturnTime(),0,orderMain.getOrderAmount().add(orderSub.getAmount()),"RENT_ING");
|
orderPayMapper.updateOrderStatusAndEndRentTime(orderMain.getOrderNo(),orderSub.getReturnTime(),0,orderMain.getOrderAmount().add(orderSub.getAmount()),"RENT_ING");
|
||||||
|
//发送租电订单同步
|
||||||
|
Long batterySubOrderId = orderPayMapper.getSubOrderIdByTradeNo(outTradeNo);
|
||||||
|
syncInteg.sendSubOrderId(batterySubOrderId);
|
||||||
}
|
}
|
||||||
orderPayMapper.updateSubOrderPaymentStatus(outTradeNo,"WX_PAY",PayStatus.SUCCESS.getCode(),transactionId);
|
orderPayMapper.updateSubOrderPaymentStatus(outTradeNo,"WX_PAY",PayStatus.SUCCESS.getCode(),transactionId);
|
||||||
|
|
||||||
|
|||||||
@ -14,8 +14,11 @@ import com.sczx.pay.mapper.OrderPayMapper;
|
|||||||
import com.sczx.pay.mapper.PaymentRecordMapper;
|
import com.sczx.pay.mapper.PaymentRecordMapper;
|
||||||
import com.sczx.pay.mapper.RefundRecordMapper;
|
import com.sczx.pay.mapper.RefundRecordMapper;
|
||||||
import com.sczx.pay.service.AlipayService;
|
import com.sczx.pay.service.AlipayService;
|
||||||
|
import com.sczx.pay.thirdpart.integration.SyncInteg;
|
||||||
import com.sczx.pay.utils.AlipaySdkUtil;
|
import com.sczx.pay.utils.AlipaySdkUtil;
|
||||||
|
import com.sczx.pay.utils.ThreadPoolUtils;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
@ -40,9 +43,16 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
@Value("${alipay.refund-notify-url}")
|
@Value("${alipay.refund-notify-url}")
|
||||||
private String refundNotifyUrl;
|
private String refundNotifyUrl;
|
||||||
|
|
||||||
|
@Value("${alipay.freeze-notify-url}")
|
||||||
|
private String freezeNotifyUrl;
|
||||||
|
|
||||||
|
|
||||||
@Value("${alipay.alipay-public-cert-path}")
|
@Value("${alipay.alipay-public-cert-path}")
|
||||||
private String alipayPublicCertPath;
|
private String alipayPublicCertPath;
|
||||||
|
|
||||||
|
@Value("${alipay.serviceid}")
|
||||||
|
private String serviceId ;
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private PaymentRecordMapper paymentRecordMapper;
|
private PaymentRecordMapper paymentRecordMapper;
|
||||||
@ -53,6 +63,9 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private OrderPayMapper orderPayMapper;
|
private OrderPayMapper orderPayMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SyncInteg syncInteg;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AlipayCreateResponse unifiedOrder(AlipayCreateRequest alipayCreateRequest) {
|
public AlipayCreateResponse unifiedOrder(AlipayCreateRequest alipayCreateRequest) {
|
||||||
AlipayCreateResponse response = new AlipayCreateResponse();
|
AlipayCreateResponse response = new AlipayCreateResponse();
|
||||||
@ -277,6 +290,16 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
response.setSuccess(true);
|
response.setSuccess(true);
|
||||||
response.setCode("SUCCESS");
|
response.setCode("SUCCESS");
|
||||||
response.setMessage("退款成功");
|
response.setMessage("退款成功");
|
||||||
|
ThreadPoolUtils.getThreadPool().execute(() -> {
|
||||||
|
refundRecordMapper.updateRefundStatus(
|
||||||
|
refundQueryRequest.getOutRequestNo(),
|
||||||
|
refundQueryResponse.getRefundStatus(),
|
||||||
|
refundQueryResponse.getRefundReason(),
|
||||||
|
refundQueryRequest.getOutRequestNo(),
|
||||||
|
new Date(),// 退款成功时间
|
||||||
|
new Date() // 更新时间
|
||||||
|
);
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
response.setSuccess(false);
|
response.setSuccess(false);
|
||||||
response.setCode("FAIL");
|
response.setCode("FAIL");
|
||||||
@ -291,6 +314,205 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AlipayFundFreezeResponse fundFreeze(AlipayFundFreezeRequest alipayFundFreezeRequest) {
|
||||||
|
AlipayFundFreezeResponse response = new AlipayFundFreezeResponse();
|
||||||
|
try {
|
||||||
|
// 构造请求参数以调用接口
|
||||||
|
AlipayFundAuthOrderAppFreezeRequest request = new AlipayFundAuthOrderAppFreezeRequest();
|
||||||
|
AlipayFundAuthOrderAppFreezeModel model = new AlipayFundAuthOrderAppFreezeModel();
|
||||||
|
|
||||||
|
// 设置订单标题
|
||||||
|
model.setOrderTitle(alipayFundFreezeRequest.getTitle());
|
||||||
|
|
||||||
|
// 设置商户授权资金订单号
|
||||||
|
model.setOutOrderNo(alipayFundFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
// 设置商户本次资金操作的请求流水号
|
||||||
|
model.setOutRequestNo(alipayFundFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
// 设置需要冻结的金额
|
||||||
|
model.setAmount(alipayFundFreezeRequest.getAmount());
|
||||||
|
|
||||||
|
// 设置预授权订单相对超时时间
|
||||||
|
model.setTimeoutExpress("5m");
|
||||||
|
|
||||||
|
// 设置销售产品码
|
||||||
|
model.setProductCode("PRE_AUTH_ONLINE");
|
||||||
|
|
||||||
|
// 设置业务扩展参数
|
||||||
|
model.setExtraParam("{\"category\": \"CHARGE_PILE_CAR\",\"serviceId\": \""+serviceId+"\"}");
|
||||||
|
|
||||||
|
// 设置免押受理台模式
|
||||||
|
model.setDepositProductMode("DEPOSIT_ONLY");
|
||||||
|
|
||||||
|
request.setBizModel(model);
|
||||||
|
|
||||||
|
// 设置异步通知地址
|
||||||
|
request.setNotifyUrl(freezeNotifyUrl);
|
||||||
|
log.info("免押冻结请求 : {}",request);
|
||||||
|
AlipayFundAuthOrderAppFreezeResponse fundAuthOrderAppFreezeResponse = alipaySdkUtil.sdkExecute(request);
|
||||||
|
log.info("免押冻结响应 : {}",fundAuthOrderAppFreezeResponse.getBody());
|
||||||
|
|
||||||
|
if (fundAuthOrderAppFreezeResponse.isSuccess()) {
|
||||||
|
response.setOrderStr(fundAuthOrderAppFreezeResponse.getBody());
|
||||||
|
response.setSuccess(true);
|
||||||
|
response.setCode("SUCCESS");
|
||||||
|
response.setMessage("免押冻结成功");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("免押冻结失败: " + fundAuthOrderAppFreezeResponse.getMsg() + ":" + fundAuthOrderAppFreezeResponse.getSubMsg());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("支付宝免押冻结异常,公司ID: {}, 订单号: {}", alipayFundFreezeRequest.getCompanyId(), alipayFundFreezeRequest.getOutOrderNo(), e);
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("支付宝免押冻结失败异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AlipayFundFreezeResponse cancelFundFreeze(AlipayFundFreezeRequest alipayFundFreezeRequest) {
|
||||||
|
AlipayFundFreezeResponse response = new AlipayFundFreezeResponse();
|
||||||
|
try {
|
||||||
|
// 构造请求参数以调用接口
|
||||||
|
AlipayFundAuthOperationCancelRequest request = new AlipayFundAuthOperationCancelRequest();
|
||||||
|
AlipayFundAuthOperationCancelModel model = new AlipayFundAuthOperationCancelModel();
|
||||||
|
|
||||||
|
// 设置商户的授权资金订单号
|
||||||
|
model.setOutOrderNo(alipayFundFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
// 设置商户的授权资金操作流水号
|
||||||
|
model.setOutRequestNo(alipayFundFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
//设置商户的授权资金操作流水号
|
||||||
|
model.setAuthNo(alipayFundFreezeRequest.getAuthNo());
|
||||||
|
|
||||||
|
// 设置商户对本次撤销操作的附言描述
|
||||||
|
model.setRemark(alipayFundFreezeRequest.getTitle());
|
||||||
|
|
||||||
|
request.setBizModel(model);
|
||||||
|
|
||||||
|
request.setBizModel(model);
|
||||||
|
log.info("取消免押冻结请求 : {}",request.getTextParams());
|
||||||
|
AlipayFundAuthOperationCancelResponse fundAuthOperationCancelResponse = alipaySdkUtil.execute(request);
|
||||||
|
log.info("取消免押冻结响应 : {}",fundAuthOperationCancelResponse.getBody());
|
||||||
|
|
||||||
|
if (fundAuthOperationCancelResponse.isSuccess()) {
|
||||||
|
response.setSuccess(true);
|
||||||
|
response.setCode("SUCCESS");
|
||||||
|
response.setMessage("取消免押冻结成功");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("取消免押冻结失败: " + fundAuthOperationCancelResponse.getMsg() + ":" + fundAuthOperationCancelResponse.getSubMsg());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("支付宝取消免押冻结异常,公司ID: {}, 订单号: {}", alipayFundFreezeRequest.getCompanyId(), alipayFundFreezeRequest.getOutOrderNo(), e);
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("支付宝取消免押冻结失败异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AlipayQueryFreezeResponse queryFundFreeze(AlipayQueryFreezeRequest alipayQueryFreezeRequest) {
|
||||||
|
AlipayQueryFreezeResponse response = new AlipayQueryFreezeResponse();
|
||||||
|
try {
|
||||||
|
// 构造请求参数以调用接口
|
||||||
|
AlipayFundAuthOperationDetailQueryRequest request = new AlipayFundAuthOperationDetailQueryRequest();
|
||||||
|
AlipayFundAuthOperationDetailQueryModel model = new AlipayFundAuthOperationDetailQueryModel();
|
||||||
|
//
|
||||||
|
// // 设置支付宝授权资金订单号
|
||||||
|
// model.setAuthNo("2014021601002000640012345678");
|
||||||
|
|
||||||
|
// 设置商户的授权资金订单号
|
||||||
|
model.setOutOrderNo(alipayQueryFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
// // 设置支付宝的授权资金操作流水号
|
||||||
|
// model.setOperationId("20140216010020006400");
|
||||||
|
|
||||||
|
// 设置商户的授权资金操作流水号
|
||||||
|
model.setOutRequestNo(alipayQueryFreezeRequest.getOutOrderNo());
|
||||||
|
|
||||||
|
// 设置需要查询的授权资金操作类型
|
||||||
|
model.setOperationType(alipayQueryFreezeRequest.getOperationType());
|
||||||
|
|
||||||
|
request.setBizModel(model);
|
||||||
|
log.info("查询免押冻结请求 : {}",request);
|
||||||
|
AlipayFundAuthOperationDetailQueryResponse queryResponse = alipaySdkUtil.execute(request);
|
||||||
|
log.info("查询免押冻结响应 : {}",queryResponse.getBody());
|
||||||
|
|
||||||
|
if (queryResponse.isSuccess() && StringUtils.equalsIgnoreCase(queryResponse.getOrderStatus(), "AUTHORIZED")) {
|
||||||
|
response.setSuccess(true);
|
||||||
|
response.setCode("SUCCESS");
|
||||||
|
response.setAuthNo(queryResponse.getAuthNo());
|
||||||
|
response.setOutTradeNo(queryResponse.getOutOrderNo());
|
||||||
|
response.setMessage("查询免押冻结成功");
|
||||||
|
|
||||||
|
} else {
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("查询免押冻结失败: " + queryResponse.getMsg() + ":" + queryResponse.getSubMsg());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("支付宝查询免押冻结异常,公司ID: {}, 订单号: {}", alipayQueryFreezeRequest.getCompanyId(), alipayQueryFreezeRequest.getOutOrderNo(), e);
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("支付宝查询免押冻结失败异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AlipayResponse finishFreeze(AlipayFinishFreezeRequest alipayFinishFreezeRequest) {
|
||||||
|
AlipayResponse response = new AlipayResponse();
|
||||||
|
try {
|
||||||
|
// 构造请求参数以调用接口
|
||||||
|
AlipayFundAuthOrderUnfreezeRequest request = new AlipayFundAuthOrderUnfreezeRequest();
|
||||||
|
AlipayFundAuthOrderUnfreezeModel model = new AlipayFundAuthOrderUnfreezeModel();
|
||||||
|
|
||||||
|
// 设置支付宝资金授权订单号
|
||||||
|
model.setAuthNo(alipayFinishFreezeRequest.getAuthNo());
|
||||||
|
|
||||||
|
// 设置解冻请求流水号
|
||||||
|
model.setOutRequestNo(alipayFinishFreezeRequest.getOutRequestNo());
|
||||||
|
|
||||||
|
// 设置本次操作解冻的金额
|
||||||
|
model.setAmount(alipayFinishFreezeRequest.getAmount());
|
||||||
|
|
||||||
|
// 设置商户对本次解冻操作的附言描述
|
||||||
|
model.setRemark("还车解冻押金");
|
||||||
|
request.setBizModel(model);
|
||||||
|
// 第三方代调用模式下请设置app_auth_token
|
||||||
|
// request.putOtherTextParam("app_auth_token", "<-- 请填写应用授权令牌 -->");
|
||||||
|
log.info("完结免押冻结请求 : {}",request);
|
||||||
|
AlipayFundAuthOrderUnfreezeResponse unFreezeResponse = alipaySdkUtil.execute(request);
|
||||||
|
log.info("完结免押冻结响应 : {}",unFreezeResponse.getBody());
|
||||||
|
|
||||||
|
if (unFreezeResponse.isSuccess()) {
|
||||||
|
response.setSuccess(true);
|
||||||
|
response.setCode("SUCCESS");
|
||||||
|
response.setMessage("完结免押冻结成功");
|
||||||
|
} else {
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("完结免押冻结失败: " + unFreezeResponse.getMsg() + ":" + unFreezeResponse.getSubMsg());
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("支付宝完结免押冻结异常,公司ID: {}, 订单号: {}", alipayFinishFreezeRequest.getCompanyId(), alipayFinishFreezeRequest.getOutRequestNo(), e);
|
||||||
|
response.setSuccess(false);
|
||||||
|
response.setCode("FAIL");
|
||||||
|
response.setMessage("支付宝完结免押冻结失败异常: " + e.getMessage());
|
||||||
|
}
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean verifyNotifySign(Long companyId, Map<String, String> params) {
|
public boolean verifyNotifySign(Long companyId, Map<String, String> params) {
|
||||||
try {
|
try {
|
||||||
@ -332,6 +554,9 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
}else if (OrderStatus.equals("RERENT_WAIT_PAY")){
|
}else if (OrderStatus.equals("RERENT_WAIT_PAY")){
|
||||||
OrderSub orderSub = orderPayMapper.getSubOrderByTradeNo(outTradeNo);
|
OrderSub orderSub = orderPayMapper.getSubOrderByTradeNo(outTradeNo);
|
||||||
orderPayMapper.updateOrderStatusAndEndRentTime(orderMain.getOrderNo(),orderSub.getReturnTime(),0,orderMain.getOrderAmount().add(orderSub.getAmount()),"RENT_ING");
|
orderPayMapper.updateOrderStatusAndEndRentTime(orderMain.getOrderNo(),orderSub.getReturnTime(),0,orderMain.getOrderAmount().add(orderSub.getAmount()),"RENT_ING");
|
||||||
|
//发送租电订单同步
|
||||||
|
Long batterySubOrderId = orderPayMapper.getSubOrderIdByTradeNo(outTradeNo);
|
||||||
|
syncInteg.sendSubOrderId(batterySubOrderId);
|
||||||
}
|
}
|
||||||
orderPayMapper.updateSubOrderPaymentStatus(outTradeNo,"ZFB_PAY", PayStatus.SUCCESS.getCode(),tradeNo);
|
orderPayMapper.updateSubOrderPaymentStatus(outTradeNo,"ZFB_PAY", PayStatus.SUCCESS.getCode(),tradeNo);
|
||||||
return true;
|
return true;
|
||||||
@ -395,7 +620,7 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
refundStatus,
|
refundStatus,
|
||||||
statusDesc,
|
statusDesc,
|
||||||
outRequestNo,
|
outRequestNo,
|
||||||
"SUCCESS".equals(refundStatus) ? new Date() : null, // 退款成功时间
|
"REFUND_SUCCESS".equals(refundStatus) ? new Date() : null, // 退款成功时间
|
||||||
new Date() // 更新时间
|
new Date() // 更新时间
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -403,15 +628,27 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
log.info("支付宝退款记录状态已更新,退款单号: {}, 支付宝退款单号: {}, 状态: {}", outRequestNo, outRequestNo, refundStatus);
|
log.info("支付宝退款记录状态已更新,退款单号: {}, 支付宝退款单号: {}, 状态: {}", outRequestNo, outRequestNo, refundStatus);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
log.warn("未找到对应的微信退款记录,退款单号: {}", outRequestNo);
|
log.warn("未找到对应的支付宝退款记录,退款单号: {}", outRequestNo);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("处理微信退款通知异常,退款单号: {}", notifyMap.get("out_request_no"), e);
|
log.error("处理支付宝退款通知异常,退款单号: {}", notifyMap.get("out_request_no"), e);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean processFreezeNotify(String outOrderNo, String authNo) {
|
||||||
|
try {
|
||||||
|
log.info("处理支付宝免押支付成功通知, 更新状态,订单号: {}, 授权号: {}", outOrderNo, authNo);
|
||||||
|
int result = orderPayMapper.updateFreezeSubOrderPaymentStatus(outOrderNo, authNo);
|
||||||
|
return result>0;
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理支付宝免押支付成功通知异常,订单号: {}", outOrderNo, e);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录支付信息到数据库
|
* 记录支付信息到数据库
|
||||||
*/
|
*/
|
||||||
@ -443,8 +680,12 @@ public class AlipayServiceImpl implements AlipayService {
|
|||||||
private void recordRefundInfo(AlipayRefundRequest request) {
|
private void recordRefundInfo(AlipayRefundRequest request) {
|
||||||
try {
|
try {
|
||||||
PaymentRecord paymentRecord = paymentRecordMapper.getPaymentRecordByOutTradeNo(request.getOutTradeNo());
|
PaymentRecord paymentRecord = paymentRecordMapper.getPaymentRecordByOutTradeNo(request.getOutTradeNo());
|
||||||
|
RefundRecord refundRecord = refundRecordMapper.getRefundRecordByOutRefundNo(request.getOutRequestNo());
|
||||||
RefundRecord refundRecord = new RefundRecord();
|
if (refundRecord != null) {
|
||||||
|
log.warn("已存在对应的退款记录,退款单号: {}", request.getOutRequestNo());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
refundRecord = new RefundRecord();
|
||||||
refundRecord.setCompanyId(request.getCompanyId());
|
refundRecord.setCompanyId(request.getCompanyId());
|
||||||
refundRecord.setOutTradeNo(request.getOutTradeNo());
|
refundRecord.setOutTradeNo(request.getOutTradeNo());
|
||||||
refundRecord.setOutRefundNo(request.getOutRequestNo());
|
refundRecord.setOutRefundNo(request.getOutRequestNo());
|
||||||
|
|||||||
16
src/main/java/com/sczx/pay/thirdpart/facade/SyncFacade.java
Normal file
16
src/main/java/com/sczx/pay/thirdpart/facade/SyncFacade.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package com.sczx.pay.thirdpart.facade;
|
||||||
|
|
||||||
|
|
||||||
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@FeignClient(name = "sczx-sync", url = "${sczx-sync.ribbon.listOfServers:}")
|
||||||
|
public interface SyncFacade {
|
||||||
|
|
||||||
|
@GetMapping("/send/subOrder/{subOrderId}")
|
||||||
|
Map<String, String> sendSubOrderId(@PathVariable Long subOrderId);
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,34 @@
|
|||||||
|
package com.sczx.pay.thirdpart.integration;
|
||||||
|
|
||||||
|
|
||||||
|
import com.sczx.pay.exception.InnerException;
|
||||||
|
import com.sczx.pay.thirdpart.facade.SyncFacade;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Component
|
||||||
|
public class SyncInteg {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private SyncFacade syncFacade;
|
||||||
|
|
||||||
|
public Map<String, String> sendSubOrderId(Long subOrderId){
|
||||||
|
try{
|
||||||
|
Map<String, String> result = syncFacade.sendSubOrderId(subOrderId);
|
||||||
|
if(result.get("code") == "200"){
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
} catch (Exception e){
|
||||||
|
log.error("发送租电订单同步失败",e);
|
||||||
|
throw new InnerException("发送租电订单同步失败");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@ -68,6 +68,10 @@ public class AlipaySdkUtil {
|
|||||||
return alipayClient.certificateExecute(request);
|
return alipayClient.certificateExecute(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T extends AlipayResponse> T sdkExecute(AlipayRequest<T> request) throws AlipayApiException {
|
||||||
|
return alipayClient.sdkExecute(request);
|
||||||
|
}
|
||||||
|
|
||||||
private AlipayConfig getAlipayConfig() {
|
private AlipayConfig getAlipayConfig() {
|
||||||
AlipayConfig alipayConfig = new AlipayConfig();
|
AlipayConfig alipayConfig = new AlipayConfig();
|
||||||
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
|
alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do");
|
||||||
|
|||||||
57
src/main/java/com/sczx/pay/utils/ThreadPoolUtils.java
Normal file
57
src/main/java/com/sczx/pay/utils/ThreadPoolUtils.java
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
package com.sczx.pay.utils;
|
||||||
|
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.util.concurrent.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 线程池工具类,用于执行异步任务
|
||||||
|
* Created by zengji on 2019/5/13.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@Service
|
||||||
|
public class ThreadPoolUtils {
|
||||||
|
|
||||||
|
public static ThreadPoolExecutor threadPool;
|
||||||
|
//核心线程大小
|
||||||
|
private static int corePoolSize=120;
|
||||||
|
//最大线程个数
|
||||||
|
private static int maximumPoolSize=180;
|
||||||
|
//空闲线程存活时间
|
||||||
|
private static long keepAliveTime=300;
|
||||||
|
//队列容量
|
||||||
|
private static int capacity=200;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 无返回值
|
||||||
|
*/
|
||||||
|
public static void execute(Runnable runnable){
|
||||||
|
getThreadPool().execute(runnable);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 有返回值
|
||||||
|
*/
|
||||||
|
public static <T> Future<T> submit(Callable<T> callable){
|
||||||
|
return getThreadPool().submit(callable);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* dcs获取线程池
|
||||||
|
* @return 线程池对象
|
||||||
|
*/
|
||||||
|
public static ThreadPoolExecutor getThreadPool() {
|
||||||
|
if (threadPool != null) {
|
||||||
|
return threadPool;
|
||||||
|
} else {
|
||||||
|
synchronized (ThreadPoolUtils.class) {
|
||||||
|
if (threadPool == null) {
|
||||||
|
threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS,
|
||||||
|
new LinkedBlockingQueue<>(capacity), new ThreadPoolExecutor.CallerRunsPolicy());
|
||||||
|
}
|
||||||
|
return threadPool;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user