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

