当前位置: 首页 > 知识库问答 >
问题:

PayPalPHP SDK即使设置费失败也会执行计费协议

宓毅庵
2023-03-14

我的问题是,即使没有支付安装费,计费协议也能成功执行。查看日志,IPN事件通知安装费失败和协议取消通常需要5-10分钟才能到达,这是一个疯狂的延迟量。

我正在使用官方的PayPal PHP SDKhttps://github.com/paypal/PayPal-PHP-SDK.它在一个月前被弃用,但它的替代品被标记为“未准备好生产”。

计费计划详情,旨在收取29.99美元/年的订阅费。设置费用于保证初始付款。

根据https://paypal.github.io/PayPal-PHP-SDK/sample/,记录的两步流程,为清晰起见,去掉了包装试/抓块:

// Step 1: https://paypal.github.io/PayPal-PHP-SDK/sample/doc/billing/CreateBillingAgreementWithPayPal.html

use PayPal\Api\Agreement;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\Payer;
use PayPal\Api\Plan;

/**
 * @var \PayPal\Rest\ApiContext $apiContext
 */
$plan = Plan::get('EXAMPLE-PLAN-ID', $apiContext);

$agreement = new Agreement();

date_default_timezone_set('America/Los_Angeles');
$agreement->setName($plan->getName())
    ->setDescription($plan->getDescription())
    // I'm not sure why +1 hour is used here, but that's how it is in the codebase.
    ->setStartDate(date('c', strtotime("+1 hour", time())));

$agreement->setPlan($plan);

/**
 * ------------------------------------------------------------------------------------------
 * I think overriding should be optional since they currently precisely match the given 
 * plan's data.  So for this particular plan, if I deleted everything between these comment
 * blocks, nothing bad should happen.
 * ------------------------------------------------------------------------------------------
 */
$preferences = new MerchantPreferences();
$preferences->setReturnUrl("https://www.example.com/actually-a-valid-site")
    ->setCancelUrl("https://www.example.com/actually-a-valid-site")
    ->setAutoBillAmount('no')
    ->setInitialFailAmountAction('CANCEL');

$agreement->setOverrideMerchantPreferences($preferences);
/**
 * ------------------------------------------------------------------------------------------
 * ------------------------------------------------------------------------------------------
 */

$payer = new Payer();
$payer->setPaymentMethod('paypal');
$agreement->setPayer($payer);

$agreement = $agreement->create($apiContext);
$approvalUrl = $agreement->getApprovalLink();

// This takes us to PayPal to login and confirm payment.
header("Location: ".$approvalUrl);
// Step 2: https://paypal.github.io/PayPal-PHP-SDK/sample/doc/billing/ExecuteAgreement.html

use PayPal\Api\Agreement;

/**
 * @var \PayPal\Rest\ApiContext $apiContext
 */
try {
    $agreement = new Agreement();
    $agreement->execute($_GET['token'], $apiContext);

    $agreement = Agreement::get($agreement->getId(), $apiContext);

    /**
     * I assume at this point the agreement is executed successfully.  Yet, the setup fee does not
     * have to be paid for us to get here.  This behavior is verified on live.
     */
} catch (\Exception $e) {
    // Do something.
}

我对自己做错了什么感到茫然,即使没有支付安装费,也会导致计费协议执行。帮助将不胜感激!

以下是如何创建使用的计划:

use PayPal\Api\Currency;
use PayPal\Api\MerchantPreferences;
use PayPal\Api\Patch;
use PayPal\Api\PatchRequest;
use PayPal\Api\PaymentDefinition;
use PayPal\Api\Plan;
use PayPal\Common\PayPalModel;

$plan = new Plan();

$plan->setName('Test Name')
    ->setDescription('Test Description')
    ->setType('INFINITE');

$payment_definition = new PaymentDefinition();

$payment_definition->setName('Regular Payments')
    ->setType('REGULAR')
    ->setFrequency('YEAR')
    ->setFrequencyInterval(1)
    ->setCycles('0')
    ->setAmount(new Currency(['value' => '29.99', 'currency' => 'USD']));

