的支付沙箱配置完成后报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;

搞定!

《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 15

我也遇到你这个问题了,按照你说的这个报错解决了,不过又有个新的问题出现 Class "Symfony\Bridge\PsrHttpMessage\Factory\HttpFoundationFactory" not found

1年前 评论
heaker (作者) 1年前
zhuifeng9102 (楼主) 1年前

我的改完还是报Yansongda\Pay\Exception\InvalidConfigException: Missing Alipay Config -- [app_public_cert_path] in file 这个错误啊

1年前 评论
zhuifeng9102 (楼主) 1年前
xianYu_010 (作者) 1年前

'app_public_cert_path' => config_path('/Pay/appPublicCert.crt'),

1年前 评论

按照你的操作,报以下错误: 调试错误,请回到请求来源地,重新发起请求。 错误代码 invalid-app-id 错误原因: 无效的AppID参数

请问楼主是用的 沙箱应用么 'mode' => Pay::MODE_SANDBOX,

10个月前 评论
DogLoML 10个月前
zhuifeng9102 (楼主) 10个月前
strong_man_go_go-come_back_no_no (作者) 10个月前

是的,我直接用的最新版 改的地址

9个月前 评论

file

我配置了证书路径

file

这里config打印出来参数也正确, 但是就是报错:

Missing Alipay Config -- [app_public_cert_path]

使用的版本是3.5, 大佬帮忙看看是什么问题

7个月前 评论
zhuifeng9102 (楼主) 7个月前
maonini (作者) 7个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!