我在App用支付宝支付后,写了一个回调。跟支付宝技术客服,确认路径是对的。就是他们那里显示的是一个500。
那么,我用了下postMan测试,给写定了值,直接写死的值 可以跑通,但是,在服务器上就不行了。我不知道这是路径有问题吗?还是说设置的得到的值还有什么问题。一直没有弄通呀。。 或者是公钥的问题。回调的公钥我就是用的支付的。
下面是代码 回调的
/**
* @Function: App支付成功 支付宝异步通知回调
*/
@ApiOperation(value = "支付宝异步通知回调")
@ResponseBody
@PostMapping("/notify")
public void asyncNotification(HttpServletRequest request) {
//获取支付宝POST过来反馈信息
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);
}
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
//boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type)
boolean signVerified = false;//初始化,必须要有一个值,不然为null,然后,下面if (signVerified) {}就会空指针报错
try {
signVerified = AlipaySignature.rsaCheckV1(params, aliPayProjectInit.publicKey, "utf-8", "RSA2");
} catch (AlipayApiException e) {
e.printStackTrace();
}
//返回状态存入redis中
// 对验签进行处理
/* 实际验证过程建议商户务必添加以下校验:
1、需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
PrintWriter out = null;//PrintWriter 直接在网页显示字符
if (signVerified) {//验证成功
String out_trade_no = null; //商户订单号
String trade_no = null; //支付宝交易号
String trade_status = null; //交易状态
try {
//商户订单号(我们自己生成的,由支付宝校验,支付成功后,返回给我们的)
out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8");
//支付宝交易号
trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
//交易状态
trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
// 支付金额
String totalAmount = request.getParameter("total_amount");
// 支付时间
String payDate = request.getParameter("gmt_payment");
GOrder gOrder = new GOrder();
gOrder.setOutTradeNo(out_trade_no); //商户订单号
gOrder.setTotalAmount(totalAmount); // 支付金额
gOrder.setTradeNo(trade_no); //支付宝交易号
gOrder.setGmtPayment(payDate); // 支付时间
gOrder.setPayStatus(1); //支付状态
gOrder.setTradeStatus(trade_status);
GOrder gOrderOrg = payService.selectGOrder(out_trade_no);
//在支付后,如果outTradeNo对得上号 就去更新状态
if ("".equals(gOrderOrg) || gOrderOrg != null) {
payService.updateGOrder(gOrder);
}
payService.updateGOrder(gOrder);//去更新
if (trade_status.equals("TRADE_FINISHED")) {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
} else if (trade_status.equals("TRADE_SUCCESS")) {
//判断该笔订单是否在商户网站中已经做过处理
//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
//如果有做过处理,不执行商户的业务程序
//注意:
//付款完成后,支付宝系统发送该交易状态通知
}
out.println("success");
} else {//验证失败
out.println("fail");
}
}