敲重点
首先理解为什么需要支付回调顾名思义:当我们的系统向支付宝发起了订单支付的请求之后,就需要支付宝告诉我们的系统支付结果,所以就需要回调了。
来看看官方的解释吧:
对于App支付产生的交易,支付宝会根据原始支付 API 中传入的异步通知地址 notify_url,通过 POST 请求的形式将支付结果作为参数通知到商户系统。
notify_url: 这个参数就是我们在上一篇文章中说到的支付回调地址的参数(也就是我们系统里面的一个接口地址),我们需要在提交支付的时候就把这个地址告诉支付宝,这样才能在支付完成的同时将结果反馈到我们系统中
异步通知的参数:……
参数太多了,我就不一一罗列了,要不自己自行查看一下吧**……**点击这样查看
上接口:
@RequestMapping(value = "/callback", method = RequestMethod.POST)
@ResponseBody
public String callback(HttpServletRequest request, HttpServletResponse response) {
// 1.下面这段代码至验签的地方,代码是通用的,可以直接用
Map<String, String> params = new HashMap<String, String>();
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
//2. 获取自己所需的参数
String trade_no = request.getParameter("trade_no"); //支付宝交易号
String out_trade_no = request.getParameter("out_trade_no"); //商户订单号
String orderType = request.getParameter("body"); //订单内容
String tradeStatus = request.getParameter("trade_status"); //交易状态
//3. 对支付宝返回的数据验证,确定是支付宝返回的能和自己系统的数据对应起来
b oolean flag = false;
//调用SDK验证签名- 参数记得修改和自己的对应起来(切记alipaypublickey是支付宝的公钥,去open.alipay.com对应应用下查看)
try {
flag = AlipaySignature.rsaCheckV1( params, alipaypublicKey , charset , "RSA2" );
}catch (AlipayApiException e) {
e.printStackTrace();
}
//4.对验签结果进行处理
if (flag) { //验签通过
if (tradeStatus.equals("TRADE_SUCCESS")) {
try {
//在这里处理支付成功的订单: 修改交易表状态,支付成功
} catch (SysException e) {
logger.error("支付失败,错误信息:" + e.getInfo());
return "fail";
}
return "success";
} else {
return "fail";
}
} else { //验签不通过
System.err.println("验签失败");
return "fail";
}
}