Paypal Php Sdk - NotifyUrl 不是完全限定的 URL 错误
Posted
技术标签:
【中文标题】Paypal Php Sdk - NotifyUrl 不是完全限定的 URL 错误【英文标题】:Paypal Php Sdk - NotifyUrl is not a fully qualified URL Error 【发布时间】:2018-12-27 16:43:36 【问题描述】:我有这个代码
$product_info = array();
if(isset($cms['site']['url_data']['product_id']))
$product_info = $cms['class']['product']->get($cms['site']['url_data']['product_id']);
if(!isset($product_info['id']))
/*
echo 'No product info.';
exit();
*/
header_url(SITE_URL.'?subpage=user_subscription#xl_xr_page_my%20account');
$fee = $product_info['yearly_price_end'] / 100 * $product_info['fee'];
$yearly_price_end = $product_info['yearly_price_end'] + $fee;
$fee = ($product_info['setup_price_end'] / 100) * $product_info['fee'];
$setup_price_end = $product_info['setup_price_end'] + $fee;
if(isset($_SESSION['discountcode_amount']))
$setup_price_end = $setup_price_end - $_SESSION['discountcode_amount'];
unset($_SESSION['discountcode_amount']);
$error = false;
$plan_id = '';
$approvalUrl = '';
$ReturnUrl = SITE_URL.'payment/?payment_type=paypal&payment_page=process_agreement';
$CancelUrl = SITE_URL.'payment/?payment_type=paypal&payment_page=cancel_agreement';
$now = $cms['date'];
$now->modify('+5 minutes');
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
$cms['options']['plugin_paypal_clientid'], // ClientID
$cms['options']['plugin_paypal_clientsecret'] // ClientSecret
)
);
use PayPal\Api\ChargeModel;
use PayPal\Api\Currency;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\Plan;
use PayPal\Api\Patch;
use PayPal\Api\PatchRequest;
use PayPal\Common\PayPalModel;
use PayPal\Api\Agreement;
use PayPal\Api\Payer;
use PayPal\Api\ShippingAddress;
// Create a new instance of Plan object
$plan = new Plan();
// # Basic Information
// Fill up the basic information that is required for the plan
$plan->setName($product_info['name'])
->setDescription($product_info['desc_text'])
->setType('fixed');
// # Payment definitions for this billing plan.
$paymentDefinition = new PaymentDefinition();
// The possible values for such setters are mentioned in the setter method documentation.
// Just open the class file. e.g. lib/PayPal/Api/PaymentDefinition.php and look for setFrequency method.
// You should be able to see the acceptable values in the comments.
$setFrequency = 'Year';
//$setFrequency = 'Day';
$paymentDefinition->setName('Regular Payments')
->setType('REGULAR')
->setFrequency($setFrequency)
->setFrequencyInterval("1")
->setCycles("999")
->setAmount(new Currency(array('value' => $yearly_price_end, 'currency' => $cms['session']['client']['currency']['iso_code'])));
// Charge Models
$chargeModel = new ChargeModel();
$chargeModel->setType('SHIPPING')
->setAmount(new Currency(array('value' => 0, 'currency' => $cms['session']['client']['currency']['iso_code'])));
$paymentDefinition->setChargeModels(array($chargeModel));
$merchantPreferences = new MerchantPreferences();
// ReturnURL and CancelURL are not required and used when creating billing agreement with payment_method as "credit_card".
// However, it is generally a good idea to set these values, in case you plan to create billing agreements which accepts "paypal" as payment_method.
// This will keep your plan compatible with both the possible scenarios on how it is being used in agreement.
$merchantPreferences->setReturnUrl($ReturnUrl)
->setCancelUrl($CancelUrl)
->setAutoBillAmount("yes")
->setInitialFailAmountAction("CONTINUE")
->setMaxFailAttempts("0")
->setSetupFee(new Currency(array('value' => $setup_price_end, 'currency' => $cms['session']['client']['currency']['iso_code'])));
$plan->setPaymentDefinitions(array($paymentDefinition));
$plan->setMerchantPreferences($merchantPreferences);
// ### Create Plan
try
$output = $plan->create($apiContext);
catch (Exception $ex)
die($ex);
echo $output->getId().'<br />';
echo $output.'<br />';
现在使用 paypal php sdk 已经有几天了,我的代码停止工作了。 所以我回到了基本,我仍然得到同样的错误。
我正在尝试创建订阅计划,但收到以下错误: "NotifyUrl 不是完全限定的 URL"
我不知道如何解决这个问题,因为我没有在我的代码中使用 NotfifyUrl?
如果有人知道如何解决这个问题,那就太好了:)
谢谢
【问题讨论】:
修复在这里:github.com/paypal/PayPal-PHP-SDK/pull/1152 将 lib/PayPal/Api/MerchantPreferences.php 替换为:raw.githubusercontent.com/srjlewis/PayPal-PHP-SDK/… 谢谢伙计,使用了与您链接到的相同的修复:) 【参考方案1】:原因 背后 它!
错误来自。
供应商\paypal\rest-api-sdk-php\lib\PayPal\Validation\UrlValidator.php
行。
if (filter_var($url, FILTER_VALIDATE_URL) === false)
throw new \InvalidArgumentException("$urlName is not a fully qualified URL");
FILTER_VALIDATE_URL:根据这个php函数。
无效网址:“http://cat_n.domain.net.in/”; // 它包含 _ 下划线。
有效网址:“http://cat-n.domain.net.in/”;它用 - 破折号分隔
在这里您可以转储您的网址。 供应商\paypal\rest-api-sdk-php\lib\PayPal\Validation\UrlValidator.php
public static function validate($url, $urlName = null)
var_dump($url);
然后在这里查看:https://www.w3schools.com/PHP/phptryit.asp?filename=tryphp_func_validate_url
您可以在此处查看导致无效的字符。
【讨论】:
【参考方案2】:使用下面的简单修复。
在 vendor\paypal\rest-api-sdk-php\lib\PayPal\Api\MerchantPreferences.php 中替换下面的函数
public function setNotifyUrl($notify_url)
if(!empty($notify_url))
UrlValidator::validate($notify_url, "NotifyUrl");
$this->notify_url = $notify_url;
return $this;
如果 return_url/cancel_url 出现相同的错误,请添加上述 if 条件。
注意:这不是永久解决方案,您可以使用它直到从 PayPal 获得更新。
【讨论】:
【参考方案3】:PayPal 昨晚更新了他们的 API,导致他们的 SDK 出现问题。 他们在响应中发回了空值。
我必须强调,错误不在于向 PayPal 发送请求,而在于处理他们的响应。
错误报告:https://github.com/paypal/PayPal-PHP-SDK/issues/1151
拉取请求:https://github.com/paypal/PayPal-PHP-SDK/pull/1152
希望这会有所帮助,但他们当前的 SDK 正在引发异常。
【讨论】:
【参考方案4】:来自the GitHub repo for the PayPal PHP SDK,我看到当 MerchantPreferences 未提供有效的 NotifyUrl 时,会引发您提到的错误。我看到您正在设置 CancelUrl 和 ReturnUrl,但没有设置 NotifyUrl。您可能也只需要设置它,即:
$NotifyUrl = (some url goes here)
$obj->setNotifyUrl($NotifyUrl);
【讨论】:
谢谢 Richie Thomas 添加通知 URL 并不能解决问题 :) 谢谢 srjlewis 我会等待 paypal 解决问题。以上是关于Paypal Php Sdk - NotifyUrl 不是完全限定的 URL 错误的主要内容,如果未能解决你的问题,请参考以下文章
paypal-php-sdk中的PayPal-Mock-Response
使用 paypal/rest-api-sdk-php 的 laravel paypal 集成错误
发票 PayPal-PHP-SDK 中的 Paypal notify_url