WordPress Plugin

Accept cryptocurrency payments on any WordPress site, no WooCommerce required. Drop a pay button anywhere with a shortcode; customers pick a coin and are redirected to a hosted payment page. Funds go straight to your wallet, GriffNode never holds them.

Requires WordPress 6.0+ and PHP 7.4+. Running a WooCommerce store? Use the dedicated WooCommerce plugin instead, it hooks straight into checkout and orders.

Step 1, Download the plugin

Download the latest griffnode-payments.zip from the GitHub releases page.

Step 2, Install in WordPress

  1. In your WordPress admin go to Plugins → Add New → Upload Plugin.
  2. Choose the downloaded ZIP and click Install Now.
  3. Click Activate Plugin.

Step 3, Configure

  1. Go to Settings → GriffNode.
  2. Fill in the required fields:
FieldWhere to find it
Publishable Key Dashboard → API Integration → Publishable key (pk_live_...). Safe to expose in the browser.
Secret Key Dashboard → API Integration → Secret key (sk_live_...). Keep this private, used server-side to create transactions.
Webhook Secret Dashboard → Webhooks → your endpoint's signing secret. Used to verify that incoming payment events are genuinely from GriffNode.
Default Currency Fiat used when a shortcode doesn't set one (USD, PLN, EUR, GBP).

Step 4, Register your webhook

In your GriffNode dashboard go to Webhooks and add the URL shown on the plugin settings page:

Webhook URL
https://yoursite.com/wp-json/griffnode/v1/webhook

Subscribe to these events: payment.completed, payment.partial, payment.expired.

Copy the signing secret into the Webhook Secret field in the plugin settings.

Step 5, Add wallets

The coin selector only shows cryptos you have wallets configured for. Go to Dashboard → Wallet Management and add an xpub for each coin you want to accept. The selector updates automatically.

Adding a pay button

Put the shortcode in any post, page, or widget:

Shortcode
[griffnode_button amount="49.99" currency="USD" button_text="Pay with Crypto"]
AttributeRequiredDescription
amountYesPrice in fiat (e.g. 49.99)
currency—USD (default from settings), PLN, EUR, GBP
crypto—Lock the button to one coin (e.g. BTC); omit to let the customer choose
button_text—Button label (default Pay with Crypto)
reference—Your order/reference id, echoed back in every webhook as order_id
email—Pre-fill the customer email on the payment page
success_url—Where to send the customer after a confirmed payment. We add ?transaction_id=; confirm it server-side with GET /transactions/{id} before fulfilling, since anyone can open this URL
cancel_url—Where to send the customer on expiry/cancel
The amount and currency are signed server-side, so a customer can't tamper with the price in the browser.

Reacting to payments (for developers)

When a verified webhook arrives, the plugin fires WordPress actions. Hook into them from your theme's functions.php or your own plugin to fulfil orders, grant access, send emails, etc.

PHP
add_action( 'griffnode_payment_completed', function ( $event ) {
    // $event['order_id']       — your `reference` from the shortcode
    // $event['transaction_id'] — GriffNode transaction id
    // $event['amount_crypto'], $event['currency_crypto'], ...
    error_log( 'Paid: ' . $event['order_id'] );
} );

add_action( 'griffnode_payment_partial', function ( $event ) { /* underpaid */ } );
add_action( 'griffnode_payment_expired', function ( $event ) { /* window expired */ } );

// Or catch everything:
add_action( 'griffnode_webhook', function ( $event ) { /* $event['event'] = 'payment.completed' ... */ } );

Only HMAC-verified events reach these hooks.

How it works

Customer clicks the button
Selects a cryptocurrency (or it's locked to one) and clicks pay
Redirected to payment page
The plugin calls the API server-side (your secret key never touches the browser) and shows a 60-minute payment window
Payment confirmed
GriffNode fires a webhook, the plugin verifies it and triggers your action hooks

Test mode

You can use your pk_test_... and sk_test_... keys in the plugin settings to keep production credentials out of staging sites. Note: sandbox keys currently run against the live API, so transactions they create are real, test with small amounts or let test orders expire. See Test Mode →

Having trouble? Open a support ticket in your dashboard or check the GitHub repository for known issues.