(Laravel) 无法从 PayPal IPN 获得响应但模拟响应 returns 已验证

(Laravel) Unable to get response from PayPal IPN but simulated response returns verified

我在我网站的会员页面上添加了一个 PayPal 插件,我使用沙盒模式付款,但我没有从 PayPal 收到任何 IPN 响应,但我可以模拟 IPN 响应和它 returns 握手已验证

我已转到“我的帐户”>“销售首选项”>“IPN”并在那里更新了 URL,并且在我使用的插件中,我已将 notify_url 位更改为 IPN url 还有

插件:https://github.com/srmklive/laravel-paypal

在我下面的 IPN 处理程序上,我将 post 响应插入数据库 table 这样我就可以查看我是否从 PayPal

收到任何东西

插件配置

return [
    'mode'    => env('PAYPAL_MODE', 'sandbox'), // Can only be 'sandbox' Or 'live'. If empty or invalid, 'live' will be used.
    'sandbox' => [
        'username'    => env('PAYPAL_SANDBOX_API_USERNAME', ''),
        'password'    => env('PAYPAL_SANDBOX_API_PASSWORD', ''),
        'secret'      => env('PAYPAL_SANDBOX_API_SECRET', ''),
        'certificate' => env('PAYPAL_SANDBOX_API_CERTIFICATE', ''),
        'app_id'      => 'APP-80W284485P519543T', // Used for testing Adaptive Payments API in sandbox mode
    ],
    'live' => [
        'username'    => env('PAYPAL_LIVE_API_USERNAME', ''),
        'password'    => env('PAYPAL_LIVE_API_PASSWORD', ''),
        'secret'      => env('PAYPAL_LIVE_API_SECRET', ''),
        'certificate' => env('PAYPAL_LIVE_API_CERTIFICATE', ''),
        'app_id'      => '', // Used for Adaptive Payments API
    ],

    'payment_action' => 'Sale', // Can only be 'Sale', 'Authorization' or 'Order'
    'currency'       => 'GBP',
    'notify_url'     => 'https://www.mywebsite.com/paypal/ipn', // Change this accordingly for your application.
    'locale'         => '', // force gateway language  i.e. it_IT, es_ES, en_US ... (for express checkout only)
    'validate_ssl'   => false, // Validate SSL when creating api client.
];

IPN 处理程序

public function ipn(Request $request)
{
    $data = [
        'post' => json_encode($request->all()),
        'created_at' => date('Y-m-d H:i'),
    ];
    // Import the namespace Srmklive\PayPal\Services\ExpressCheckout first in your controller.
    $provider = new ExpressCheckout;

    $request->merge(['cmd' => '_notify-validate']);
    $post = $request->all();

    $response = (string) $provider->verifyIPN($post);
    $data['response'] = $response;

    DB::table('ipn_responses')->insert($data);

    if ($response === 'VERIFIED') {
        // Your code goes here ...
    }
}

原来是我插件用错了。我需要 "do" 在 success_url

上付款

因此,例如,当 PayPal returns 我访问该网站时,付款尚未完成。以下代码处理付款然后进行检查。我一直以为是通过IPN发送的

/**
 * Payement success
 * @param Request $request
 * @return \Illuminate\Http\RedirectResponse
 */
public function success(Request $request)
{
    $token = $request->get('token');
    $PayerID = $request->get('PayerID');
    $cart = $this->getCartDataFromToken($token);

    // Verify Express Checkout Token
    $response = $this->provider->getExpressCheckoutDetails($token);

    // Check express checkout was a success
    if (in_array(strtoupper($response['ACK']), ['SUCCESS', 'SUCCESSWITHWARNING'])) {

        // Perform transaction on PayPal
        $response = $this->provider->doExpressCheckoutPayment($cart, $token, $PayerID);
        $order = $this->finalizeOrder($cart, $response);

        if($order->paid) {

            $order->user->startMembership($order->membership);

            FormResponse::set('Your order has been successfully completed and your membership has begun. You may check your My Account page to view your membership status.');
        }
        else {
            FormResponse::set('Your payment could not be completed (Error 2)');
        }
    }
    else {
        FormResponse::set('Your payment could not be completed (Error 1)');
    }

    return redirect()->route('memberships');
}