【问题标题】:Paypal PHP SDK with laravel. Problem loading config endpoint in production mode带有 laravel 的 Paypal PHP SDK。在生产模式下加载配置端点时出现问题
【发布时间】:2020-08-16 04:18:01
【问题描述】:

我尝试将 Paypal PHP SDK 与 laravel 一起使用。 在沙盒模式下一切正常。 但是当我上线时,当请求在 paypal 平台上付款后返回时,我遇到了配置加载问题。

我的问题出在这个文件 /lib/PayPal/Handler/RestHandler.php 上,$config 是空的

private function _getEndpoint($config)
{
if (isset($config['service.EndPoint'])) {
    return $config['service.EndPoint'];
} elseif (isset($config['mode'])) {
    switch (strtoupper($config['mode'])) {
    case 'SANDBOX':
    return PayPalConstants::REST_SANDBOX_ENDPOINT;
    break;
    case 'LIVE':
    return PayPalConstants::REST_LIVE_ENDPOINT;
    break;
    default:
    throw new PayPalConfigurationException('The mode config parameter must be set to either sandbox/live');
    break;
    }
    } else {
    // Defaulting to Sandbox
    return PayPalConstants::REST_SANDBOX_ENDPOINT;
    }
    }

我的问题是这里没有加载配置。

我在我的 laravel 应用中这样做了:添加配置文件 paypal.php

<?php
return [
    'settings' => array(
        'mode' => env('PAYPAL_MODE','LIVE'),
        'service.EndPoint' => env('PAYPAL_ENDPOINT','https://api.paypal.com/'),
        'http.ConnectionTimeOut' => 30,
        'log.LogEnabled' => true,
        'log.FileName' => storage_path() . '/logs/paypal.log',
        'log.LogLevel' => 'ERROR'
    ),
];

我在 PayPalController 中像这样处理我的 ApiContext

public static function generatePaypalApiContext(Connexion $connexion)
    {
    if (isset($connexion->data["paypal_client_id"]) && isset($connexion->data["paypal_client_secret"])) {
    $apiContext = new ApiContext(new OAuthTokenCredential($connexion->data["paypal_client_id"], $connexion->data["paypal_client_secret"]));
    $paypal_conf = config('paypal');
    $apiContext->setConfig($paypal_conf['settings']);
    Session::put('paypal_api_context', $apiContext);
    } else {    
    return false;
    }

    return $apiContext;
    }

这是我执行付款的功能

public static function getPaymentStatus(string $payerId)
{
    /** Get the payment ID before session clear **/
    $payment_id = Session::get('paypal_payment_id');
    /** clear the session payment ID **/
    Session::forget('paypal_payment_id');
    $apiContext = Session::get('paypal_api_context');
    $payment = Payment::get($payment_id, $apiContext);
    $execution = new PaymentExecution();
    $execution->setPayerId($payerId);
    /**Execute the payment **/
    $result = $payment->execute($execution, $apiContext);
    if ($result->getState() == 'approved') {
    return true;
    }
    return false;
}

怎么了?

谢谢

【问题讨论】:

    标签: php laravel paypal paypal-rest-sdk


    【解决方案1】:

    这是一个新的集成吗?如果是这样,则 v1 PayPal-PHP-SDK 已过时且已弃用,不应用于任何用途。

    改为使用 v2 Checkout-PHP-SDK

    【讨论】:

    • 问题是:我也必须处理帐单协议(仅在 V1 中可用)
    • 为什么必须使用旧的 SDK 处理计费协议?您可能应该对该部分使用直接 HTTP 调用。例如,任何 SDK 都不支持新的 Subscriptions API。
    【解决方案2】:

    我找到了办法。将 Api 上下文传递给我的 PayPalController::construct() 并停止使用静态函数。

    【讨论】:

      猜你喜欢
      • 2014-03-07
      • 1970-01-01
      • 2020-06-26
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 2022-09-18
      • 1970-01-01
      • 2013-08-24
      相关资源
      最近更新 更多