带有 laravel 的 Paypal PHP SDK。在生产模式下加载配置端点时出现问题
Posted
技术标签:
【中文标题】带有 laravel 的 Paypal PHP SDK。在生产模式下加载配置端点时出现问题【英文标题】:Paypal PHP SDK with laravel. Problem loading config endpoint in production mode 【发布时间】: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;
怎么了?
谢谢
【问题讨论】:
【参考方案1】:这是一个新的集成吗?如果是这样,则 v1 PayPal-PHP-SDK 已过时且已弃用,不应用于任何用途。
改为使用 v2 Checkout-PHP-SDK
【讨论】:
我用这个版本packagist.org/packages/paypal/rest-api-sdk-php 问题是:我也必须处理帐单协议(仅在 V1 中可用) 为什么必须使用旧的 SDK 处理计费协议?您可能应该对该部分使用直接 HTTP 调用。例如,任何 SDK 都不支持新的 Subscriptions API。【参考方案2】:我找到了办法。将 Api 上下文传递给我的 PayPalController::construct() 并停止使用静态函数。
【讨论】:
以上是关于带有 laravel 的 Paypal PHP SDK。在生产模式下加载配置端点时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
Paypal 集成 PHP Laravel - 获取交易 ID
使用 paypal/rest-api-sdk-php 的 laravel paypal 集成错误
带有 laravel 的 Paypal sdk - 从 env 文件中获取 Client_id/secret
PayPal IPN POST 结果为 0 PHP Laravel
Laravel Guest-checkout is not working in paypal using "paypal/rest-api-sdk-php": "*&q