支付宝支付回调

1.支付宝回调地址设置在上一篇博客已经记录

地址:https://blog.csdn.net/qq_38669394/article/details/106671410

2.支付宝回调方法,最主要两点,一个是如何接受参数,另一个是验签 ,这里需要将支付宝回调的参数转为map

  @RequestMapping(value = "/alyPayNotify")
    public String alyPayNotify(HttpServletRequest request, HttpServletResponse response) throws IOException, JDOMException {
    		log.info("支付宝支付成功回调");
            //这里拿到支付宝通知数据
    		 Map<String, Object> params = convertRequestParamsToMap(request); // 将异步通知中收到的待验证所有参数都存放到map中
    	        String paramsJson = JSON.toJSONString(params);
    	        log.info("支付宝回调,{}"+ paramsJson);
    	        Map<String, String> map = JSON.parseObject(paramsJson, new TypeReference<Map<String, String>>(){});
    	     return  aliPayService.aliPayNotify(map, response);
    
 }

	 // 将request中的参数转换成Map
    private static Map<String, Object> convertRequestParamsToMap(HttpServletRequest request) {
    	Map<String,Object> returnMap = new HashMap<String,Object>();
        Map<String,String[]> map = new HashMap<String,String[]>();
        map = request.getParameterMap();
        Iterator entries = map.entrySet().iterator();
        Map.Entry entry;
        String name ="";
        String value=null;
        while (entries.hasNext()){
            entry=(Map.Entry)entries.next();
            name = (String) entry.getKey();
            Object objvalue = entry.getValue();
            if(objvalue == null){
                value = null;
            }else if(objvalue instanceof String[]){
                /**条件如果成立,objvalue就是一个数组,需要将它转换成为字符串,并拼接上逗号,并吧末尾的逗号去掉*/
                String[] values = (String[]) objvalue;
                for(int i=0;i<values.length;i++){
                    value = values[i]+",";//这里我拼接的是英文的逗号。
                }
                value = value.substring(0,value.length()-1);//截掉最后一个逗号。
            }else{
                value = objvalue.toString();
            }
            log.info("key:"+name);
            log.info("value:"+value);
            returnMap.put(name , value);
        }
        Iterator it = returnMap.keySet().iterator();
        while (it.hasNext()){
            Object key = it.next();
            if(returnMap.get(key) == null || "".equals (((String)returnMap.get(key)).trim())){
                returnMap.put((String) key, null);
            }
        }
        return returnMap; 

    }

3,支付宝回调验签,这里需要选择输出流的形式返回success ,return 方式支付宝好像不接受,不知道是不是因为版本原因,代码我就不一一修改了。这里签名验证方式与网上的有些方法也略有区别,参数不同。具体可参考我的另一篇支付宝博客

地址:https://blog.csdn.net/qq_38669394/article/details/106336900

    @Override
    public String aliPayNotify(Map<String, String> map, HttpServletResponse response) {
        // 调用SDK验证签名
        try {
            String sign = (String) map.get("sign");
            String content = AlipaySignature.getSignCheckContentV1(map);
            boolean signVerified = AlipaySignature.rsaCheck(content, sign, Configs.getAlipayPublicKey(), AliPayProperties.CHARSET, AliPayProperties.SIGNTYPE);

            if (signVerified) {
                log.info("支付宝回调签名认证成功");
                // 按照支付结果异步通知中的描述,对支付结果中的业务内容进行1\2\3\4二次校验,校验成功后在response中返回success,校验失败返回failure
                //检查金额是否一致
                //this.check(params);
                // 支付宝建议 另起线程处理业务
                Executors.newFixedThreadPool(20).execute(new Runnable() {
                    @Override
                    public void run() {
                        log.info("ZFB回调参数" + map);
                        String trade_status = map.get("trade_status");
                        log.info("trade_status:" + trade_status);
                        // 支付成功
                        if (trade_status.equals("TRADE_SUCCESS")) {
                            // 处理支付成功逻辑
                            try {
                                // 处理业务逻辑。。。
                                String out_trade_no = map.get("out_trade_no");
                                String trade_no = map.get("trade_no");
                                String total_amount = map.get("total_amount");
                           
                            } catch (Exception e) {
                                log.error("支付宝回调业务处理报错,params:" + e);
                            }
                        } else {
                            log.error("没有处理支付宝回调业务,支付宝交易状态:{},params:{}", trade_status);
                        }
                    }
                });
                BufferedOutputStream out = null;
                try {
                    out = new BufferedOutputStream(response.getOutputStream());
                    out.write("success".getBytes());
                    out.flush();
                    out.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return "success";

            } else {
                log.info("支付宝回调签名认证失败,signVerified=false, paramsJson:{}");
                return "failure";
            }

        } catch (AlipayApiException e) {

            log.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", e.getMessage());
            return "failure";
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值