Introduction

The Instant Payment Notifications system will send POST data to your website when you receive a payment to your callback address or invoice and when the payment status is changed: pending, complete.

Your application must return response 200 status otherwise, it retries 9 more times every 5 minutes.

IPN Verification

To verify that an IPN is sent from AnonWallet, you must set an IPN Secret that can be a secret word chosen by you.
The IPN Secret can be set up in the Account -> Security -> Configure IPN

Your IPN Secret is used to generate an HMAC signature of the internal transaction-id and your IPN Secret.

You can verify the received HMAC signature with the below function code:

hash_hmac("sha512", $_POST['internal_txId'], $ipn_secret)

IP Address Whitelist

We recommend whitelisting our server IPs from where the IPN is sent. Regularly check those IPs, they can be updated anytime.

162.0.235.233
162.0.235.235

IPN POST Fields

NameValue
status1 - Pending Payment (Detected in the blockchain)
2 - Complete Payment (Received and allocated to your account)
3 - Underpaid Payment (The amount received is less than the invoice amount requested)
4 - Overpaid Payment (The amount received is higher than the invoice amount requested, it can be considered as a complete payment)
internal_txIdID of the transaction from AnonWallet system
txIdThe TX ID (Transaction ID) from the blockchain
addressThe address where the payment was received
coin_abbreviationThe abbreviation of the cryptocurrency the payment was made for (example: BTC, LTC, DOGE)
coin_nameThe cryptocurrency name the payment was made for (example: Bitcoin, Litecoin, Dogecoin)
net_amountThe amount that is credited to the merchant account after subtracting the processing fee
payment_amountThe amount paid by the shopper to the callback address
fee_deductedThe fee deducted by AnonWallet
labelThe address label if you have one set up, if not, NULL is returned
auto_forwardTRUE if the callback address has an auto-forward address set up, FALSE if not
forward_addressThe forwarded address set by you, if not set up, NULL is returned
hmacThe hmac signature formatted from the internal_txId and merchant ipn_secret
*invoice_amountThe amount specified on the invoice when it was created (Recommended to check if matches with the payment_amount received on the callback address)
*invoice_idThe external ID specified by merchant when the invoice was created

🚧

** invoice_amount, invoice_id

Invoice POST fields are sent with the IPN if create_invoice method was used

Code Example

<?php
 //Fill it with your ipn secret set up on your AnonWallet.Net account
 $ipn_secret = '';
 $request_ip = $_SERVER['REMOTE_ADDR'];

 $allowed_ips = [162.0.235.233, 162.0.235.235];

 //Verify the IP from who comes the post request
 if(!in_array($request_ip, $allowed_ips)) {
   die('Request IP is not allowed');
 }

 if(!isset($_POST['hmac'])) {
 	die('No HMAC signature sent');
 }

 $received_hmac = $_POST['hmac'];

 //Generate hmac signature
 $hmac = hash_hmac("sha512", $_POST['internal_txId'], $ipn_secret);
 //Verify the hash signature match (PHP 5.6.0 or above)
 if(!hash_equals($hmac, $received_hmac)) {
   errorAndDie('HMAC signature does not match');
 }

 $status = $_POST['status'];
 $internal_txId = $_POST['internal_txId'];
 $txId = $_POST['txId'];
 $address = $_POST['address'];
 $coin_abbr = $_POST['coin_abbreviation'];
 $coin_name = $_POST['coin_name'];
 $net_amount = $_POST['net_amount'];
 $payment_amount = $_POST['payment_amount'];
 $fee_deducted = $_POST['fee_deducted'];
 $label = $_POST['label'];
 $auto_forward = $_POST['auto_forward'];
 $forward_address = $_POST['forward_address'];
 
 if($status == 2 || $status == 4) {
 //Payment is complete, you can process it in your system 
 } else {
 //Payment is received, waiting for confirmations
 }
 die('IPN received OK');