Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Call to undefined method think\\exception\\ErrorException::getResponse() #8

Closed
yinmaosong123 opened this issue Jun 28, 2021 · 17 comments

Comments

@yinmaosong123
Copy link

->then(function($response) {
// 正常逻辑回调处理
echo $response->getBody()->getContents();
return $response;
})
->otherwise(function($exception) {
// 异常错误处理
$body = $exception->getResponse()->getBody();
echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
})

每次都进入otherwise

提示Call to undefined method think\exception\ErrorException::getResponse()

@TheNorthMemory
Copy link
Collaborator

$exception 直接打印出来看看,是个啥?

@yinmaosong123
Copy link
Author

yinmaosong123 commented Jun 28, 2021 via email

@yinmaosong123
Copy link
Author

yinmaosong123 commented Jun 28, 2021 via email

@yinmaosong123
Copy link
Author

yinmaosong123 commented Jun 28, 2021 via email

@TheNorthMemory
Copy link
Collaborator

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

@yinmaosong123
Copy link
Author

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的Call to undefined method think\exception\ErrorException::getResponse()判断,是tp抛的异常打入到otherwise函数里了,这里是逻辑判断,例如:

如果($例外的instanceof \想到\异常\ ErrorException){ //不一定对,不熟悉TP
  回波 $例外- > getTraceAsString(),PHP_EOL ;

} else  if ( $ exception instanceof\ Psr \ Http \ Message \ ResponseInterface ){
   $ body = $ exception- > getResponse ()-> getBody ();
  echo  $ body -> getContents ();
// echo $exception->getTraceAsString(), PHP_EOL; 
}

谢谢

@yinmaosong123
Copy link
Author

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

@TheNorthMemory
Copy link
Collaborator

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

@yinmaosong123
Copy link
Author

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

@TheNorthMemory
Copy link
Collaborator

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

@yinmaosong123
Copy link
Author

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem

我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

@TheNorthMemory
Copy link
Collaborator

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem

我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

你用错了,需要先获取平台证书及序列号,然后放到 'certs' => ['YYY' => PemUtil::load] 结构内,你现在的用法是验签逻辑失败所致,能退款但是验签失败异常

@yinmaosong123
Copy link
Author

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem
我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

你用错了,需要先获取平台证书及序列号,然后放到 'certs' => ['YYY' => PemUtil::load] 结构内,你现在的用法是验签逻辑失败所致,能退款但是验签失败异常

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem
我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

你用错了,需要先获取平台证书及序列号,然后放到 'certs' => ['YYY' => PemUtil::load] 结构内,你现在的用法是验签逻辑失败所致,能退款但是验签失败异常

'certs' => [
// 可由内置的平台证书下载器 ./bin/CertificateDownloader.php 生成
'YYYYYYYYYY' => PemUtil::loadCertificate('/path/to/wechatpay/cert.pem')
],

我直接copy的例子中的 这样不对吗

@TheNorthMemory
Copy link
Collaborator

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem
我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

你用错了,需要先获取平台证书及序列号,然后放到 'certs' => ['YYY' => PemUtil::load] 结构内,你现在的用法是验签逻辑失败所致,能退款但是验签失败异常

要给请求的URI,otherwise逻辑是异常处理逻辑,从你给的 Call to undefined method think\exception\ErrorException::getResponse() 判断,是tp抛的异常打入到 otherwise函数里了,这里要做逻辑判断,例如:

if ($exception instanceof \Think\Exception\ ErrorException) {//不一定对,不熟悉TP
  echo $exception->getTraceAsString(), PHP_EOL;

} else if ($exception instanceof \Psr\Http\Message\ResponseInterface) {
  $body = $exception->getResponse()->getBody();
  echo $body->getContents();
// echo $exception->getTraceAsString(), PHP_EOL;
}

加上这个判断是不报Call to undefined method think\exception\ErrorException::getResponse()这个错误了 但是退款成功还是进otherwise

贴一下你的初始化 Builder::factory 代码,以及你调用的接口代码

public function fenZhangTuiKuan(Request $request)
{
$data = $request->get();

    if(!isset($data['order_no']) || !$data['order_no']){
        return json(['code'=>0,'msg'=>'缺少请求参数order_no']);
    }
    // 工厂方法构造一个实例
    $instance = Builder::factory([
        // 商户号
        'mchid' => '1610390753',
        // 商户证书序列号
        'serial' => 'xxxxxx',//339
        // 商户API私钥 PEM格式的文本字符串或者文件resource
        'privateKey' => PemUtil::loadPrivateKey('./xxxxx/xxx.pem'),
        'certs' => [
            'YYYYYYYYYY' => PemUtil::loadCertificate('./xxxx/xx.pem')
        ],
    ]);

    $res = $instance->chain('v3/refund/domestic/refunds')
        ->postAsync([
            'json' => [
                'sub_mchid'=>'xxxx',
                'out_refund_no' => date('YmdHis').mt_rand(1000,9999),
                'out_trade_no' => $data['order_no'],
                'amount' => [
                    'refund' => 0.01 * 100,
                    'total' => 0.01 * 100,
                    'currency' => 'CNY',
                ],
            ],
        ])
        ->then(function($response) {
            echo 1;
            // 正常逻辑回调处理
            echo $response->getBody()->getContents();
            var_dump($response);
            return $response;
        })
        ->otherwise(function($exception) {
            echo 2;
            if ($exception instanceof \think\exception\ErrorException) {
                //tp的
                echo $exception->getMessage(), PHP_EOL;

            } else if ($exception) {
                $body = $exception->getResponse()->getBody();
                echo $body->getContents();
                // echo $exception->getTraceAsString(), PHP_EOL;
            }
        })
        ->wait();
}

你给的xxxxxxYYYYYYYYYY是不是一样的? xxxxxx是商户序列号,YYYYYYYYYY是平台序列号,不能填一样

你好 非常感谢您这么耐心的解答问题
xxxxx的部分是商户证书序列号
YYYYY的部分是放的apiclient_cert.pem
我能退款成功 我想拿到退款成功的标识 但是现在退款成功报错

你用错了,需要先获取平台证书及序列号,然后放到 'certs' => ['YYY' => PemUtil::load] 结构内,你现在的用法是验签逻辑失败所致,能退款但是验签失败异常

'certs' => [
// 可由内置的平台证书下载器 ./bin/CertificateDownloader.php 生成
'YYYYYYYYYY' => PemUtil::loadCertificate('/path/to/wechatpay/cert.pem')
],

我直接copy的例子中的 这样不对吗

// 可由内置的平台证书下载器 ./bin/CertificateDownloader.php 生成 注意这行备注,配置项俩YYYYYYYYYY/path/to/wechatpay/cert.pem参数,是从CLI 上来的

@TheNorthMemory
Copy link
Collaborator

建议升级至 v1.0.3, 初始化Builder::factory([]) 如果没给对平台证书及序列号 结构,将无法正确工作,避免在错误用法上越走越远。

@yinmaosong123
Copy link
Author

建议升级至 v1.0.3, 初始化Builder::factory([]) 如果没给对平台证书及序列号 结构,将无法正确工作,避免在错误用法上越走越远。

你好 我使用./bin/CertificateDownloader.php的文件 给到YYYYYYYYYY 还是报错 是不是还需要设置什么

@TheNorthMemory
Copy link
Collaborator

TheNorthMemory commented Jul 1, 2021

YYYYYYYYYY

配置文件改成 certs => ['YYYYYYYYYY' => PemUtil::loadCertificate('下载的wechatpay_YYYYYYYYYY.pem')]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants