前期准备工作
1. 之前的支付宝APP支付的博客
- 1.1 前期获取的参数
- 1.2 配置及依赖
https://blog.csdn.net/liang1184750950/article/details/100205437
实战
1.1 请求参数及返回值
- 1.1.1 请求参数
@Data
@AllArgsConstructor
@NoArgsConstructor
public class AliPayRefundCommand {
//TODO 金额改为分
private String refundFee;//退款金额,不得大于订单金额 单位 元
private String outTradeNo;//商户订单号,订单支付记录里面获取payRecord
}
- 1.1.2 返回值
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class AliPayTradeRefundResponseDto {
private String buyerLogonId;//用户登录id
private String buyerUserId;//买家在支付宝的用户id
private String fundChange;//本次退款是否发生了资金变化 Y 变化
private Date gmtRefundPay;//退款支付时间
private String openId;
private String outTradeNo;
private List<TradeFundBillDto> TradeFundBillDtos;
private String refundFee;
private String sendBackFee;
private String storeName;
private String tradeNo;
}
1.2 代码
public AliPayTradeRefundResponseDto refund(AliPayRefundCommand command) {
AlipayTradeRefundRequest refundRequest = AliPayRequestBuilder.generateAliPayRefundRequest(command);
AlipayTradeRefundResponse refundResponse = null;
try {
refundResponse = alipayClient.execute(refundRequest);
} catch (AlipayApiException e) {
e.printStackTrace();
}
return new AliPayTradeRefundResponseDto(refundResponse);
}
public static AlipayTradeRefundRequest generateAliPayRefundRequest(AliPayRefundCommand command) {
AlipayTradeRefundRequest refundRequest = new AlipayTradeRefundRequest();
AlipayTradeRefundModel model = new AlipayTradeRefundModel();
model.setRefundAmount(command.getRefundFee());
model.setOutTradeNo(command.getOutTradeNo());
model.setRefundReason("退款");
refundRequest.setBizModel(model);
return refundRequest;
}
public AliPayTradeRefundResponseDto(AlipayTradeRefundResponse refundResponse) {
this.setBuyerLogonId(refundResponse.getBuyerLogonId());
this.setBuyerUserId(refundResponse.getBuyerUserId());
this.setFundChange(refundResponse.getFundChange());
this.setGmtRefundPay(refundResponse.getGmtRefundPay());
this.setOpenId(refundResponse.getOpenId());
this.setOutTradeNo(refundResponse.getOutTradeNo());
this.setRefundFee(refundResponse.getRefundFee());
this.setSendBackFee(refundResponse.getSendBackFee());
this.setStoreName(refundResponse.getStoreName());
this.setTradeNo(refundResponse.getTradeNo());
this.setTradeFundBillDtos(refundResponse.getRefundDetailItemList() == null ? null :TradeFundBillDto.build(refundResponse));
}
总结
支付宝退款功能开发相对简单明了(支付宝一贯风格),构造退款请求参数AlipayTradeRefundRequest时,注意公共参数直接在AlipayTradeRefundRequest里面set,其他的参数封装在AlipayTradeRefundModel里面,这和支付宝APP支付一样。