支付寶回調JAVA版代碼


支付寶回調:

 

 1     //這個是支付寶回調的信息
 2     @RequestMapping("alipay_callback.do")
 3     @ResponseBody
 4     public Object alipayCallback(HttpServletRequest request){
 5         Map<String,String> params = Maps.newHashMap();
 6         //getParameterMap()一般多用於接收前台表單多參數傳輸的數據
 7         //支付寶的回調都是把信息放到request里面
 8         Map requestParams = request.getParameterMap();
 9         //keyset()是獲取所有的key值,iterator()是迭代遍歷
10         for(Iterator iter = requestParams.keySet().iterator();iter.hasNext();){
11             String name = (String)iter.next();
12             //這里把key放到數組里面
13             String[] values = (String[]) requestParams.get(name);
14             String valueStr = "";
15             //這個for循環的尊用就是把上面那個String中的值都遍歷一遍
16             for(int i = 0 ; i <values.length;i++){
17                 //這個是三元運算符
18                 valueStr = (i == values.length -1)?valueStr + values[i]:valueStr + values[i]+",";
19             }
20             //把數據全部加進map集合中   name就是key  valueStr就是value
21             params.put(name,valueStr);
22         }
23         //sign就是簽名    trade_status是交易的狀態
24         logger.info("支付寶回調,sign:{},trade_status:{},參數:{}",params.get("sign"),params.get("trade_status"),params.toString());
25 
26         //非常重要,驗證回調的正確性,是不是支付寶發的.並且呢還要避免重復通知.
27         //這個非常重要,但是不知道這個是什么意思
       //這個是簽名類型 sign參數已經幫我們刪除掉了,在這里我們要把簽名類型刪除掉 28 params.remove("sign_type"); 29 try { 30 //這里是RSA驗證簽名 31 // Configs.getAlipayPublicKey() 其實就是支付寶的應用公鑰(記住不是支付寶的公鑰,是支付寶應用公鑰) 32 //Configs.getSignType()也就是支付寶文本類型里面的簽名類型:RSA2 33 boolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(),"utf-8",Configs.getSignType()); 34 //如果驗證上面的boolean為true的話,我們就應該更改下訂單的狀態,減少下庫存這些操作 35 if(!alipayRSACheckedV2){ 36 return ServerResponse.createByErrorMessage("非法請求,驗證不通過,再惡意請求我就報警找網警了"); 37 } 38 } catch (AlipayApiException e) { 39 logger.error("支付寶驗證回調異常",e); 40 }
復制代碼

 

//回調之后修改賬單狀態
        ServerResponse serverResponse = iOrderService.aliCallback(params);
        if(serverResponse.isSuccess()){
            return Const.AlipayCallback.RESPONSE_SUCCESS;
        }
        return Const.AlipayCallback.RESPONSE_FAILED;
    }

支付寶回調之后修改賬單的狀態

//這個是回調地址之后更新一些訂單狀態的方法

    public ServerResponse aliCallback(Map<String,String> params){
        //訂單號
       Long orderNo = Long.parseLong(params.get("out_trade_no"));
        //支付寶的交易號
        String tradeNo = params.get("trade_no");
        //支付寶的交易狀態
        String tradeStatus = params.get("trade_status");
        //在這個方法里面查詢一下,看一下這個訂單號碼是否存在
        Order order = orderMapper.selectByOrderNo(orderNo);
        if(order == null){
            return ServerResponse.createByErrorMessage("非快樂慕商城的訂單,回調忽略");
        }
        //在這里調用枚舉類,判斷訂單是否已經支付
        if(order.getStatus() >= Const.OrderStatusEnum.PAID.getCode()){
            return ServerResponse.createBySuccess("支付寶重復調用");
        }
        //這里調用的是支付寶官方的枚舉
        //“TRADE_STATUS_TRADE_SUCCESS”是交易完成的意思
        if(Const.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)){
            //記錄交易的時間,這個字符串是固定的
            order.setPaymentTime(DateTimeUtil.strToDate(params.get("gmt_payment")));
            order.setStatus(Const.OrderStatusEnum.PAID.getCode());
            orderMapper.updateByPrimaryKeySelective(order);
            //把訂單狀態改成已付款
        }

        PayInfo payInfo = new PayInfo();
        payInfo.setUserId(order.getUserId());
        payInfo.setOrderNo(order.getOrderNo());
        payInfo.setPayPlatform(Const.PayPlatformEnum.ALIPAY.getCode());
        payInfo.setPlatformNumber(tradeNo);
        payInfo.setPlatformStatus(tradeStatus);

        payInfoMapper.insert(payInfo);

        return ServerResponse.createBySuccess();
    }

支付寶通知返回時的交易狀態列表

即時到帳接口——交易狀態列表

 

交易狀態操作:支付寶有交易記錄,沒付款
交易狀態(trade_status):WAIT_BUYER_PAY 
備注:通知不會返回,不能申請修改。


交易狀態操作:交易完成
交易狀態(trade_status):TRADE_FINISHED
備注:交易結束,不可退款


交易狀態操作:交易完成
交易狀態(trade_status):TRADE_SUCCESS
備注:高級即時到帳狀態下


交易狀態操作:交易關閉
交易狀態(trade_status):TRADE_CLOSED
備注:默認通知不返回,可申請修改(條件需開通高級即時到帳功能,且非常需要退款的同步)。出現該情況在開通高級即時到帳時的人工操作退款時、買家沒付款系統自動或賣家手動關閉了該筆交易

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM