的支付沙箱配置完成后报Missing Alipay Config -- [app_public_cert_path]或者Factory\HttpFoundationFactory’ Not Found的解决方案
由于自己用的环境不是教程约定的Homestead环境,安装扩展包时提示部分包不支持安装2.10.2版本,所以直接安装了最新3.2版本
以下是本人出现的问题以及解决方法
1、Missing Alipay Config – [app_public_cert_path]
由于版本问题,在3.2的最新版本需要引入证书路径
由于版本问题,在3.2的最新版本需要引入证书路径
由于版本问题,在3.2的最新版本需要引入证书路径
解决方法:在Config下创建Pay文件夹,将证书放入文件夹后,修改配置文件
‘app_public_cert_path’ => ‘/Pay/appPublicCert.crt’
其他的证书也是这样修改,仅供参考,每个项目有自己的规划,按自己的需求修改路径
3.2版本配置如下
<?php
declare(strict_types=1);
use Yansongda\Pay\Pay;
return[
'alipay' => [
'default' => [
// 必填-支付宝分配的 app_id
'app_id' => '2021000121682913',
// 必填-应用私钥 字符串或路径
'app_secret_cert' => '',
// 必填-应用公钥证书 路径
'app_public_cert_path' => '/appPublicCert.crt',
// 必填-支付宝公钥证书 路径
'alipay_public_cert_path' => '/alipayPublicCert.crt',
// 必填-支付宝根证书 路径
'alipay_root_cert_path' => '/alipayRootCert.crt',
'return_url' => 'https://yansongda.cn/alipay/return',
'notify_url' => 'https://yansongda.cn/alipay/notify',
// 选填-第三方应用授权token
'app_auth_token' => '',
// 选填-服务商模式下的服务商 id,当 mode 为 Pay::MODE_SERVICE 时使用该参数
'service_provider_id' => '',
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
]
],
'wechat' => [
'default' => [
// 必填-商户号,服务商模式下为服务商商户号
'mch_id' => '',
// 必填-商户秘钥
'mch_secret_key' => '',
// 必填-商户私钥 字符串或路径
'mch_secret_cert' => '',
// 必填-商户公钥证书路径
'mch_public_cert_path' => '',
// 必填
'notify_url' => '',
// 选填-公众号 的 app_id
'mp_app_id' => '',
// 选填-小程序 的 app_id
'mini_app_id' => '',
// 选填-app 的 app_id
'app_id' => '',
// 选填-合单 app_id
'combine_app_id' => '',
// 选填-合单商户号
'combine_mch_id' => '',
// 选填-服务商模式下,子公众号 的 app_id
'sub_mp_app_id' => '',
// 选填-服务商模式下,子 app 的 app_id
'sub_app_id' => '',
// 选填-服务商模式下,子小程序 的 app_id
'sub_mini_app_id' => '',
// 选填-服务商模式下,子商户id
'sub_mch_id' => '',
// 选填-微信公钥证书路径, optional,强烈建议 php-fpm 模式下配置此参数
'wechat_public_cert_path' => [
'45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
],
// 选填-默认为正常模式。可选为: MODE_NORMAL, MODE_SERVICE
'mode' => Pay::MODE_NORMAL,
],
],
'unipay' => [
'default' => [
// 必填-商户号
'mch_id' => '',
// 必填-商户公私钥
'mch_cert_path' => '',
// 必填-商户公私钥密码
'mch_cert_password' => '000000',
// 必填-银联公钥证书路径
'unipay_public_cert_path' => '',
// 必填
'return_url' => '',
// 必填
'notify_url' => '',
],
],
'http' => [ // optional
'timeout' => 5.0,
'connect_timeout' => 5.0,
// 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
],
// optional,默认 warning;日志路径为:sys_get_temp_dir().'/logs/yansongda.pay.log'
'logger' => [
'enable' => false,
'file' => null,
'level' => 'debug',
'type' => 'single', // optional, 可选 daily.
'max_file' => 30,
],
];
config设置完成后仍然报错,开始在插件里找错误原因
Yansongda\pay\src\Functions.php 文件
if (!function_exists('get_alipay_config')) {
/**
* @throws \Yansongda\Pay\Exception\ContainerException
* @throws \Yansongda\Pay\Exception\ServiceNotFoundException
*/
function get_alipay_config(array $params = []): Config
{
$alipay = Pay::get(ConfigInterface::class)->get('alipay');
$config = $params['_config'] ?? 'default';
return new Config($alipay[$config] ?? []);
}
}
此处获取不到配置信息,判断是Laravel出现的传参问题,修改了
App\Providers\AppServiceProvider.php 传参方式
//往服务容器中注入一个名为alipay的单例对象
$this->app->singleton('alipay',function(){
//此处$config = config('pay.alipay');
$config = config('pay');
//判断当前项目运行环境是否为线上环境
if(app()->environment() !== 'production'){
//修改此处$config['mode'] = 'dev';
$config['alipay']['default']['mode'] = 1;
$config['logger']['level'] = Logger::DEBUG;
}else{
$config['logger']['level'] = Logger::WARNING;
}
//调用Yansongda\Pay来创建一个支付宝支付对象
return Pay::alipay($config);
});
2、Class ‘Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory’ Not Found
解决方案:composer require symfony/psr-http-message-bridge
3、模型数据
./vendor/yansongda/pay/src/Provider/Alipay.php文件介绍了三种模型对应的 URL
public const URL = [
Pay::MODE_NORMAL => 'https://openapi.alipay.com/gateway.do?charset=utf-8',
Pay::MODE_SANDBOX => 'https://openapi.alipaydev.com/gateway.do?charset=utf-8',
Pay::MODE_SERVICE => 'https://openapi.alipay.com/gateway.do?charset=utf-8',
];
./vendor/yansongda/pay/src/Pay.php介绍了每个模型对应的类型
// 正常模式.
public const MODE_NORMAL = 0;
//沙箱模式.
public const MODE_SANDBOX = 1;
// 服务商模式.
public const MODE_SERVICE = 2;
搞定!
我也遇到你这个问题了,按照你说的这个报错解决了,不过又有个新的问题出现 Class "Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory" not found
我的改完还是报Yansongda\Pay\Exception\InvalidConfigException: Missing Alipay Config -- [app_public_cert_path] in file 这个错误啊
'app_public_cert_path' => config_path('/Pay/appPublicCert.crt'),
按照你的操作,报以下错误: 调试错误,请回到请求来源地,重新发起请求。 错误代码 invalid-app-id 错误原因: 无效的AppID参数
请问楼主是用的 沙箱应用么 'mode' => Pay::MODE_SANDBOX,
是的,我直接用的最新版 改的地址
我配置了证书路径
这里config打印出来参数也正确, 但是就是报错:
Missing Alipay Config -- [app_public_cert_path]
使用的版本是3.5, 大佬帮忙看看是什么问题