It’s no secret I’m a fan of Easy Digital Downloads as I’m a contributor and support technician Lead Developer for the project. I’m also a HUGE fan of the Software Licensing Extension we sell for it. While it’s a verify flexible extension, the vast majority of people use it to sell WordPress Plugins and Themes, as it enables users to update the items from within their WordPress admin. I needed to take it a bit further though. During the development of Post Promoter Pro I found it necessary for the plugin to periodically “call home” (once a week in this case) to postpromoterpro.com to get updated social media tokens and data necessary for proper functionality.

The key here though, was I didn’t want just anybody to be able to access my API. I wanted any customer with a valid or expired license key to be able to retrieve this data. In your case, you may just want valid, but in my case I found it beneficial to the users to allow this to work after expiration, they just won’t get updates to the plugin itself. So here’s what I did.

This is a pretty code heavy example, so I apologize ahead of time.

The following code does require the Software Licensing extension and Easy Digital Downloads be installed and activated.

On our site running EDD Software Licensing

We need to create an API endpoint for the plugin to call. Here’s one I built. It receives a license key, and checks it’s status, returning the appropriate data for each case.

<?php
/*
Plugin Name: EDD SL Endpoint for status
Plugin URI: http://filament-studios.com
Description: Creates and endpoint to get license key status
Version: 1.0
Author: Filament Studios
Author URI: http://filament-studios.com
License: GPLv2
*/

add_action( 'init', 'ck_eddsl_add_endpoint' );
function ck_eddsl_add_endpoint( $rewrite_rules ) {
    add_rewrite_endpoint( 'ck-eddsl-api', EP_ALL );
}

register_activation_hook( __FILE__, 'ck_eddsl_activation_tasks' );
function ck_eddsl_activation_tasks() {
    flush_rewrite_rules();
}

register_deactivation_hook( __FILE__, 'ck_eddsl_deactivation_tasks' );
function ck_eddsl_deactivation_tasks() {
    flush_rewrite_rules();
}


add_filter( 'query_vars', 'ck_eddsl_query_vars' );
function ck_eddsl_query_vars( $vars ) {
    $vars[] = 'ck-eddsl-license-key';

    return $vars;
}

add_action( 'template_redirect', 'ck_eddsl_process_request', -1 );
function ck_eddsl_process_request() {
    global $wp_query;
    
    // If our endpoint isn't hit, just return
    if ( ! isset( $wp_query->query_vars['ck-eddsl-api'] ) ) {
        return;
    }

    // If they didn't supply a key, return
    if ( ! isset( $wp_query->query_vars['ck-eddsl-license-key'] ) ) {
        ck_eddsl_output( array( 'error' => 'No License Key Provided' ) );
    }

    $sl = edd_software_licensing();

    define( 'EDD_BYPASS_NAME_CHECK', true );
    $status = $sl->check_license( array( 'key' => $wp_query->query_vars['ck-eddsl-license-key'] ) );

    // If the key isn't invalid or disabled, return our API data
    if ( $status != 'invalid' && $status != 'disabled' ) {
        $data = array( 'foo' => 'bar' );
        ck_eddsl_output( $data );
    } else {
        ck_eddsl_output( array( 'error' => 'Invalid License Key. Cheetin\' eh?' ) );
    }
    

}

function ck_eddsl_output( $output ) {
    // Helps us exit any output buffers started by plugins or themes
    $ob_status = ob_get_level();
    while ( $ob_status > 0 ) {
        ob_end_clean();
        $ob_status--;
    }
    
    // Output the data for the endpoint
    header( 'Content-Type: application/json' );
    echo json_encode( $output );
    exit;
}

To test this, just be sure you have a valid license key, and you should be able to send a request like this:
https://yoursite.com/ck-eddsl-api?ck-eddsl-license-key=[valid license key here]
And receive a response like this:

{"foo": "bar"}

NOTE: If your endpoint gives you a 404, just go into your Settings -> Permalinks and click ‘Save’

In the plugin the user installs:

We need to create a way for the plugin the user purchases to call home to our site and retrieve the data depending on the status of their license key. In short this function does the following:

  1. Checks if the transient exists
  2. Requests the data from the API if it doesn’t
  3. Stores the data from the API for a week
