支付宝退款

This commit is contained in:
wuchunlei
2023-12-12 14:05:50 +08:00
parent 047065b828
commit 9423e99e20
5 changed files with 50 additions and 25 deletions

View File

@@ -24,13 +24,13 @@ public class AliPayConfig {
* 应用公钥
*/
public static final String HS_ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmvqCFRgQCqflYxyHhPyBVBVon51FkGAT8H31hAufhCiW6hAv8HFUn2Tyl6TwAd09HOlessQjjMYLlGRHXkTOVvd1n9I5La7YrrN+F6O/b4Jy17I9k7QDdZLvUKeXm1VcPlj3aSJdZzhTcAqImkj5sFzrFSE+THHMVL5hlAzVIPHWFaA/Vh2Ltdzt9HOL5vo2Bgru5b4kanI5xBaKCfzkaHC6iWxxWk81jBoogGJ1FEky9QSOb4QzSQ4ZtwecFGe/4+PRFkGGW1dH15Qq2UXq3zy6wIF2EfeT/utivV4fHnc04U6z15i1z/f406s9tdfIo10qBfBIH4VQ9jSwkg4ndwIDAQAB";
public static final String HS_ALI_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmvqCFRgQCqflYxyHhPyBVBVon51FkGAT8H31hAufhCiW6hAv8HFUn2Tyl6TwAd09HOlessQjjMYLlGRHXkTOVvd1n9I5La7YrrN+F6O/b4Jy17I9k7QDdZLvUKeXm1VcPlj3aSJdZzhTcAqImkj5sFzrFSE+THHMVL5hlAzVIPHWFaA/Vh2Ltdzt9HOL5vo2Bgru5b4kanI5xBaKCfzkaHC6iWxxWk81jBoogGJ1FEky9QSOb4QzSQ4ZtwecFGe/4+PRFkGGW1dH15Qq2UXq3zy6wIF2EfeT/utivV4fHnc04U6z15i1z/f406s9tdfIo10qBfBIH4VQ9jSwkg4ndwIDAQAB";
/**
* 支付宝公钥
*/
public static final String HS_ALI_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiVLUVTnNuq+2C1FRtcIRcG3rCgtVVulkz2QljKbPr7NNWTJJIIfGwyhNuH76s5D1lvNmn2NkuoqM0cMJCSd+W+JW9KpdQ0dgumFHCoRA/OWUoqpLvEOmm2hRMaWpvd+OQq2aPz+p+z6pqZ9SAlgUIolzrUn4idCvgIycqRaGsf1sEJFR5W+rneqtMhNYHdwemqaqnysInwshHR3cHs1AC6y/eL6pcQhaYJ5qVMIRg54/6Lr4CU114Rmph7UM9C28ulmHkFMN/DKPUDbM1+glxjzmqHQChY293Db0dlwZeiDWF3Tli2BVd6pz5KEkQlUsGeLW1O0rT9T9sxzsavxArwIDAQAB";
public static final String HS_ALIPAY_PUBLIC_KEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiVLUVTnNuq+2C1FRtcIRcG3rCgtVVulkz2QljKbPr7NNWTJJIIfGwyhNuH76s5D1lvNmn2NkuoqM0cMJCSd+W+JW9KpdQ0dgumFHCoRA/OWUoqpLvEOmm2hRMaWpvd+OQq2aPz+p+z6pqZ9SAlgUIolzrUn4idCvgIycqRaGsf1sEJFR5W+rneqtMhNYHdwemqaqnysInwshHR3cHs1AC6y/eL6pcQhaYJ5qVMIRg54/6Lr4CU114Rmph7UM9C28ulmHkFMN/DKPUDbM1+glxjzmqHQChY293Db0dlwZeiDWF3Tli2BVd6pz5KEkQlUsGeLW1O0rT9T9sxzsavxArwIDAQAB";
/**
* 回调地址 因为是内网开发 目前为内网穿透地址

View File

@@ -3,28 +3,19 @@ package com.peanut.modules.pay.alipay.config;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.domain.AlipayTradeAppPayModel;
import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeRefundModel;
import com.alipay.api.request.AlipayTradeAppPayRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeAppPayResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.alipay.api.domain.*;
import com.alipay.api.request.*;
import com.alipay.api.response.*;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.peanut.modules.pay.alipay.config.AliPayConfig;
import com.peanut.modules.pay.alipay.dto.AlipayDTO;
import com.peanut.modules.pay.alipay.dto.ReFundDTO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
@Component
@@ -98,7 +89,7 @@ public class AliPayUtil {
* @param reFundDTO
* @return Map<String,Object>
*/
public AlipayTradeRefundResponse aliPayRefund(ReFundDTO reFundDTO) {
public Map<String, Object> aliPayRefund(ReFundDTO reFundDTO) {
log.info(">>>>>>>>>支付宝退款 订单号 = {}", reFundDTO.getOutTrandeNo());
Map map = new HashMap();
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
@@ -107,22 +98,22 @@ public class AliPayUtil {
model.setRefundAmount(String.valueOf(reFundDTO.getRefundAmount()));
// 支付宝交易号
model.setTradeNo(reFundDTO.getTradeNo());
// 订单支付时传入的商户订单号
model.setOutTradeNo(reFundDTO.getOutTrandeNo());
if (StringUtils.isNotBlank(reFundDTO.getRefundReason())) {
// 退款原因
model.setRefundReason(reFundDTO.getRefundReason());
}
model.setOutRequestNo(UUID.randomUUID().toString().substring(0, 6));
request.setBizModel(model);
AlipayTradeRefundResponse response = null;
try {
response = AliPayConfig.getAliPayClient().execute(request);
return response;
map.put("msg", response.getBody());
} catch (Exception e) {
log.info(">>>>>>>>>>退款出现异常 exception = {}", e);
e.printStackTrace();
}
return response;
return map;
}
/**

View File

@@ -3,18 +3,17 @@ package com.peanut.modules.pay.alipay.controller;
import com.alibaba.fastjson.JSONObject;
import com.peanut.common.utils.R;
import com.peanut.modules.pay.alipay.dto.AlipayDTO;
import com.peanut.modules.pay.alipay.dto.ReFundDTO;
import com.peanut.modules.pay.alipay.service.AliPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
/**
* 支付宝支付控制层
*/
@@ -47,4 +46,14 @@ public class AliPayController {
return R.ok().put("aliNotify",aliNotify);
}
/**
* 支付宝退款
*/
@RequestMapping("/refund")
public R refund(@RequestBody ReFundDTO reFundDTO) {
String refund = aliPayService.refund(reFundDTO);
return R.ok().put("msg",refund);
}
}

View File

@@ -3,6 +3,7 @@ package com.peanut.modules.pay.alipay.service;
import com.peanut.modules.pay.alipay.dto.AlipayDTO;
import com.peanut.modules.pay.alipay.dto.ReFundDTO;
import javax.servlet.http.HttpServletRequest;
@@ -23,6 +24,12 @@ public interface AliPayService {
*/
String aliNotify(HttpServletRequest request);
/**
* 支付宝退款
* @param reFundDTO
* @return
*/
String refund(ReFundDTO reFundDTO);
}

View File

@@ -16,12 +16,12 @@ import com.peanut.modules.book.service.*;
import com.peanut.modules.pay.alipay.config.AliPayConfig;
import com.peanut.modules.pay.alipay.config.AliPayUtil;
import com.peanut.modules.pay.alipay.dto.AlipayDTO;
import com.peanut.modules.pay.alipay.dto.ReFundDTO;
import com.peanut.modules.pay.alipay.service.AliPayService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.*;
@@ -109,7 +109,7 @@ public class AliPayServiceImpl implements AliPayService {
log.info(">>>>>>>>>>支付宝回调 sign = {}, trade_status = {}, out_trade_no = {}, 参数 = {}", params.get("sign"),
params.get("trade_status"), params.get("out_trade_no"), params.toString());
//调用SDK验证签名验证是阿里回调而不是其他恶意回调
boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.HS_ALI_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
boolean flag = AlipaySignature.rsaCheckV1(params, AliPayConfig.HS_ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
log.info(">>>>>>>>>>验签结果 flag = {}", flag);
if (flag) {
log.info(">>>>>>>>>>验签通过");
@@ -247,6 +247,24 @@ public class AliPayServiceImpl implements AliPayService {
}
}
@Override
public String refund(ReFundDTO reFundDTO) {
log.info(">>>>>>>>>>App请求支付宝退款接口");
Map<String, Object> map = aliPayUtil.aliPayRefund(reFundDTO);
Object obj = map.get("msg");
String resJson = obj.toString();
log.info(">>>>>>>>>>>支付宝返回的信息是 resJson = {}", resJson);
Map<String,Object> res = JSONObject.parseObject(resJson);
//10000表示接口请求成功Y表示资金变动成功
if ("10000".equals(((Map)res.get("alipay_trade_refund_response")).get("code"))&&
"Y".equals(((Map)res.get("alipay_trade_refund_response")).get("fund_change"))){
log.info(">>>>>>>>>>>支付宝退款成功!<<<<<<<<<<<<<");
//表操作
}
return resJson;
}
//TODO 更新订单状态