PayPal 被重定向到成功页面,但它没有进行货币交易(并且没有 webhook 或 IPN 通知)

Posted

技术标签:

【中文标题】PayPal 被重定向到成功页面,但它没有进行货币交易(并且没有 webhook 或 IPN 通知)【英文标题】:PayPal is redirect to success page, but it's not making the money transaction (and no webhook or IPN notification) 【发布时间】:2018-10-28 22:58:40 【问题描述】:

这几天我试图解决一个贝宝问题。我正在使用 PayPal php SDK,我的环境是安装了 PHP 7.2 并运行 Laravel 5.6 的 Linux 服务器(Ubuntu 16)。

我通过 composer 安装了 paypal php sdk,并在代码中集成了“successfuly”。当我尝试运行代码时,我会返回付款链接(通常是你重定向用户的地方),所以它工作正常,第一个请求或 api 凭据没有问题。

问题是,如果您转到付款链接并且我付款,它会将付款人重定向到我网站的成功页面,但我的帐户中没有任何交易(买方和收款人)而且我没有收到任何 webhook 或 IPN 通知(也比如,用户必须花钱或用户个人资料未验证,什么都没有)。

我已经尝试过的:

打开实时 api 并尝试使用真实的贝宝配置文件,但我遇到了同样的问题。所以这不是问题。 (在 paypal sdk github 上有人在沙盒上遇到问题)。 使用 Laravel Packege(同样的问题)。

这是我的代码(但我认为问题不是这个):

$_api_context = new ApiContext(new OAuthTokenCredential(
'CLIENT_ID','SECRET'));
    $_api_context->setConfig(array(
        'mode' => env('PAYPAL_MODE', 'sandbox'),
        'log.LogEnabled' => true,
        'log.FileName' => 'PayPal.log',
        'log.LogLevel' => 'DEBUG'
    ));


    $payer = new Payer();
    $payer->setPaymentMethod('paypal');
    $item_1 = new Item();
    $item_1->setName('Item 1') /** item name **/
    ->setCurrency('USD')
        ->setQuantity(1)
        ->setPrice('3'); /** unit price **/

    $item_list = new ItemList();
    $item_list->setItems(array($item_1));
    $amount = new Amount();
    $amount->setCurrency('USD')
        ->setTotal('3');
    $transaction = new Transaction();
    $transaction->setAmount($amount)
        ->setItemList($item_list)
        ->setDescription('Your transaction description');

    $redirect_urls = new RedirectUrls();

    $redirect_urls->setReturnUrl('https://XXXXXXX.ngrok.io/success') /** Specify return URL **/
    ->setCancelUrl('https://XXXXX.ngrok.io/error');

    $payment = new Payment();
    $payment->setIntent('Sale')
        ->setPayer($payer)
        ->setRedirectUrls($redirect_urls)
        ->setTransactions(array($transaction));


    //dd($payment);
    try 
        $payment->create($_api_context);
     catch (\PayPal\Exception\PPConnectionException $ex) 
        dd($ex);

    

    foreach ($payment->getLinks() as $link) 
        if ($link->getRel() == 'approval_url') 
            $redirect_url = $link->getHref();
            break;
        
    
    $approvalUrl = $payment->getApprovalLink();

    dd($redirect_url,$_api_context,$paypal,$paymentGateway,$approvalUrl,$payment->getId());

【问题讨论】:

【参考方案1】:

我没有找到您在哪里设置发布请求发送您的服务器以保存您的交易。 像这样试试.. 代码..

<script>
    paypal.Buttons(
        createOrder: function(data, actions) 
        return actions.order.create(
            purchase_units: [
            amount: 
                value: '$form_data->net_amount'
            
            ]
        );
        ,
        onApprove: function(data, actions) 
            console.log('data');
            console.log(data);
        return actions.order.capture().then(function(details) 
            console.log(details);
            alert('Transaction completed by ' + details.payer.name.given_name);
            // Call your server to save the transaction
            return fetch('/paypal-transaction-complete', 
            method: 'post',
            headers: 
                'content-type': 'application/json'
            ,
            body: JSON.stringify(
                orderID: data.orderID,
                userDetail: details,
                bookingId: '$form_data->id',
                _token: 'csrf_token()'
            )
            ).then(function()
                location.reload();
            );
        );
        
    ).render('#paypal-button-container');
</script>

【讨论】:

【参考方案2】:

对于遇到同样问题的任何人,您应该在用户被重定向到您的成功页面后执行付款。

【讨论】:

【参考方案3】:

更新

我尝试从沙盒账户(个人)向拥有 api 的企业账户汇款,并且 ipn 工作正常。

【讨论】:

以上是关于PayPal 被重定向到成功页面,但它没有进行货币交易(并且没有 webhook 或 IPN 通知)的主要内容,如果未能解决你的问题,请参考以下文章

PayPal Checkout JavaScript:更改货币而不重定向或刷新页面

自定义 PayPal 捐赠按钮以将信息传递到 PayPal 页面

Magento:支付完成后,paypal 标准支付未重定向到 Magento 成功页面

PayPal:将电子邮件地址传递到退货/“谢谢”页面

成功结帐时的贝宝重定向

Django PayPal 延迟