Search code examples
phppayment-gatewaypaymentflutterwave

How to get the ascii key sort of rave parameters in php


Ravepay documentation (https://flutterwavedevelopers.readme.io/docs/checksum) shows how to hash values using Nodejs, but I am having issues generating the correct sort order of my getpaidSetup keys, how can I do that in php.

Currently this is my implementation:

// In php
$amount_in_naira = $_POST['total'] * 400;
$customer_email = $_POST['email'];
$customer_firstname = $_POST['fullname'];
$txref = 'EX' . '_' . get_current_user_id() . '_' . time();
$integity_str = $pb_key . $amount_in_naira . $customer_email . $txref . $sc_key;
$hash = hash( 'sha256', $integity_str );

// JS
var options = {
    PBFPubKey: '<?php echo $pb_key; ?>',
    amount: <?php echo $amount_in_naira; ?>,
    customer_email: '<?php echo $customer_email; ?>',
    customer_firstname: '<?php echo $customer_firstname; ?>',
    txref: '<?php echo $txref; ?>',
    integity_hash: '<?php echo hash( 'sha256', $integity_str ); ?>',
    meta: [{ metaname: 'merchant_details', metavalue: '<?php echo $metadata; ?>' }],
    onclose: function() {},
    callback: function(res) {
        console.log(res);
    },
}

Update:

From GentlemanMax's answer on ksort, I ran a ksort on an array and compared it to the Javascript equivalent result from object.keys({payload}).sort() and results match, see a sample script below showing how to sort by ASCII using Ksort.

$pb_key = "FLWPUBK-7adb6177bd71dd43c2efa3f1229e3b7f-X";

$amount_in_naira = 900;

$customer_email = "[email protected]";

$customer_firstname = "user";

$customer_lastname = "example";

$txref = "MV-1838383-JH";

$pmethod = "both";

$options = array(
    "PBFPubKey" => $pb_key,
    "amount" => $amount_in_naira,
    "customer_email" => $customer_email,
    "customer_firstname" => $customer_firstname,
    "txref" => $txref,
    "payment_method" => $pmethod,
    "customer_lastname" => $customer_lastname
);


ksort($options);

var_dump($options);

$hashedPayload = '';

foreach($options as $key => $value){

    $hashedPayload .= $value;
}

$hash = hash('sha256', $hashedPayload);


echo "$hashedPayload\n";

echo "$hash";

Solution

  • ksort() in PHP will do something similar to Object.keys({object}).sort() in js. The most notable difference is that ksort() does an "in place" sort of the array.

    Assuming that the fields in your code are the only ones you are using, this will do what you are looking for:

    $options = array(
        'PBFPubKey' => $pb_key,
        'amount' => $amount_in_naira,
        'customer_email' => $customer_email,
        'customer_firstname' => $customer_firstname,
        'txref' => $txref,
    );
    ksort($options);
    $hashedPayload = '';
    foreach($options as $option){
        $hashedPayload += $option;
    }
    

    $hashedPayload now contains a string (unhashed) in the correct order for hashing. It looks like you just need to do a sha256 hash of the string at this point. Let me know if you need help with that part.