PayPal Single does not return logged in user id after payment

I’m using Membership free plugin on staging website with Paypal Single Gateway Sandbox mode of this membership plugin.

I want to get user id (logged in user id who purchased the membership) after user complete payment on paypal.

I’m using action hook ms_gateway_paypalsingle_payment_processed_pending which works after user pay on paypal but it return wrong user Id (always same user ID). I think this same user ID connected to that membership as I can see on Membership -> Billing page at my wp backend but it always shows same and don’t return the latest/exact user ID who purchased the membership.

only logged in users can buy membership on my website.

I want only 2 things.

1: User ID with action hook in my plugin who purchased that membership so I can implement further functionality for that user.

2: The membership name/slug user purchased.

I want only these 2 values after user paid payment on paypal.

So for I’ve used both parameters $invoice and $subscription of ms_gateway_paypalsingle_payment_processed_pending do_action hook but I can’t get user ID who purchased the membership.

Also note that get_current_user_id() function only return 0 on ms_gateway_paypalsingle_payment_processed_pending hook so can you do something like if you send logged in user ID who purchased the membership as hidden parameters and then return that User ID when response from paypal come?

  • Panos
    • SLS

    Hi Rohit ,

    Memberships are assigned to users so users need to be registered in order to have a subscription for a membership. So the invoice ad subscription objects that are passed as arguments in that action hook can be used to retrieve both, user id and membership.

    You could try this:

    add_action( 'ms_gateway_paypalsingle_payment_processed_pending', function( $invoice, $subscription ){
    $member = $subscription->get_member();
    // You can get user id with:
    //$user_id = $member->id;

    $membership = $subscription->get_membership();
    //You can get membership name with :
    //$membership_name = $membership->name;
    //or
    //$membership_name = $membership->title;

    }, 20, 2 );

    In above snippet we use the $subscription object to fetch $member and $membership. In the comments it demonstrates how to get the user id from member, and membership name from membership.

    One note, this is for pending status and I see that when payment is completed, the $status variable is not updated to paid and you can’t use the ms_gateway_paypalsingle_payment_processed_paid action.

    In case you prefer to use the ms_gateway_paypalsingle_payment_processed_paid action, I have attached file:

    membership-pro/app/gateway/paypalsingle/class-ms-gateway-paypalsingle.php

    which should provide this action.

    I would strongly recommend to keep a backup of original file before replacing it. You can simply rename it to class-ms-gateway-paypalsingle.php.txt

    Hope this helps :slight_smile:

  • Rohit
    • Flash Drive

    Hi Panos, thanks.

    Yes that hook ms_gateway_paypalsingle_payment_processed_pending worked fine.

    But I was trying that clicking on membership button should go directly to paypal.

    Default button goes to another page and then again clicking it go to paypal which is not much user friendly.

    Please see here https://staging.gottobe.fit/welcome/ 2 buttons for each membership.

    Top button (copied html from 2nd page) goes directly to paypal and bottom button go another page and then to paypal which is not much user friendly.

    When I try with native button, I’m able to get user id in ms_gateway_paypalsingle_payment_processed_pending hook but if I use custom html of that membership button from 2nd page link, I don’t get latest logged in user who paid the payment but it return the Id of user at which time I copied the html from 2nd page.

    How can I use membership button link which go directly to paypal and it return correct information of logged in user who just paid the payment?

  • Rohit
    • Flash Drive

    Hey guys, any thoughts on how to avoid the weird 2-step process of purchase and make the “buy” button go directly to PayPal instead of going to another page (/memberships/?membership_id=NNN), where the user needs to click on a buy button again?

  • Panos
    • SLS

    Hi Rohit ,

    Apologies for such a late reply! I missed your message.

    I had a look on your requirement but it needs a subscription created as it has to include the subscription id in paypal’s parameters. So this exceeds the scope of our support as it would take a lot of coding to make this work properly.

    Kind regards!