微信支付多次执行回调——php

因为微信在后台通知交互时,如果微信收到商户的应答不符合规范或超时,微信会判定本次通知失败,重新发送通知,直到成功为止(在通知一直不成功的情况下,微信总共会发起10次通知,每次通知时间距离最近一次的间隔为15/15/30/180/1800/1800/1800/1800/3600,单位:秒),但微信不保证通知最终一定能成功。

我是参考了这篇文章https://www.cnblogs.com/zmdComeOn/archive/2019/07/25/11244656.html后才发现需要返回的。

之前直接用的是微信支付php版本的demo,因为业务需要改了一下代码,最后在测试的时候发现回调中数据总是会被多次写入数据库,后来发现是我没有给微信return支付成功的信息

public function NotifyProcess($objData, $config, &$msg)
    {
        $data = $objData->GetValues();
        //TODO 1、进行参数校验
        if(!array_key_exists("return_code", $data) 
            ||(array_key_exists("return_code", $data) && $data['return_code'] != "SUCCESS")) {
            //TODO失败,不是支付成功的通知
            //如果有需要可以做失败时候的一些清理处理,并且做一些监控
            $msg = "异常异常";
            return false;
        }
        if(!array_key_exists("transaction_id", $data)){
            $msg = "输入参数不正确";
            return false;
        }

        //TODO 2、进行签名验证
        try {
            $checkResult = $objData->CheckSign($config);
            if($checkResult == false){
                //签名错误
                Log::ERROR("签名错误...");
                return false;
            }
        } catch(Exception $e) {
            Log::ERROR(json_encode($e));
        }

        //TODO 3、处理业务逻辑
        Log::DEBUG("call back:" . json_encode($data));

        // 释放结果集
        mysqli_free_result($result);
        //查询订单,判断订单真实性
        if(!$this->Queryorder($data["transaction_id"])){
            $msg = "订单查询失败";
            return false;
        }
        return true;
    }

最后的return true不能少。

这是这次我遇上的问题,类似的问题应该也是可以看看上面的链接

posted @ 2020-03-19 17:28  zhangPooo  阅读(2980)  评论(0编辑  收藏  举报