支付宝Java SDK是做的不错,但是坑也不少,支付流程网上资料多,做起来也很容易,但是到了退款就麻烦了,网上资料一下就少了不少,遇到问题就非常麻烦了,奈何坑还不少。
主要有两个坑:
1、AlipayClient调用的方法和支付的方法不一样,支付使用sdkExecute,而退款和查询订单状态使用execute方法!!最大的坑在于使用sdkExecute非但不报错,AlipayResponse中的isSuccess()方法返回的还是true,连response.getData()还有值,我还以为成功了,一直没怀疑是方法调用错误的问题。
2、退款回调接口不是能够自定义的!!设置request中设置notifyUrl无效!!它用的是支付接口的回调,奈何我支付接口回调根本没有判断退款也会走这个回调,然后就被狠狠得坑了一把。判断条件是request.getParameterMap中refund_fee是否为null,如果为null,说明是支付的回调,如果不是null,说明是退款的回调。注意了,回调接口必须公网能够访问才行!!
解决了以上这两个坑,那么退款问题基本就解决了。
然后就是代码环节了:
请求退款接口:
AlipayClient alipayClient = new DefaultAlipayClient(GatewayUrl, AppId, PrivateKey, Format, Charset, PublicKey, SignType);
AlipayTradeRefundRequest alipayTradeRefundRequest = new AlipayTradeRefundRequest();
AlipayTradeRefundModel alipayTradeRefundModel = new AlipayTradeRefundModel();
alipayTradeRefundModel.setOutTradeNo(trade.getOutTradeNo());
alipayTradeRefundModel.setRefundAmount(trade.getTotalAmount());
alipayTradeRefundModel.setRefundReason(trade.getBody());
alipayTradeRefundRequest.setBizModel(alipayTradeRefundModel);
try {
AlipayTradeRefundResponse response = alipayClient.execute(alipayTradeRefundRequest);
return response;
} catch (AlipayApiException e) {
e.printStackTrace();
return null;
}
其中的值默认为:
GatewayUrl:https://openapi.alipay.com/gateway.do
Format:JSON
Charset:utf-8
SignType:RSA2
回调接口:
@ApiIgnore
@RequestMapping("/notify")
@AnonymousAccess
@ApiOperation("支付异步通知(要公网访问),接收异步通知")
public String notify(HttpServletRequest request) {
Map<String, String[]> parameterMap = request.getParameterMap();
String refundFee = request.getParameter("refund_fee");
if (refundFee != null) {
// 退款回调流程
}else{
// 支付回调流程
}
}
还有一个坑,蚂蚁技术支持的在线聊天内容第二天重新登录打开后就没有了,害得我好多当时的聊天资料都没有了,本来都能放文章里给大家参考的,现在都拿不出来了,问了客服,他们也说不行,那就没办法咯~~