Recently I had to work with the WooCommerce REST API to do stuffs with products, mainly create / update it. However with its OAuth 1.0 authentication I couldn't get it just right. The REST API returned authentication error messages.
It was becoming difficult to get one source of information that accurately showed how to make a successful authentication to the WooCommerce REST API.
Finally, after a lot of digging I did manage to get it right and I am sharing it with whoever wants to use it in their systems.
<?php
function stramaxon_generate_oauth( $request ) {
$wc_rest_api = array(
'key' => '[YOUR_CONSUMER_KEY]',
'secret' => '[YOUR_CONSUMER_KEY]'
);
$consumerKey = $wc_rest_api['key'];
$signatureMethod = 'HMAC-SHA1';
$timestamp = time();
$nonce = md5(mt_rand());
$version = '1.0';
$oauthSignature = tsw_generateSignature( $request, $timestamp, $nonce, $signatureMethod, $version ) ;
// echo "Signature: " . $oauthSignature . "<br>";
return "OAuth oauth_consumer_key=\"{$consumerKey}\",oauth_signature_method=\"{$signatureMethod}\",oauth_timestamp=\"{$timestamp}\",oauth_nonce=\"{$nonce}\",oauth_version=\"1.0\",oauth_signature=\"{$oauthSignature}\"";
// return "OAuth oauth_consumer_key={$consumerKey},oauth_signature_method={$signatureMethod},oauth_timestamp={$timestamp},oauth_nonce={$nonce},oauth_version=1.0,oauth_signature={$oauthSignature}";
}
function stramaxon_generateSignature($request, $timestamp, $nonce, $signatureMethod, $version) {
$wc_rest_api = array(
'key' => '[YOUR_CONSUMER_KEY]',
'secret' => '[YOUR_CONSUMER_KEY]'
);
$base = $request['method'] . "&"
. rawurlencode( $request['url'] ) . "&"
. rawurlencode( "oauth_consumer_key=" . $wc_rest_api['key'] )
. rawurlencode( "&oauth_nonce=" . $nonce )
. rawurlencode( "&oauth_signature_method=" . $signatureMethod )
. rawurlencode( "&oauth_timestamp=" . $timestamp )
. rawurlencode( "&oauth_version=" . $version );
// . rawurlencode( '&' . http_build_query($request['data']) );
$key = rawurlencode($wc_rest_api['secret']) . '&';
$signature = base64_encode( hash_hmac('sha1', $base, $key, true) );
return $signature;
}
This is it basically. All you got to do is use the stramaxon_generate_oauth function to generate a OAuth 1.0 string to be used in your HTTP request. But you will notice we are passing a `$request` parameter in that function. It needs to contain an array with the following.
$request = array(
'method' => 'POST',
'url' => 'http://example.com/your-rest-api/endpoint/wc'
)
// Then form the request,
// Don't get confused by the wp_remote_post, it can be used with a traditional curl request as well
$api_url = 'http://example.com/your-rest-api/endpoint/wc';
$api_response = wp_remote_post( $api_url, array(
'method' => 'POST',
'headers' => array(
'Authorization' => stramaxon_generate_oauth( array( $request )),
'Content-Type' => 'application/json'
),
'body' => json_encode( $post_data )
) );