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; }
處理訂單狀態點我查看
如果你感覺本文對你有幫助,歡迎進群一起探討交流:點我加群