支付宝支付 - 异步通知与同步通知

    科技2025-04-05  14

    /** * @Description: 支付成功后的支付宝异步通知 */ @RequestMapping(value="/alipay") public String alipay(HttpServletRequest request, HttpServletResponse response) throws Exception { log.info("支付成功后的支付宝异步通知"); //获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<String,String>(); Map<String,String[]> requestParams = request.getParameterMap(); for (Iterator<String> 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); } boolean signVerified = AlipaySignature.rsaCheckV1(params, aliPayResource.getAlipayPublicKey(), aliPayResource.getCharset(), aliPayResource.getSignType()); //调用SDK验证签名 if(signVerified) {//验证成功 // 商户订单号 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); // 支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); // 交易状态 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8"); // 付款金额 String total_amount = new String(request.getParameter("total_amount").getBytes("ISO-8859-1"),"UTF-8"); if (trade_status.equals("TRADE_SUCCESS")){ String merchantReturnUrl = paymentOrderService.updateOrderPaid(out_trade_no, CurrencyUtils.getYuan2Fen(total_amount)); notifyFoodieShop(out_trade_no, merchantReturnUrl); } log.info("************* 支付成功(支付宝异步通知) - 时间: {} *************", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN)); log.info("* 订单号: {}", out_trade_no); log.info("* 支付宝交易号: {}", trade_no); log.info("* 实付金额: {}", total_amount); log.info("* 交易状态: {}", trade_status); log.info("*****************************************************************************"); return "success"; }else { //验证失败 log.info("验签失败, 时间: {}", DateUtil.getCurrentDateString(DateUtil.DATETIME_PATTERN)); return "fail"; } } # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 #alipay.notifyUrl=http://2r49yp.natappfree.cc/payment/notice/alipay alipay.notifyUrl=http://payment.t.xuexi.com/payment/payment/notice/alipay # 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 alipay.returnUrl=http://payment.t.xuexi.com/payment/alipayResult #alipay.returnUrl=http://shop.t.xuexi.com/payment @Transactional(propagation=Propagation.REQUIRED) @Override public String updateOrderPaid(String merchantOrderId, Integer paidAmount) { Example example = new Example(Orders.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("merchantOrderId", merchantOrderId); Orders paidOrder = new Orders(); paidOrder.setPayStatus(PaymentStatus.PAID.type); paidOrder.setAmount(paidAmount); int result = ordersMapper.updateByExampleSelective(paidOrder, example); return queryMerchantReturnUrl(merchantOrderId); } <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>支付结果</title> </head> <body> 支付结果 <script> window.onload=function(){ window.close(); } </script> </body> </html>

     

    Processed: 0.013, SQL: 8