$merchant_preferences = new MerchantPreferences();
$merchant_preferences->setReturnUrl'https://insert.actual.url.here')
    ->setCancelUrl('https://insert.actual.url.here')
    ->setAutoBillAmount('NO')
    ->setInitialFailAmountAction('CANCEL')
    ->setMaxFailAttempts('1')
    ->setSetupFee(new Currency(['value' => '29.99', 'currency' => 'USD']));

$plan->setPaymentDefinitions([$payment_definition]);
$plan->setMerchantPreferences($merchant_preferences);

$request = clone $plan;

try {
    /**
     * @var \Paypal\Rest\ApiContext $apiContext
     */
    $plan->create($apiContext);

    $patch = new Patch();
    $value = new PayPalModel(['state' => 'ACTIVE']);

    $patch->setOp('replace')
        ->setPath('/')
        ->setValue($value);

    $patchRequest = new PatchRequest();
    $patchRequest->addPatch($patch);

    if (!$plan->update($patchRequest, $apiContext)) {
        throw new \Exception("Failed to apply patch to plan.");
    }
    // Done.
} catch (\Exception $e) {
    // Some error handling.
    exit;
}

共有2个答案

尉迟栋
2023-03-14

事实证明,对于通常的协议执行,不应该抛出异常。要检查是否已支付设置,请检查$agreement-

翟冯浩
2023-03-14

替换SDK是https://github.com/paypal/Checkout-PHP-SDK,不包括任何计费协议或订阅用例。对于SDK未涵盖的用例,您应该使用直接HTTPS集成。这里记录了这一点:https://developer.paypal.com/docs/api/rest-sdks/

您尝试使用的代码是针对过时API的过时SDK(旧版本的计费协议,与新订阅不兼容)。

这里是你应该集成的API,没有SDK:https://developer.paypal.com/docs/subscriptions/

 类似资料:
  • 我使用CORS请求将数据发布到不同域上的php脚本。我收到错误: 跨域请求被阻止:同源策略不允许读取“mydomain”处的远程资源(原因:缺少CORS标头“Access-Control-Allow-Origin”)。 我已经使用以下代码在php中设置了标题。 我也在这篇文章中尝试了这个代码 这是供参考的javascript代码 响应标题 请求标头 但我运气不好任何帮助我都很感激

  • 即使运行包含失败,也不会生成testng-failed.xml。 我使用的是Eclipse版本:2019-06(4.12.0)构建id:20190614-1200 Testng 7.0.0 这在以前会产生一些时间,我们使用它来重新运行失败的测试。但是,我不知道为什么即使存在错误,现在也没有产生这种情况。 有没有什么具体的原因,它不会产生?

  • 因此,我正在将Paypal Rest API与我的django站点集成,以便引入基于订阅的计费,到目前为止,一切都很顺利。 我有一个用于计费计划,计费协议,交易历史记录以及创建和激活计费协议等的所有内容的界面。 但是,如果计费协议被取消或为计费协议付款,我需要一种方式来通知我,所以我认为webhooks是解决这个问题的方法,但是我不能100%确定webhooks适用于计费协议? 任何人都可以建议一

  • 我已经从这里下载了Paypal的SDK:https://github.com/paypal/rest-api-sdk-php 我正在使用Paypal Payments Pro,并希望添加计费计划和计费协议。 浏览 SDK,尽管我没有找到允许我创建计费计划或计费协议的示例或对象。当我寻找如何创建计费计划或协议的示例时,他们似乎解释了如何在没有SDK的情况下从头开始执行此操作。如果计费计划/协议尚不存

  • 看看连接到服务器的路由器以及服务器本身的防火墙规则。 确保Telco的服务器打开了1812和1813UDP端口。 那些人很可能连接到现在关闭的Wi-Fi塔。 根据FreeRADIUS,它们仍然是连接的,它限制了它们同时进行的会话。 使用radzap关闭他们的孤立会话。 可能是强制网络门户上的时区或时间不正确。 建议您使用网络时间协议(NTP)确保所有NAS设备和FreeRADIUS服务器之间的时间

  • 问题内容: 我正在运行一个简单的Calculator应用程序来学习Java的异常处理。我设置了两个要处理的异常:InputMismatchException和ArithmeticException,用于除以零。 ArithmeticException得到处理,并且do-while循环继续。但是在捕获InputMismatchException之后,执行将终止而不是继续循环。 码: 输出: 预期:在