How to use Cyberpanel API in Wordpress?

I need to connect the API of my hosting panel to the login of my wordpress website. The link to the external API is CyberPanel API · Apiary. I know how to get the authorization key. I just dont know where to place the code at in wordpress for the execution of creating a user.

I need the user to be created in the Cyberpanel database when they create a user at https://supernovadatacentre.com/my-account/. Thank you.

Hello @trighaps Happy you are here

Kindly look at this video curated for this purpose - How to use CyberPanel API - YouTube

Oh I have. What im doing is a million times more complicated than that.

<?php
/**
 * Login Form
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/myaccount/form-login.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates
 * @version 7.0.1
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

do_action( 'woocommerce_before_customer_login_form' ); ?>

<?php if ( 'yes' === get_option( 'woocommerce_enable_myaccount_registration' ) ) : ?>

<div class="u-columns col2-set" id="customer_login">

	<div class="u-column1 col-1">

<?php endif; ?>

		<h2><?php esc_html_e( 'Login', 'woocommerce' ); ?></h2>

		<form class="woocommerce-form woocommerce-form-login login" method="post">

			<?php do_action( 'woocommerce_login_form_start' ); ?>

			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="username"><?php esc_html_e( 'Username or email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
			</p>
			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="current-password" />
			</p>

			<?php do_action( 'woocommerce_login_form' ); ?>

			<p class="form-row">
				<label class="woocommerce-form__label woocommerce-form__label-for-checkbox woocommerce-form-login__rememberme">
					<input class="woocommerce-form__input woocommerce-form__input-checkbox" name="rememberme" type="checkbox" id="rememberme" value="forever" /> <span><?php esc_html_e( 'Remember me', 'woocommerce' ); ?></span>
				</label>
				<?php wp_nonce_field( 'woocommerce-login', 'woocommerce-login-nonce' ); ?>
				<button type="submit" class="woocommerce-button button woocommerce-form-login__submit<?php echo esc_attr( wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '' ); ?>" name="login" value="<?php esc_attr_e( 'Log in', 'woocommerce' ); ?>"><?php esc_html_e( 'Log in', 'woocommerce' ); ?></button>
			</p>
			<p class="woocommerce-LostPassword lost_password">
				<a href="<?php echo esc_url( wp_lostpassword_url() ); ?>"><?php esc_html_e( 'Lost your password?', 'woocommerce' ); ?></a>
			</p>

			<?php do_action( 'woocommerce_login_form_end' ); ?>

		</form>

<?php if ( 'yes' === get_option( 'woocommerce_enable_myaccount_registration' ) ) : ?>

	</div>

	<div class="u-column2 col-2">

		<h2><?php esc_html_e( 'Register', 'woocommerce' ); ?></h2>

		<form method="post" class="woocommerce-form woocommerce-form-register register" <?php do_action( 'woocommerce_register_form_tag' ); ?> >

			<?php do_action( 'woocommerce_register_form_start' ); ?>

			<?php if ( 'no' === get_option( 'woocommerce_registration_generate_username' ) ) : ?>

				<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
					<label for="reg_username"><?php esc_html_e( 'Username', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
					<input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="reg_username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
				</p>

			<?php endif; ?>

			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="reg_email"><?php esc_html_e( 'Email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="email" value="<?php echo ( ! empty( $_POST['email'] ) ) ? esc_attr( wp_unslash( $_POST['email'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
			</p>

			<?php if ( 'no' === get_option( 'woocommerce_registration_generate_password' ) ) : ?>

				<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
					<label for="reg_password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
					<input type="password" class="woocommerce-Input woocommerce-Input--text input-text" name="password" id="reg_password" autocomplete="new-password" />
				</p>

			<?php else : ?>

				<p><?php esc_html_e( 'A link to set a new password will be sent to your email address.', 'woocommerce' ); ?></p>

			<?php endif; ?>

			<?php do_action( 'woocommerce_register_form' ); ?>

			<p class="woocommerce-form-row form-row">
				<?php wp_nonce_field( 'woocommerce-register', 'woocommerce-register-nonce' ); ?>
				<button type="submit" class="woocommerce-Button woocommerce-button button<?php echo esc_attr( wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '' ); ?> woocommerce-form-register__submit" name="register" value="<?php esc_attr_e( 'Register', 'woocommerce' ); ?>"><?php esc_html_e( 'Register', 'woocommerce' ); ?></button>
			</p>

		<?php do_action( 'woocommerce_register_form_end' ); ?>
		</form>
	</div>

</div>
<?php endif; ?>

<?php do_action( 'woocommerce_after_customer_login_form' ); ?>
<?php

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://cp.supernovadatacentre.com',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
	"serverUserName": "admin",
	"controller": "submitUserCreation",
    "email": "email" ,
    "userName": "username,
    "password": "password",
    "websitesLimit":1,
    "selectedACL": "user"
}',
  CURLOPT_HTTPHEADER => array(
    'Authorization: Basic secret(changed in production code)'
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
?>

Kindly explain what your code does seems like you are creating a cyberpanel user after customer login on woocommerce. What issue are you getting

RIght now Im getting a CSRF error.

Heres my updated code (without API token)

<?php
/**
 * Login Form
 *
 * This template can be overridden by copying it to yourtheme/woocommerce/myaccount/form-login.php.
 *
 * HOWEVER, on occasion WooCommerce will need to update template files and you
 * (the theme developer) will need to copy the new files to your theme to
 * maintain compatibility. We try to do this as little as possible, but it does
 * happen. When this occurs the version of the template file will be bumped and
 * the readme will list any important changes.
 *
 * @see     https://docs.woocommerce.com/document/template-structure/
 * @package WooCommerce\Templates
 * @version 7.0.1
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit; // Exit if accessed directly.
}

do_action( 'woocommerce_before_customer_login_form' ); ?>

<?php if ( 'yes' === get_option( 'woocommerce_enable_myaccount_registration' ) ) : ?>

<div class="u-columns col2-set" id="customer_login">

	<div class="u-column1 col-1">

<?php endif; ?>

		<h2><?php esc_html_e( 'Login', 'woocommerce' ); ?></h2>

		<form class="woocommerce-form woocommerce-form-login login" method="post">

			<?php do_action( 'woocommerce_login_form_start' ); ?>

			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="username"><?php esc_html_e( 'Username or email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
			</p>
			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="current-password" />
			</p>

			<?php do_action( 'woocommerce_login_form' ); ?>

			<p class="form-row">
				<label class="woocommerce-form__label woocommerce-form__label-for-checkbox woocommerce-form-login__rememberme">
					<input class="woocommerce-form__input woocommerce-form__input-checkbox" name="rememberme" type="checkbox" id="rememberme" value="forever" /> <span><?php esc_html_e( 'Remember me', 'woocommerce' ); ?></span>
				</label>
				<?php wp_nonce_field( 'woocommerce-login', 'woocommerce-login-nonce' ); ?>
				<button type="submit" class="woocommerce-button button woocommerce-form-login__submit<?php echo esc_attr( wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '' ); ?>" name="login" value="<?php esc_attr_e( 'Log in', 'woocommerce' ); ?>"><?php esc_html_e( 'Log in', 'woocommerce' ); ?></button>
			</p>
			<p class="woocommerce-LostPassword lost_password">
				<a href="<?php echo esc_url( wp_lostpassword_url() ); ?>"><?php esc_html_e( 'Lost your password?', 'woocommerce' ); ?></a>
			</p>

			<?php do_action( 'woocommerce_login_form_end' ); ?>

		</form>

<?php if ( 'yes' === get_option( 'woocommerce_enable_myaccount_registration' ) ) : ?>

	</div>

	<div class="u-column2 col-2">

		<h2><?php esc_html_e( 'Register', 'woocommerce' ); ?></h2>

		<form method="post" class="woocommerce-form woocommerce-form-register register" <?php do_action( 'woocommerce_register_form_tag' ); ?> >

			<?php do_action( 'woocommerce_register_form_start' ); ?>

			<?php if ( 'no' === get_option( 'woocommerce_registration_generate_username' ) ) : ?>

				<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
					<label for="reg_username"><?php esc_html_e( 'Username', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
					<input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="reg_username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
				</p>

			<?php endif; ?>

			<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
				<label for="reg_email"><?php esc_html_e( 'Email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
				<input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="email" value="<?php echo ( ! empty( $_POST['email'] ) ) ? esc_attr( wp_unslash( $_POST['email'] ) ) : ''; ?>" /><?php // @codingStandardsIgnoreLine ?>
			</p>

			<?php if ( 'no' === get_option( 'woocommerce_registration_generate_password' ) ) : ?>

				<p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
					<label for="reg_password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
					<input type="password" class="woocommerce-Input woocommerce-Input--text input-text" name="password" id="reg_password" autocomplete="new-password" />
				</p>

			<?php else : ?>

				<p><?php esc_html_e( 'A link to set a new password will be sent to your email address.', 'woocommerce' ); ?></p>

			<?php endif; ?>

			<?php do_action( 'woocommerce_register_form' ); ?>

			<p class="woocommerce-form-row form-row">
				<?php wp_nonce_field( 'woocommerce-register', 'woocommerce-register-nonce' ); ?>
				<button type="submit" class="woocommerce-Button woocommerce-button button<?php echo esc_attr( wc_wp_theme_get_element_class_name( 'button' ) ? ' ' . wc_wp_theme_get_element_class_name( 'button' ) : '' ); ?> woocommerce-form-register__submit" name="register" value="<?php esc_attr_e( 'Register', 'woocommerce' ); ?>"><?php esc_html_e( 'Register', 'woocommerce' ); ?></button>
			</p>

		<?php do_action( 'woocommerce_register_form_end' ); ?>
		</form>
	</div>

</div>
<?php endif; ?>

<?php do_action( 'woocommerce_after_customer_login_form' ); ?>
// CSFR Token <?php
function apiPost($body,$username,$password,$url){
    $cpost = curl_init($url);
    curl_setopt($cpost, CURLOPT_URL,$url);
    curl_setopt($cpost, CURLOPT_RETURNTRANSFER,true);
    curl_setopt($cpost, CURLOPT_USERPWD,"$username:$password");
    curl_setopt($cpost, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    curl_setopt($cpost, CURLINFO_HEADER_OUT,true);
    $cookiePath = dirname(__FILE__).'/cookies.txt';

    curl_setopt($cpost, CURLOPT_COOKIEJAR, $cookiePath);
    curl_setopt($cpost, CURLOPT_COOKIEFILE,$cookiePath);//Set header to fetch token.
    $header = array('x-csrf-token: Fetch', 'Connection: keep-alive');
    curl_setopt($cpost, CURLOPT_HTTPHEADER, $header);
    $headers =[];//Read back response headers.
    curl_setopt($cpost, CURLOPT_HEADERFUNCTION,function($curl, $header)use(&$headers){
            $len = strlen($header);
            array_push($headers,strtolower($header));return $len;});//Execute and close curl.
    $result = curl_exec($cpost);//Retrieve token, cookies and set header.
    $token ='secret';
    foreach($headers as $h){
        if(strpos($h,'x-csrf-token:')!==false){
            list(,$token)= explode(': ', $h);
            $token = trim(preg_replace('/\s\s+/','', $token));
        }
    }

    $header = array('x-csrf-token: '.$token, 'Connection: keep-alive');
    curl_setopt($cpost, CURLOPT_POST,true);
    curl_setopt($cpost, CURLOPT_HTTPHEADER, $header);
    curl_setopt($cpost, CURLINFO_HEADER_OUT,true);
    curl_setopt($cpost, CURLOPT_POSTFIELDS, $body);
    curl_setopt($cpost, CURLOPT_COOKIEJAR, $cookiePath);
    curl_setopt($cpost, CURLOPT_COOKIEFILE,$cookiePath);

    $result = curl_exec($cpost);
    $information = curl_getinfo($cpost);
    curl_close($cpost);return simplexml_load_string($result);
}
?>
// Cyberpanel API
<?php

$curl = curl_init();

curl_setopt_array($curl, array(	
  CURLOPT_URL => 'https://cp.supernovadatacentre.com/',
  CURLOPT_REFERER => 'https://supernovadatacentre.com/my-account/',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
	"serverUserName": "admin",
	"controller": "submitUserCreation",
    "email": "email" ,
    "userName": "username,
    "password": "password",
    "websitesLimit":1,
    "selectedACL": "user"
}',
  CURLOPT_HTTPHEADER => array(
    $token = 'secret',
  ),
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
?>

Also am I doing the

CURLOPT_URL => 'https://cp.supernovadatacentre.com/',
  CURLOPT_REFERER => 'https://supernovadatacentre.com/my-account/',

Correctly?

And is this how you correctly inherit the “email”, “username” and “password” variables from woocomerse?

CURLOPT_POSTFIELDS =>'{
	"serverUserName": "admin",
	"controller": "submitUserCreation",
    "email": "email" ,
    "userName": "username,
    "password": "password",
    "websitesLimit":1,
    "selectedACL": "user"
}',

The underlying issue is the code is not creating the user in my cyberpanel.

Have you enabled API for that user you are getting the token from on CyberPanel Admin Panel?

I have yes.

image

Why in the test does it have url/cloudAPI? I do not have a /cloudAPI folder in my server.

Kindly follow the instructions as detailed in the documentation:

You need to leverage the api using the URL https://SERVER_URL:8090/cloudAPI/ or if you removed port 8090 https://staging.cyberpanel.net/cloudAPI/

I have done a test and everything works.

Here is the issue assuming curl also works on your server

No follow the guidelines as stipulated here to create a user.CyberPanel Cloud API

Why am I using https://staging.cyberpanel.net/cloudAPI/ ? That is not my domain? Does that matter?

Kindly watch the video @usmannasir explains very well that you need to use your own cyberpanel admin panel url. That is why you are enabling API access for the admin user on your own server/cyberpanel admin panel.

That said a quick answer - use https://cp.supernovadatacentre.com/cloudAPI/ assuming you can access your cyberpanel admin panel here https://cp.supernovadatacentre.com


Im using https://cp.supernovadatacentre.com/cloudAPI/
and yes I can access the admin panel from that url.
And yes I did double triple check im using the correct input for basic auth.
And yes I have enabled API for user “admin”

I do not have a cloud account, im hosting on premises. Could that be the reason?

No. CSRF issue is occuring becuase you are not generating the token properly. where is the code that generates the token?

I pulled the api key from the phpmyadmin. It needs to be where? Also if I get it to work in postman, how do I port it to the woocommerce plugin?

He said we could use the token from phpmyadmin > search admin > loginSystemAdministrator.

Im looking for the place to put the code to run it to create a token in postman. Do I run a test? Do I throw that code in my woocomerse plugin? Im a bit confused.

Good just tested it works with that.

Generating a base64 token for yourself will work like this for php:

<?php
$admin_user = 'admin';
$admin_password='somecomplexpassword';
$str = $admin_user. ":". $admin_password;
echo base64_encode($str);
?>

Okay got it. So im getting this when I run a test.