收藏
回答

在使用微信退款查单接口时,一调用查单接口就没反应

我在使用微信退款查单接口时,一执行到: $resp = $instance->v3->refund->domestic->refunds->outRefundNo($out_refund_no)
                    ->getAsync()
                    ->wait();

上面这句就没反应,也不报错。查了一些资料,说是超时,我把超时设定为5秒10秒30秒测试也一样,还是什么反应都没有。

在这句之前,微信支付客户端初始化是成功的,微信支付实例构建也是成功的。从数据库查询出来未支付成功的退款单号$out_refund_no

后,执行就失败。请问哪位大仙知道原因

回答关注问题邀请回答
收藏

3 个回答

  • 智能回答 智能回答 本次回答由AI生成
    2025-09-20
    有用 1
    回复
  • Memory (私信不回复)
    Memory (私信不回复)
    2025-09-21

    https://wechatpay.im/openapi/v3/pay/transactions/out-trade-no/%7Bout_trade_no%7D

    2025-09-21
    有用
    回复 3
    • 单车歌谣
      单车歌谣
      2025-09-22
      根据您提供的链接,我把同步调用,异步调用都试过了,结果都是一样的,一调用查单接口就卡住。我是直接商户,用不到子商户号;
      问题的关键是,卡住后不提示任何报错信息,不知道从何处下手查错。请指教。
      2025-09-22
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      2025-09-22回复单车歌谣
      没看懂你的卡主是个什么概念?没有报错?
      2025-09-22
      回复
    • Memory (私信不回复)
      Memory (私信不回复)
      2025-09-22回复单车歌谣
      $instance->v3->refund->domestic->refunds->outRefundNo($out_refund_no) 这个写错了,按照给你的文档 cv 啊
      2025-09-22
      回复
  • 单车歌谣
    单车歌谣
    2025-09-20
    <?php
    // refund_query.php
    define('IN_TG', true);
    require_once __DIR__ . '/vendor/autoload.php';
    require_once __DIR__.'/includes/common.inc.php';
    date_default_timezone_set('Asia/Shanghai');
    
    
    use WeChatPay\Builder;
    use WeChatPay\Util\PemUtil;
    use WeChatPay\Formatter;
    use WeChatPay\Crypto\AesGcm;
    use GuzzleHttp\Exception\RequestException;
    $logFile = __DIR__ . '/app.log';//创建日志文件
    // 记录日志的函数
    function writeLog($message, $level = 'INFO') {
        global $logFile;
        $timestamp = date('Y-m-d H:i:s');
        $logMessage = "[$timestamp] [$level] $message" . PHP_EOL;
        file_put_contents($logFile, $logMessage, FILE_APPEND | LOCK_EX);
    };
    // 设置脚本执行时间无限制
    set_time_limit(0);//查错
    writeLog("应用程序启动");//查错
    
    
    // 配置参数(与回调程序保持一致)
    $config = [
        'mchid' => '1712204237',
        'secret' => 'e6c87239f6b27f57a53bfea7017769a1',
        'merchant_cert_path' => 'file:///www/wwwroot/chtuan/wechat/cert/apiclient_cert.pem',
        'merchant_key_path' => 'file:///www/wwwroot/chtuan/wechat/cert/apiclient_key.pem',
        'platform_cert_path' => 'file:///www/wwwroot/chtuan/wechat/cert/wechatpay_52614F2D3487ED2ED89C39738FC214E8771AE633.pem',
    ];
    
    
    try {
        // 1. 获取需要查询的退款订单(RF_status != 2 的订单)
        writeLog("开始查询需要处理的退款订单");  //查错
        $query = _query("SELECT RF_orderCode, RF_paySubOrder FROM xxdj_refund WHERE RF_status != 2");
        if (!$query) {//查错
            writeLog("数据库查询失败: " . mysql_error(), "ERROR");
            exit;
        }
        $refund_orders = [];
        while ($row = _fetch_array($query)) {
            $refund_orders[] = $row;
        }
           writeLog("找到 " . count($refund_orders) . " 个需要处理的退款订单");//查错
    
    
        // 初始化微信支付客户端
        writeLog("开始初始化微信支付客户端");//查错
    
    
        writeLog("检查证书文件路径: " . $config['merchant_key_path']);
        $key_path = str_replace('file://', '', $config['merchant_key_path']);
        if (!file_exists($key_path)) {
            writeLog("私钥文件不存在: " . $key_path, "ERROR");
            exit;
        }
        writeLog("私钥文件存在");
    
    
        writeLog("检查证书文件路径: " . $config['merchant_cert_path']);
        $cert_path = str_replace('file://', '', $config['merchant_cert_path']);
        if (!file_exists($cert_path)) {
            writeLog("证书文件不存在: " . $cert_path, "ERROR");
            exit;
        }
        writeLog("商户证书文件存在");
    
    
         writeLog("检查平台证书文件路径: " . $config['platform_cert_path']);
        $platform_cert_path = str_replace('file://', '', $config['platform_cert_path']);
        if (!file_exists($platform_cert_path)) {
            writeLog("平台证书文件不存在: " . $platform_cert_path, "ERROR");
            exit;
        }
        writeLog("平台证书文件存在");
    
    
        // 尝试加载私钥
        writeLog("尝试加载私钥");
        try{
             $merchantPrivateKey = PemUtil::loadPrivateKey($config['merchant_key_path']);
            if (!$merchantPrivateKey) {//查错
                writeLog("加载商户私钥失败", "ERROR");
                exit;
            }
            writeLog("加载商户私钥成功");
        } catch (Exception $e) {
            writeLog("加载私钥异常: " . $e->getMessage(), "ERROR");
            exit;
        }    
    
    
        // 尝试加载商户证书
        writeLog("尝试加载商户证书");
        try {
            $merchantCertificate = PemUtil::loadCertificate($config['merchant_cert_path']);
            if (!$merchantCertificate) {//查错
                writeLog("加载商户证书失败", "ERROR");
                exit;
            }
            writeLog("加载商户证书成功");
            
            // 获取商户证书序列号
            $merchantCertInfo = openssl_x509_parse($merchantCertificate);
            $merchantSerialNo = $merchantCertInfo['serialNumberHex'] ?? '';
            writeLog("商户证书序列号: " . $merchantSerialNo);
            
            if (empty($merchantSerialNo)) {//查错
                writeLog("获取商户证书序列号失败", "ERROR");
                exit;
            }
        } catch (Exception $e) {
            writeLog("加载商户证书异常: " . $e->getMessage(), "ERROR");
            exit;
        }
           
         // 尝试加载平台证书
        writeLog("尝试加载平台证书");
        try {
            $platformCertificate = PemUtil::loadCertificate($config['platform_cert_path']);
            if (!$platformCertificate) {
                writeLog("加载平台证书失败", "ERROR");
                exit;
            }
            writeLog("平台证书加载成功");
            
            // 获取平台证书序列号
            $platformCertInfo = openssl_x509_parse($platformCertificate);
            $platformSerialNo = $platformCertInfo['serialNumberHex'] ?? '';
            writeLog("平台证书序列号: " . $platformSerialNo);
            if (empty($platformSerialNo)) {
                writeLog("获取平台证书序列号失败", "ERROR");
                exit;
            }
        } catch (Exception $e) {
            writeLog("加载平台证书异常: " . $e->getMessage(), "ERROR");
            exit;
        }
        // 构建证书数组,以序列号为键
        $certs = [
            $platformSerialNo => $platformCertificate,
        ];
         writeLog("构建微信支付实例");
        try {
             $instance = Builder::factory([
                'mchid' => $config['mchid'],
                'serial' => $merchantSerialNo,
                'privateKey' => $merchantPrivateKey,
                'certs' =>  $certs,
            ]);
            
            writeLog("微信支付实例构建成功");
        } catch (Exception $e) {
             writeLog("构建微信支付实例异常: " . $e->getMessage(), "ERROR");
            writeLog("异常追踪: " . $e->getTraceAsString(), "ERROR");
            exit;
        }
       
        writeLog("微信支付客户端初始化成功");//查错
        // 2. 遍历每个订单,查询微信端状态
        foreach ($refund_orders as $order) {
            $out_refund_no = $order['RF_orderCode'];
             writeLog("处理退款单号: " . $out_refund_no);//查错
             
            try {
               
                // 调用微信支付查询退款接口
                writeLog("调用微信退款查询接口: " . $out_refund_no);//查
    
    
                // 记录调用开始时间
                $startTime = microtime(true);
               // 先尝试一个简单的API调用,验证连接是否正常
                try{ 
                     // 使用SDK调用退款查询接口
                     writeLog("使用SDK调用退款查询API"); 
                    // 设置超时时间为30秒
                     $resp = $instance->v3->refund->domestic->refunds->outRefundNo($out_refund_no)
                        ->getAsync()
                        ->wait();
                    
                    // 记录调用结束时间
                    $endTime = microtime(true);
                    $duration = round($endTime - $startTime, 3);
                    writeLog("微信退款查询接口调用完成,耗时: " . $duration . "秒");
                    // 检查响应状态
                    writeLog("响应状态码: " . $resp->getStatusCode());
                    $result = json_decode($resp->getBody(), true);
                    writeLog("微信退款查询返回: " . json_encode($result, JSON_UNESCAPED_UNICODE));
                } catch (Exception $e) {
                    // 记录调用结束时间(即使失败)
                    $endTime = microtime(true);
                    $duration = round($endTime - $startTime, 3);
                    writeLog("SDK调用失败,耗时: " . $duration . "秒,错误信息: " . $e->getMessage(), "ERROR");
                }
                // 检查是否有返回结果
                if (!isset($result)) {
                    writeLog("未获取到有效的查询结果", "ERROR");
                    continue;
                }            
            } catch (Exception $e) {
                writeLog("处理退款单异常: " . $e->getMessage() . ", 订单号: " . $out_refund_no, "ERROR");
                continue; // 继续处理下一个订单
            }
        }
        writeLog("所有退款订单处理完成");
      
        
    } catch (Exception $e) {
        writeLog("程序执行异常: " . $e->getMessage(), "ERROR");
    }
    ?>
    
    2025-09-20
    有用
    回复
登录 后发表内容