0

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

我已经转到我的帐户 > 销售偏好 > IPN 并在那里更新了 URL,并且在我使用的插件中,我也将notify_url位更改为 IPN url

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

在下面的 IPN 处理程序中,我将发布响应插入到数据库表中,以便查看是否从 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 ...
    }
}
4

1 回答 1

0

原来我用错了插件。我需要在 success_url 上“进行”付款

例如,当 PayPal 将我返回到网站时,付款尚未完成。以下代码处理付款然后进行检查。我一直以为是通过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');
}
于 2018-03-04T12:47:41.493 回答