解决方案 »

  1.   

    具体一点,notify_url.jsp里面是什么加密验证处理?  你自己的方法里是指你自己系统的jsp页面?如果你自己的jsp页面ajax去访问支付宝的页面,那估计是不行的,跨域了把具体的代码贴出来看看
      

  2.   

    加密也就是普通的md5加密,我自己的方法就是发支付宝demo的代码粘贴过去而已,没有什么变动,执行内容都是一样,只不过换种执行方式而已。
    这个是退款请求的生成,他会跳到支付宝自己的退款页面,
    public static void reFund(PrintWriter out, String refund_date, String batch_no, String detail_data) {
            String notify_url = "http://127.0.0.1:8080/order/notify_url";
            String seller_email = "[email protected]";
            String batch_num = "1";
            //把请求参数打包成数组
            Map<String, String> sParaTemp = new HashMap<>();
            sParaTemp.put("service", "refund_fastpay_by_platform_pwd");
            sParaTemp.put("partner", AlipayConfig.partner);
            sParaTemp.put("_input_charset", AlipayConfig.input_charset);
            sParaTemp.put("notify_url", notify_url);
            sParaTemp.put("seller_email", seller_email);
            sParaTemp.put("refund_date", refund_date);
            sParaTemp.put("batch_no", batch_no);
            sParaTemp.put("batch_num", batch_num);
            sParaTemp.put("detail_data", detail_data);
            //建立请求
            String sHtmlText = RefundSubmit.buildRequest(sParaTemp, "get", "确认");
            out.println(sHtmlText);
        }完了以后,本应该会返回notify_url的,代码如下: public static String notify_url(HttpServletRequest request) {
            //即时到账退款返回
            String result = "";
            Map<String, String> params = new HashMap<>();
            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] + ",";
                }
                try {
                    //乱码解决
                    valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                }
                params.put(name, valueStr);
            }
            //获取支付宝的通知返回参数
            String batch_no = "";
            String success_num = "";
            String result_details = "";
            try {
                batch_no = new String(request.getParameter("batch_no").getBytes("ISO-8859-1"), "UTF-8");
                success_num = new String(request.getParameter("success_num").getBytes("ISO-8859-1"), "UTF-8");
                result_details = new String(request.getParameter("result_details").getBytes("UTF-8"), "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            if (AlipayNotify.verify(params)) {//验证成功
                result = "success";
            } else {//验证失败
                result = "fail";
            }
            return result;
        },但是没有做任何返回验证,直接就退款了,管理员操作完退款后页面如下:,到此,钱已经退回去了,但是没有进入notify_url方法。
      

  3.   

    补充一下,跳转方法的时候是Spring mvc,具体方法如下:
    @RequestMapping(value = "notify_url", method = RequestMethod.GET)
        public void notify_url(HttpServletRequest request) {
            String result = AlipayHandle.notify_url(request);
            if ("success".equals(result)) {
                System.out.println("================111111111111111================");
            }
        }在支付流程的时候就能正常返回验证,但是退款就不行,不知道怎么滴,大神求解决