Java订单接入支付宝二 支付回调

敲重点
首先理解为什么需要支付回调顾名思义:当我们的系统向支付宝发起了订单支付的请求之后,就需要支付宝告诉我们的系统支付结果,所以就需要回调了。
来看看官方的解释吧:

对于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";
        }       
    }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值