function ck_eddsl_get_api_data() {
    $current_data_from_api = get_transient( 'my_api_data' );

    if ( !$current_data_from_api ) {
        $license = trim( get_option( '_my_license_key' ) );
        $url = EDDSL_STORE_URL . '/ck-eddsl-api?ck-eddsl-license-key=' . $license;
        $args = array( 'timeout' => 15, 'sslverify' => false );
        $response = wp_remote_get( $url, $args );

        if ( is_wp_error( $response ) ) {
            return false;
        }

        $current_data_from_api = json_decode( wp_remote_retrieve_body( $response ) );
        if ( !isset( $current_data_from_api->error ) ) {
            set_transient( 'my_api_data', $current_data_from_api, WEEK_IN_SECONDS );
        }
    }

    // Do something with $current_data_from_api
}

Now, by calling this function ck_eddsl_get_api_data, the plugin will either retrieve the data from the transient if it exists from a previous call, or go to our API to get it, sending along the user’s license key.

Putting it all together

Now that we have the plugin, and the endpoint setup. Your user’s sites can request data from you directly, once a week, only if they’ve ever held a valid license key. This could be used in a number of ways, especially in a SaaS implementation. My example here is just one way it could be done.

Posted by Chris Klosowski

Chris Klosowski is the Director of Technology at Sandhills Development, LLC, creators of fine WordPress plugins, and ecommerce solutions.

