微信登录网页授权与APP授权
微信JSAPI支付
微信APP支付
微信APP和JSAPI退款
支付宝手机网站支付
支付宝APP支付
支付宝退款
以上我都放到个人公众号,搜一搜:JAVA大贼船,文末有公众号二维码!觉得个人以后开发会用到的可以关注一下哦!少走点弯路…
传送门
支付宝退款相对比较简单,废话就不哆嗦了,直接看代码实现
application.yml
# 支付宝相关
ALIPAY:
# 应用ID
APP_ID:
# 应用私钥
APP_PRIVATE_KEY:
#应用公钥
APP_PUBLIC_KEY:
# 支付宝公钥
ALIPAY_PUBLIC_KEY:
# 统一签名算法
SIGN_TYPE: RSA2
# 统一字符
CHARSET: utf-8
# 返回数据格式
FORMAT: json
# 支付基础API
SERVER_URL: https://openapi.alipay.com/gateway.do
#支付宝支付回调地址
ALIPAY_NOTIFY_URL:
# 支付宝收银台会自动跳转回商户return_url指定的页面。
RETURN_URL:
# 支付宝Api版本
API_VERSION: 1.0
# 产品码
PROD_CODE:
# 终端信息
TERMINAL_INFO:
# 终端信息类型
TERMINAL_TYPE:
YmlParament
//支付宝相关
@Value("${ALIPAY.APP_ID}")
private String appId;
@Value("${ALIPAY.APP_PRIVATE_KEY}")
private String appPrivatekey;
@Value("${ALIPAY.APP_PUBLIC_KEY}")
private String appPublickey;
@Value("${ALIPAY.ALIPAY_PUBLIC_KEY}")
private String alipayPublickey;
@Value("${ALIPAY.SIGN_TYPE}")
private String signType;
@Value("${ALIPAY.CHARSET}")
private String charset;
@Value("${ALIPAY.FORMAT}")
private String format;
@Value("${ALIPAY.SERVER_URL}")
private String serverUrl;
@Value("${ALIPAY.ALIPAY_NOTIFY_URL}")
private String alipayNotifyUrl;
@Value("${ALIPAY.RETURN_URL}")
private String returnUrl;
@Value("${ALIPAY.API_VERSION}")
private String apiVersion;
@Value("${ALIPAY.PROD_CODE}")
private String prodCode;
@Value("${ALIPAY.TERMINAL_INFO}")
private String terminalInfo;
@Value("${ALIPAY.TERMINAL_TYPE}")
private String terminalType;
AlipayConfig
@Autowired
private YmlParament ymlParament;
/**
* 设置支付宝客户端
* @return
*/
@Bean
public AlipayClient setAlipayClient() {
return new DefaultAlipayClient(
ymlParament.getServerUrl(),
ymlParament.getAppId(),
ymlParament.getAppPrivatekey(),
ymlParament.getFormat(),
ymlParament.getCharset(),
//这里不要搞错,这里是应用公钥而不是支付宝公钥
ymlParament.getAppPublickey(),
ymlParament.getSignType()
);
}
/**
* 退款请求公共参数
* 具体执行操作参考:ZfbPay.tradeRefund
* 参考官方链接:https://opendocs.alipay.com/apis/api_1/alipay.trade.refund
*/
@Bean
public AlipayTradeRefundRequest setAlipayTradeRefundRequest() {
AlipayTradeRefundRequest atrr=new AlipayTradeRefundRequest();
atrr.setApiVersion(ymlParament.getApiVersion());
atrr.setProdCode(ymlParament.getProdCode());
atrr.setTerminalInfo(ymlParament.getTerminalInfo());
atrr.setTerminalType(ymlParament.getTerminalType());
return atrr;
}
ZfbPay
/**
*
* @param ac
* @param request
* @param outTradeNo 订单号
* @param refundAmount 需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数
* @param outRequestNo 标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传。
* @param refundReason 退款的原因说明
* @return
* @throws AlipayApiException
*/
public static AlipayTradeRefundResponse tradeRefund(AlipayClient ac, AlipayTradeRefundRequest request,String outTradeNo,String refundAmount, String outRequestNo,String refundReason) throws Exception {
AlipayTradeRefundModel mode = new AlipayTradeRefundModel();
mode.setOutTradeNo(outTradeNo);
mode.setRefundAmount(refundAmount);
mode.setOutRequestNo(outRequestNo);
mode.setRefundReason(refundReason);
request.setBizModel(mode);
return ac.execute(request);
}
服务层(业务逻辑略)
@Autowired
private AlipayClient alipayClient;
@Autowired
private AlipayTradeRefundRequest alipayTradeRefundRequest;
@Transactional
@Override
public void alipayRefund(AlipayClient ac, AlipayTradeRefundRequest request, String outTradeNo, String refundAmount, String refundNo) throws Exception {
AlipayTradeRefundResponse alipayTradeRefundResponse = ZfbPay.tradeRefund(alipayClient, alipayTradeRefundRequest, outTradeNo, refundAmount, refundNo, "我要退款");
if (!alipayTradeRefundResponse.isSuccess()){
throw new RuntimeException(alipayTradeRefundResponse.getMsg());
}
//业务逻辑
}
支付宝的退款回调通知是默认回调到支付时候的回调地址,若你在支付回调的时候做了一些业务,退款回调的时候又执行了这些业务逻辑,这样大问题就来啦!那如何区分哪个是退款的异步通知呢,别慌,请往下看!
1、支付成功和部分退款成功的交易状态都是TRADE_SUCCESS,但是部分退款的异步通知参数中一定会返回out_biz_no(商户业务号)、refund_fee(总退款金额)、gmt_refund(交易退款时间)参数,支付成功不会返回。
2、未付款交易超时关闭和支付完成后全额退款的交易状态都是TRADE_CLOSED,但是全额退款导致交易关闭的的异步通知参数中一定会返回gmt_payment(交易付款时间)、gmt_refund(交易退款时间)参数,未付款交易超时关闭导致的交易关闭不会返回。