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