33 Comments

  1. Hey Chris, thanks for sharing your knowledge on this post. Do you do any independent software consulting or programming? And do you have any experience implementing EDD Software Licensing into a Windows Desktop Application? I have a program built and ready to go and now I am exploring the best ways to sell it. Any feedback or advice would be greatly appreciated, and I’d be happy to discuss compensation as well. Thank you!

    Best Regards,

    Vinny

    Reply

    1. Hey Vinny,

      I’m actually one of the contributing developers on Easy Digital Downloads as well as a support tech. While I’ve not used EDD Software Licensing for Windows Desktop Applications, the API to check the license status is outlined in this doc:
      https://easydigitaldownloads.com/docs/software-licensing-api/

      Reply

  2. Hello
    I am interested in the edd Licensing as well. I intend to use it in a non-WP project.

    The most important functionality would be for me the local key implementation as whmcs or spbas have for instance.

    Are there any way to have a local key implementation for non wp php projects ?

    This kept me way of edd for almost 2 years.

    Thank you.

    Reply

  3. Chris Klosowski March 3, 2015 at 7:39 am

    @Rollo,

    The EDD Software Licensing extension only requires that the site selling the license keys be running WordPress. The license key can be used in any form of ‘customer experience’ so long as it’s able to make an external request to your site to verify the license key is valid.

    Software Licensing has an API that you can call to (as seen above). I’m not 100% positive of what you are expecting of your situation, but it sounds like you’d just need to develop your WHMCS type application to call back to the primary site to check if a license key is valid or not.

    Reply

  4. No. On edd at each run the licensed script is calling home. Each time. Which makes the called licensing server running with high CPU.

    When you have 6000 licenses calling home and interrogating the license server you will feel the load.

    A local key saves the license info and at each run the script firstly checks the local key for valid info and only if it is expired or it is modified calls home.

    For instance in my current setting the script calls home once at each 15 days.
    Of course if the scrambled local key is modified calls home automatically.

    This way the script will run even the licensing server is down for instance.

    Reply

  5. Sorry for giving this example but I sincerely wanna have it implemented in edd. Check it here:
    https://solidphp.atlassian.net/wiki/plugins/servlet/mobile#content/view/4227163

    Reply

    1. Chris Klosowski March 3, 2015 at 11:06 am

      Ah, yes I can see that use case.

      It’s important to know, that the only way that Easy Digital Downloads Software Licensing has it in the ‘sample’ implementation to call home, as it provides updating WordPress plugins.

      In my case, I only call back every 7 days for my API License Key check. You could also implement it this way, but it would not meet your ‘local key’ issue.

      It’s something I can look into and see if it’s possible, as I work for the Easy Digital Downloads project full time. I’ll create an issue on GitHub for us to track that.

      Reply

    2. Rollo,

      Also, RE: you concern on the CPU Load, The Easy Digital Downloads site itself uses the EDD SL API Keys for all the products sold on it. Currently we have over 6000 of those currently active, and checking in for updates. So your concern to performance, while I understand, is something that we have not seen with this and are aware of while developing the checks.

      Reply

  6. I am sure of this.
    There is no problem if the licensing server is called at the activation or at updates.

    But this is my scenario:

    Unfortunately one of my projects use the licensing code on a file that generates the direct video source from YouTube for instance.

    The protection check is added to that file obviously.

    As this is a main file in video cms and at each video file that is seen by the visitors that means in 30 days around 30 millions of checks against the licensing server . that means 1 mil per day which is huge. It is as a small ddos.

    If a customer has a visits spike that means more requests against our licensing server.

    Having a local key file would help a lot. As all requests would be 99% local.

    We used spbas for 4 years and we moved to whmcs licensing.

    But as we use WordPress as shop I would like to have the licensing built in.

    I asked the same question last year over the edd forums but unfortunately this feature isn’t so requested as I see.
    Even if – in my opinion – it is important.

    BTW: sorry for my English. It isn’t my native language.

    Reply

    1. Chris Klosowski March 3, 2015 at 12:21 pm

      I would love to continue this discussion, would you mind sending in a ticket at support@easydigitaldownloads.com? I think the comments isn’t the best place to respond to this subject, at this length. Also, that will allow the rest of the team to chime in as well. Once you open a ticket there, I’ll copy in our conversation so i can share it.

      No problem on the english at all.

      Reply

  7. Sure, Thank you

    Reply

  8. Sander Kuipers March 8, 2016 at 4:46 am

    Hi Chris, this may be a little off topic but I need some sort of tool that allows locking of a specific download with an manual entry key by an admin. Is this possible?

    What I’m trying to achieve here is:
    – let customers buy a PDF file that is password protected (admin has entered a password when saving on desktop)
    – let admin enter that password when creating a new product with the PDF attached to the download.
    – that key will be printed onto the receipt and will be shown in his downloads history

    Reply

    1. Sander,

      EDD Core has a ‘Download Notes’ area when creating a download that will allow you to display content that is only shown on the purchase confirmation and email receipt.

      You could just put the password into this field and when people complete the purchase they’ll have access to it immediately via the purchase confirmation or via the ‘View Downloads and Details’ link in the purchase history.

      Reply

  9. Hello,
    I’m just wondering whether it’s possible to trigger the “create license” API command from a payment vendor such as PayPal or FastSpring. That is, when the user purchases the software, the vendor is configured to trigger an action (such as posting the new order information). This would in-turn create the license in EDD Software Licensing.
    Thank you!

    Reply

    1. Mike,

      The built in EDD Software Licensing API does not have a write endpoint like that. It is possible to do, but you’d have to custom build an endpoint to listen for the license creation call then have your custom code fire off the license creation process.

      Reply

  10. […] is a challenge that actually hits my own site pretty heavily as I write on things ranging from interacting with APIs all the way through how life changing working in open source can become. If you aren’t […]

    Reply

  11. Have you done something with the API to connect to WHMCS to do trouble tickets and client creations?

    Reply

  12. Hi Chris,

    how to make the code work if the store is under maintenance ?

    In particular, if yoursite.com is in maintenance mode:
    https://yoursite.com/?edd_action=get_version&item_id=%5BITEM_ID%5D&license=%5Bvalid license key here]&url=[client url here] WORKS FINE
    https://yoursite.com/ck-eddsl-api?ck-eddsl-license-key=%5Bvalid license key here] DOESN’T WORKS (503 Service Unavailable)

    Reply

    1. Chris Klosowski October 31, 2018 at 1:37 pm

      This depends on what type of maintenance mode you are using. A 503 is returned by your server as unavailable. If this is the WordPress maintenance mode during updates, then there isn’t away around this until maintenance mode is removed.

      If you are using a plugin, then you’d need to find a way to allow that plugin to bypass maintenance mode to continue.

      Reply

  13. Running into some issues storing the appropriate transients and outputting a message in the front-end (when a key is anything but “valid”). My code is somewhat similar to what you’ve got going on, but not exactly the same. I’m stuck and sort of out of options (spinning my wheels over here). Any way I can hire you to take a look at my setup? Happy to share more info if you’re interested. Thanks Chris!

    Reply

  14. cost tadalafil generic tadalafil cvs c-tadalafil

    Reply

  15. Доброго времени суток дамы и господа
    Новости Поздравляем Вас с Весенним праздником 8 марта!Дорогие наши женщины! От всей души мы поздравляем Вас с Международным женским Днем! Желаем Вам здоровья, весеннего настроения, душевного тепла, семейной гармонии и благополучия! Пусть Ваша жизнь будет наполнена счастьем и любовью! Коллектив компании “БурТехСервис”.
    07.03.2021г.
    Поздравляем Вас с Днем защитника Отечества!
    Уважаемые заказчики, партнеры, коллеги, сотрудники! Компания “БурТехСервис” желает Вам здоровья, благополучия, счастья Вам и Вашим близким, уверенности в завтрашнем дне, твердости духа и неиссякаемой энергии!
    21.02.2021г.
    С Новым Годом и Рождеством!
    Компания “БурТехСервис” поздравляет вас от всей души с Новым Годом и Рождеством! Поздравляем наших дорогих заказчиков, партнеров компании, весь наш дружный коллектив, всех кто был рядом с нами и трудился бок о бок, с наступающим 2020 Новым Годом и Рождеством. Пусть этот год принесет нашим семьям много добра, счастья и благополучия. Пусть сбудутся все задуманное в Новом году, а все невзгоды останутся в прошлом. Примите от нас наше искреннее Новогоднее поздравление!
    24.12.2020г.
    Поздравляем с Днем Победы!
    Компания “БурТехСервис” поздравляет вас С Днем Победы! Этот праздник с каждым годом всё дальше от нас. Но мы никогда не забудем о тех героических поступках, которые совершили наши предки во имя нашей свободы, чести и счастливой жизни. В этот праздник хочется в первую очередь пожелать мира. Ведь ничто не стоит дороже, чем человеческие жизни, слезы матерей, сломанные судьбы огромного количества людей. Пусть эта победа вдохновляет только на хорошие поступки, любовь к Родине. Пусть никто и никогда не увидит войны.
    09.05.2020г.
    Поздравляем с праздником Светлой Пасхи!
    Поздравляем от всей души со светлым весенним христианским великим праздником Пасхи! Пусть Божья благодать и благословение снизойдёт на Ваш дом и Вашу семью, пусть дарует Вам Господь крепкое здоровье и долгие годы активной насыщенной радостными событиями жизни, пусть всегда Вас окружают добрые и отзывчивые люди. Будьте хранимы Богом, любимы и счастливы! С Уважением, Компания “БурТехСервис”

    Reply

  16. Здравствуйте господа
    Отзывы по бурению и обустройству скважин Алексей Скважина бурилась в д. Новоселье Минской области. Все работы выполнялись на профессиональном уровне, в то же время оперативно. Выражаю огромную благодарность бригаде бурильщиков и вашей компании, что так все организовали. Если спросят, обязательно посоветую вас своим родственникам и знакомым.
    26.11.2019г.
    Ирина
    Огромное спасибо бригаде Е. Дубовика за проделанную работу. Пробурили скважину в поселке Дружный (Минская область, пос. Дружный, ул. Мира, дом 6). Нареканий нет. Всем довольны.
    30.08.2019г.
    Дмитрий, д. Копище
    Бурение нашей скважины выполнено со знанием дела, обустройство на адаптер проведено аккуратно. Спасибо буровой бригаде БурТехСервис за их опытность и мастерство во главе с Дубовиком Е.В.
    21.08.2019г.
    Елена
    Здравствуйте. Пару месяцев назад обращалась сюда по поводу бурения на воду. Специалисты здесь очень вежливые, а главное со знанием дела ответили на мои вопросы. Теперь мы занялись обустройством скважины, обратились сюда же. Все отлично, кессон установлен, работает исправно. Радует, что гарантию здесь выдают не на год, а на целых 5 лет. Спасибо БурТехСервис, что не разочаровываете. Я вас уже порекомендовала своим родственникам. Советский район, ул. Сурганова, д.18.
    25.06.2019г.
    Юрий
    Добрый день. В этом месяце-апреле решил обратиться в компанию “БурТехСервис” за скважиной и обустройством к ней. Нахожусь в деревне Осово, что в Солигорске. Пробурили за несколько часов. Работают аккуратно и со знанием технологического процесса. На свои вопросы получил внятные ответы. Оборудование на мой участок все поместилось. Никаких проблем не возникло с въездом и выездом. Сегодня выполнено обустройство скважины. Поставили кессон, гидроаккумулятор, и вот летний поливочный кран. Работа спорилась. Пообщался с ребятами. Рекомендую воспользоваться услугами данной компании “БурТехСервис”, ответили на мои вопросы, дали рекомендации относительно крана. Желаю вам побольше пробурить земельных участков! Спасибо.
    25.04.2019г.
    Сергей
    Понравилось сотрудничество с вашей компанией. Решил и я написать отзыв. Ребята хорошо организованные. Знают свою работу. По моей скважине все выполнено по договору в срок. Результат работы – чистая вода. Обустроили тоже аккуратно. В скором времени планирую обратиться сюда за канализацией. От себя лично ребятам желаю крепкого здоровья и процветания.
    11.04.2019г.
    Михаил
    Выражаю благодарность по бурению скважины. Уложились в 2 дня. Сделали мне небольшую скидку на кессон при обустройстве, что приятно. Спасибо.
    01.04.2019г.
    Людмила
    И я хочу выразить благодарность сотрудникам компании БурТехСервис. Обратился сюда по совету своего соседа. Евгений и его бригада толковые парни. Пробурили и обустроили мне скважину. Сразу ясно, не первый год работают. Понравилась увлеченность ребят своим делом, молодые, крепкие. Так держать! Успехов в вашей непростой профессии.
    15.02.2019г.
    Кирилл
    Задумали отмечать Новый год на даче в кругу семьи. Имеющаяся скважина была старая, воды почти не было. Поэтому в срочном порядке пришлось обращаться за услугой по бурению новой скважины. Выбрал компанию “БурТехСервис”. Дом у нас в деревне Молоди. Очень доволен оперативной работой, даже раньше запланированного. Спасли нам Новый год. Сегодня 30 декабря 2018 года, и мы сможем отметить Новый год на даче, со всеми удобствами, а главное – водой. Спасибо!
    30.12.2018г.
    Сергей
    Хочу положительно отметить специалистов компании БурТехСервис, организовали и провели бурение скважины д. Валерьяново. Бригада Евгения настоящие мастера своего дела. Очень рад, что сделал правильный выбор, обратившись в эту компанию. Обращайтесь в БурТехСервис. Канализацию тут собираюсь устанавливать. Уже знаю, куда буду звонить). Удачи и спасибо.
    17.12.2018г.
    Дмитрий
    Встал вопрос обустройства скважины, воды. Обратился в “БурТехСервис”. Ребята все сделали качественно, в срок. На высшем уровне. Приятный сервис. Оценил дельные советы по эксплуатации моей скважины. Спасибо. Претензий ни каких не имею. Вода получилась чистая, без запаха, без всего, буду советовать друзьям и сам обращаться в случае чего.
    24.09.2018г.
    Сергей
    Хочу сказать спасибо компании за скважину. Рекомендую, цены адекватные, качество на высоте, самое то! ?? В планах по весне обустройство. Сергей, из деревни Мядель.
    24.10.2018г.
    Владислав
    Выбрали БурТехСервис. По телефону оператор объяснил, как будет все происходить, договорились, назначили время. В назначенное время приехала бригада. Подготовили все для бурения, соорудили скважину.Сработали четко без заминки. Через день договорились обустроить скважину. Все прошло замечательно. Ребята работали почти без перерывов. Обустройство велось в самый короткий день года-22 декабря, кроме того шел дождь.Работать было непросто. Спасибо им за самоотверженный труд.
    23.12.2018г.
    Елена
    Бурили скважину и устанавливали кессон в декабре 2019 года, Минск,Березово. Цену и срок выполнения заранее оговорили. Все работает исправно. Пока что скважина используется мало – завершаем строительство дома.
    28.12.2018г.
    Юрий
    Пробурили и оснастили скважину. Участок у нас уже обжитый, поэтому прошло без проблем. Бригада сработала профессионально. Разговоры только по делу. По поводу эксплуатации объяснили, дали пару советов. Ребята настроены доброжелательно. Спасибо за сотрудничество.Обращайтесь, не сомневайтесь, все покажут и расскажут!
    15.02.2018г.
    Сергей
    Заказал обустройство скважины в БурТехСервис. Спасибо Вам, ребята. Работа проделана великолепно, цены на материалы и само обустройство порадовали. Оказались даже ниже, чем у других компаний.
    18.03.2018г.
    Игорь
    У меня появилась проблема со скважиной – стало мало воды. Созвонился, приехали в удобное для меня время. Работа заняла всего пару часов. Теперь вода подается без проблем. Спасибо!
    02.04.2018г.
    Людмила
    Хочу поблагодарить компанию БурТехСервис за организацию бурения и обустройства на нашем участке в Ромашково. Весной обязательно обратимся за канализацией. Все сделано хорошо, ребята постарались. Спасибо.
    05.05.2018г.
    Анна
    Добрый день! Буквально на днях нам пробурили скважину специалисты данной компании. Результат превзошел все ожидания. Качество, грамотность. Очень вежливые сотрудники и рабочие. Спасибо вам!
    30.05.2018г.
    Сергей, Анастасия
    Благодарим бригаду с Евгением во главе за качественную работы, внимательность к деталям. Мы заказывали на 10 июля 2018 г. обустройство скважины. Только положительные эмоции от сотрудничества. Анастасия, Сергей, Московский р-н.
    17.07.2018г.
    Дмитрий
    День добрый. Хочу сказать спасибо компании БурТехСервис и лично Евгению. Обустроили мне скважину с кессоном в д.Богатырево. Работа проделана прекрасно. Цены приемлемые. Рекомендую!
    23.07.2018г.

    Reply

Leave a reply

Your email address will not be published. Required fields are marked *