• 支付宝回调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
    备注:默认通知不返回,可申请修改(条件需开通高级即时到帐功能,且非常需要退款的同步)。出现该情况在开通高级即时到帐时的人工操作退款时、买家没付款系统自动或卖家手动关闭了该笔交易

     
  • 相关阅读:
    iOS layoutSubviews 什么时候会被调用
    view
    NSDictionaryOfVariableBindings
    获取相册中得图片
    相机
    给定文字测量它的大小
    git
    单例的创建
    物理引擎简介——Cocos2d-x学习历程(十三)
    场景切换特效Transition——Cocos2d-x学习历程(十二)
  • 原文地址:https://www.cnblogs.com/kenshinobiy/p/8888050.html
Copyright © 2020-2023  润新知