Support » Plugin: License Manager for WooCommerce » API to get order email and name

  • Resolved deve42

    (@deve42)


    Hi Drazen,

    Thanks for this great plugin!

    My workflow for activating a license is to ask the user to enter the order email address, name and license key from desktop software. How can I verify these before activation? Are there existing APIs from License Manager or WooCommerce to get these data?

    Thanks,
    Deve

Viewing 15 replies - 1 through 15 (of 19 total)
  • Plugin Author Drazen Bebic

    (@drazenbebic)

    Hello @deve42,

    thank you for your message and for using my plugin.

    This is not possible in the current version of the plugin, however I have already implemented this feature for the next release. If you can’t wait for the next update (end of October/beginning of November), then you can always install the development version on a test server, implement everything, then just install the productive plugin when it comes out.

    Now, to actually answer your question.

    I have implemented two new features which will be relevant to your workflow. There now is an additional REST API data validation / user authentication hook. This hook expects either a “true” if everything is fine, or a “WP_Error” object if something’s wrong. If you return a WP_Error object the Request will return this error object as the API response and stop processing it.

    There also is a hook to modify the response of any and all REST API requests. Should you need to add additional data to the response, this would be the place to look for.

    Take a look here: https://github.com/drazenbebic/license-manager-for-woocommerce/blob/DEV/includes/api/Setup.php

    Let me know if this helped or not

    deve42

    (@deve42)

    Thanks Drazen, wow that’s wonderful!

    I’m a bit lost with how these hooks work or how I call them… Any pointers?

    Really appreciate your help! Can’t wait for your next release.

    Thanks,
    Deve

    Plugin Author Drazen Bebic

    (@drazenbebic)

    Hello @deve42,

    I can’t really help you with this, because of all of this hasn’t been released yet. You should have some coding knowledge to work with the development version, otherwise I would suggest for you to wait for the next release.

    What do you think?

    deve42

    (@deve42)

    I’ll try to figure out a solution. Thanks.

    Plugin Author Drazen Bebic

    (@drazenbebic)

    Hello @deve42,

    I didn’t mean to sound like I don’t want to help, I was just wondering if you’re comfortable with using the development version?

    Let me know so I can assist 🙂

    deve42

    (@deve42)

    I’m comfortable using the development version because my site is under construction and is not live. However, I’m not familiar with the WordPress framework and it’s been a while since I coded in PHP (it’s changed a lot since).

    Was thinking I might write a function to query the DB for the user info but it might be better to have everything integrated within your plugin if you already have it under development.

    My confusion is which API function to call or do I need to add my own code in Setup.php?

    Thanks!

    Plugin Author Drazen Bebic

    (@drazenbebic)

    Hello @deve42,

    Since you’re integrating this from within the website, there is no need to call the API. You will first need to install the development version of the plugin (don’t forget the composer dependencies!), then add your own custom code which hook into the plugin hooks for data validation and there perform your checks, that would be the following hook (filter):

    lmfwc_rest_api_validation

    I am on vacation however next week, so I won’t be able to help you out until I get back.

    Thanks for your reply, Drazen.

    Sorry I have no idea what the composer dependencies are. Probably better to let you integrate all these so I’m not messing things up.

    Enjoy your vacation!

    Btw, in the Settings screen:

    PUT – v2/licenses/activate/{license_key}

    should be:

    GET – v2/licenses/activate/{license_key}

    Plugin Author Drazen Bebic

    (@drazenbebic)

    @deve42

    Yes, that is correct. This will be patched in the coming update. Thanks for confirming the bug.

    Hi Drazen,

    Hope you had a nice vacation! I’ve been testing some custom code to get the buyer meta data and it’s working ok but it’s not integrated into your plugin and require a separate call to the server.

    If all I need is to have your plugin API return the buyer’s email during validation or activation, what would I need to add to use the hook?

    Plugin Author Drazen Bebic

    (@drazenbebic)

    Hello @deve42,

    thank you for your asking, the vacation was nice and very much needed 🙂

    As for your problem, you would need to do some modifications of the plugin source code, but in a way so that it doesn’t break once the next update comes. Please take a look at this file (line 29):

    https://plugins.trac.wordpress.org/browser/license-manager-for-woocommerce/trunk/includes/abstracts/RestController.php

    the “response” method is used by EVERY API call, it sends out the processed request. And as you can see, there is a filter called lmfwc_rest_api_pre_response which allows you to modify the response data. Hook in there and to make sure you’ve got the right route, check the $route variable.

    You should be able to simply add a key/value pair to the $data variable.

    If you need further assistance with this, let me know.

    Thank you again, Drazen. Sorry for being a noob with the WP/Woocommerce frameworks, I am still unable to figure out how to hook into your code.

    To get the buyer’s email (possibly with name), here is my function:

    function getBuyerMeta($orderID) {
       if (empty($orderID)) {
          $result->error = "Missing orderID!";
       } else {
          if (is_numeric($orderID)) {
             $order = wc_get_order($orderID);
             if ($order) {
                $order_data = $order->get_data();
                if ($order_data) {
                   $billing = $order_data['billing'];
                   $result->fname = $billing['first_name'];
                   $result->lname = $billing['last_name'];
                   $result->email = $billing['email'];
                } else {
                   $result->error = "No such order data: ". $orderID;
                }
             } else {
                $result->error = "No such order: ". $orderID;
             }
          } else {
             $result->error = "Invalid orderID!";
          }
       }
       
       return $result;
    }

    How do I grab the orderID from your API (activation / validation), and integrate it with this function or have the function directly hooked into lmfwc_rest_api_pre_response?

    • This reply was modified 2 months, 2 weeks ago by deve42.
    Plugin Author Drazen Bebic

    (@drazenbebic)

    @deve42,

    Please try something like this:

    add_filter('lmfwc_rest_api_pre_response', function($method, $route, $data) {
        // Check if we are on the correct route (perhaps also verify the $method?)
        if ($route === 'v2/licenses/activate/{license_key}' || $route === 'v2/licenses/validate/{license_key}') {
            // Order ID is present in the $data array
            $orderId = $data['orderId'];
    
            // Retrieve the customer email
            $order = wc_get_order($orderId);
            $customerEmail = $order->get_billing_email();
    
            $data['customerEmail'] = $customerEmail;
        }
        
        return $data;
    });

    You should probably perform more thorough checks on the orderId, but essentially this should work. The “if” at the beginning makes sure, that the email address is only added for the activate and validate API call.

    Let me know if this worked for you.

    Thank you so much Drazen! Your code is what I need, I had to add the priority and number of parameters at the end but that’s all I need to fix to get it to work.

    Here is the code to include the first & last names for anyone else who needs it:

    add_filter('lmfwc_rest_api_pre_response', function($method, $route, $data) {
        // Check if we are on the correct route (perhaps also verify the $method?)
        if ($route === 'v2/licenses/activate/{license_key}' || $route === 'v2/licenses/validate/{license_key}') {
            // Order ID is present in the $data array
            $orderId = $data['orderId'];
    
            // Retrieve the customer email
            $order = wc_get_order($orderId);
    
            $data['customerFirstName'] = $order->get_billing_first_name();
    	$data['customerLastName'] = $order->get_billing_last_name();
    	$data['customerEmail'] = $order->get_billing_email();
        }
        
        return $data;
    }, 10, 3);

    Btw, $method seems to repeat what $data is, any reason why I need to verify it?

    Cheers!

    • This reply was modified 2 months, 2 weeks ago by deve42.
Viewing 15 replies - 1 through 15 (of 19 total)
  • You must be logged in to reply to this topic.