首页 > 解决方案 > 沙盒 PayPal 批准链接在登录后指向仪表板而不是付款

问题描述

我在沙盒模式下使用 PayPal REST API 来测试付款。

我创建批准链接,然后将用户重定向到所述链接。

然后,PayPal 要求我作为沙盒测试买家插入的凭据。但登录后,PayPal 不会重定向我以完成付款批准,而是直接转到我无法批准付款的“我的帐户”摘要。但是,如果用户已经登录,则付款批准将按预期进行。

是链接是如何创建的问题还是一个错误?

这是用于创建链接的代码

<?php
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\Transaction;
use PayPal\Auth\OAuthTokenCredential;
use PayPal\Rest\ApiContext;

class PaypalFactory
{
private const CLIENT_ID = 'yyy';
private const CLIENT_SECRET = 'xxx';

private function __construct()
{
}

public static final function getContext()
{
    return new ApiContext(
        new OAuthTokenCredential(
            self::CLIENT_ID,
            self::CLIENT_SECRET
        )
    );
}

public static final function createPaymentLink(
    int $orderId,
    string $currency,
    float $totalPrice,
    float $deliveryPrice,
    string $returnUrl,
    string $cancelUrl): string
{
    $payer = new Payer();
    $payer
        ->setPaymentMethod("paypal");

    $details = new Details();
    $details
        ->setShipping($deliveryPrice)
        ->setSubtotal($totalPrice);


    $item = new Item();
    $item
        ->setName('products and shipping')
        ->setCurrency($currency)
        ->setPrice($totalPrice)
        ->setQuantity(1);

    $itemList = new ItemList();
    $itemList->setItems(array($item));


    $amount = new Amount();
    $amount
        ->setCurrency($currency)
        ->setTotal($totalPrice + $deliveryPrice)
        ->setDetails($details);

    $transaction = new Transaction();
    $transaction
        ->setItemList($itemList)
        ->setAmount($amount)
        ->setDescription("Products from ")
        ->setInvoiceNumber($orderId);

    $redirectUrls = new RedirectUrls();
    $redirectUrls
        ->setReturnUrl($returnUrl)
        ->setCancelUrl($cancelUrl);

    $payment = new Payment();
    $payment
        ->setIntent("sale")
        ->setPayer($payer)
        ->setRedirectUrls($redirectUrls)
        ->setTransactions(array($transaction));

    try {
        $payment->create(PaypalFactory::getContext());
    } catch (Exception $ex) {
        print $ex;
    }

    return $payment->getApprovalLink();
}

}

标签: phppaypal

解决方案


清除贝宝域的所有浏览器 cookie 是一个很好的建议,并且可能会有所帮助。您遇到的问题可能是一般沙盒问题(在实时模式下不会发生),而不是您的代码问题。

但是,看到您的代码/解决方案,我确实有一些尝试一些更新/更好的东西的建议:

  1. 代替旧的 PayPal-PHP-SDK 用于 v1/支付,使用新的Checkout-PHP-SDK 用于 v2/订单
  2. 不要将买家重定向到批准 URL,而是将批准令牌提供给智能支付按钮的 Javascript 代码,这将显示一个上下文窗口,使您的网站在后台加载。这是一个演示模式

推荐阅读