实在是不知道是我代码写的不对还是支付宝本身就有的坑,整合的时候碰到的问题简直就是俄罗斯套娃;
1.这个回调地址存放的值应该是放在params里的,不知道是因为什么原因我一直取的为空,,,,,
这个是请求的参数(按理来说应该可以拿到的);
2.这个传输协议的Content-Type原来正常应该都是穿的json格式的数据,但是支付宝的不太一样,他是这个(application/x-www-form-urlencoded; text/html; charset=utf-8),所以传的值是text文本的,不是json。。。。
3.使用支付宝验签的时候,使用的是支付宝公钥,不是应用公钥。。。。
4.请求的参数要使用URLDecoder来转译。。。不然会验签失败
就这么些个错误愣是改了两天,才找出来的,慢慢解决掉的,不知道有没有人跟我一样悲催的
@RequestMapping(value = "/alipay/callback")
@ApiOperation(value = "支付宝回调地址", notes = "支付宝支付回调")
public String paymentAlipayCallback(HttpServletRequest request) {
logger.error("1.开始执行回调方法:");
try {
//获取body里的信息使用二进制获取
BufferedReader br = null;
StringBuilder sb = new StringBuilder("");
try {
br = request.getReader();
String str;
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != br) {
try {
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Map<String, String> params = new HashMap<>();
String toJSONString = sb.toString();
//将url转map
String[] param = toJSONString.split("&");
for (String s : param) {
String[] p = s.split("=");
if (p.length == 2) {
String decode = URLDecoder.decode(p[1], "UTF-8");
params.put(p[0],decode);
}
}
boolean checkV1 = AlipaySignature.rsaCheckV1(params, PMaliPublicKey, CHARSET, SIGN_TYPE);
if (!checkV1) {
logger.error("验签异常 -> AlipaySignature error");
return "failure";
}
String appId = params.get("app_id"); // 支付宝appid
if (!pMaliAppId.equals(appId)) {
logger.error("appid错误 -> app_id error. request: {}, response: {} ", pMaliAppId, appId);
return "failure";
}
// 交易状态 TRADE_CLOSED交易关闭 TRADE_FINISHED交易完结 TRADE_SUCCESS支付成功 WAIT_BUYER_PAY交易创建
String tradeStatus = params.get("trade_status");
if (NOTIFY_TRADE_STATUS_SUCCESS.equals(tradeStatus) || NOTIFY_TRADE_STATUS_FINISHED.equals(tradeStatus)) {
MealOrders mealOrders = mealOrdersService.getByParamNo(params.get("out_trade_no"));// 订单号
// 订单号
if (mealOrders == null) {
logger.error("支付宝回调编号错误找不到相应的编号 -> out_trade_no error. out_trade_no: {} ", params.get("out_trade_no"));
return "failure";
}
//支付金额
if (mealOrders.getPaymentPrice().compareTo(new BigDecimal(params.get("total_amount"))) != 0) {
logger.error("支付宝支付金额与应付金额不等 -> total_amount error. total_amount: {} ", params.get("total_amount"));
return "failure";
}
// 付款回调,处理后续付款逻辑
mealOrdersService.paySuccess(mealOrders);
return "success";
}
return "failure";
} catch (Exception ex) {
ex.printStackTrace();
logger.error("支付宝支付状态异常:{}", ex);
return "failure";
}
}
参考链接:
https://www.cnblogs.com/panxuejun/p/6550131.html(decode转译)
https://blog.csdn.net/mengxianhua/article/details/9961843(url转map)
https://blog.csdn.net/chai1230/article/details/105674244(获取post方法里的body信息)