Saturday, June 10, 2017

PayWay Rest API: Check if Rest API credentials are valid

PayWay Rest API is easy to implement. We need three information from PayWay end to create payment, refund payment, void payment, store credit card for further use and many other things.

So we need:
1. Publishable public key
2. Secret private key



3. and Merchant ID



Now you have all 3 information to communicate with PayWay.

Below is a PHP script to test credentials using rest API:


<?php
include_once "CurlExecutor.php";

define("BASE_URL", "https://api.payway.com.au/rest/v1");
define("MERCHANT_ID", "TEST");
define("PRIVATE_KEY", "T10487_SEC_...");
define("PUBLIC_KEY", "T10487_PUB_...");

$headers[] = "Authorization: Basic " . base64_encode(PUBLIC_KEY . ":");
$result = CurlExecutor::execute(BASE_URL, "GET", null, null, $headers);
$result["response"] = json_decode($result["response"]);
CurlExecutor::prettyPrint($result);
?>


If your credentials are fine below output will back from PayWay end:


Array
(
    [code] => 200
    [response] => stdClass Object
        (
            [clientNumber] => T52943
            [clientName] => Pritom
            [keyName] => T10487_PUB...bzq
            [links] => Array
                (
                    [0] => stdClass Object
                        (
                            [rel] => single-use-tokens
                            [href] => https://api.payway.com.au/rest/v1/single-use-tokens
                        )

                    [1] => stdClass Object
                        (
                            [rel] => surcharges
                            [href] => https://api.payway.com.au/rest/v1/surcharges
                        )

                    [2] => stdClass Object
                        (
                            [rel] => help
                            [href] => https://www.payway.com.au/docs/rest.html#resources
                        )

                )

        )

)
If you have error in your public key below output will be generated:


Array
(
    [code] => 401
    [response] => stdClass Object
        (
            [message] => The "Authorization" header contained an unknown API key. You must send your API key as the basic authentication username.
            [links] => Array
                (
                    [0] => stdClass Object
                        (
                            [rel] => help
                            [href] => https://www.payway.com.au/docs/rest.html#authentication
                        )

                )

        )

)


Friday, June 9, 2017

Lock wait timeout exceeded; try restarting transaction

Why is happening like this, some other thread is holding a record lock on some record (you're updating every record in the table!) for too long, and your thread is being timed out. That's why you got this error.

Your first step to lookup for which queries this problem happened.
Below are some queries to observe transaction status and other data:

show open tables where in_use > 0;
show processlist;
SELECT * FROM `information_schema`.`innodb_trx` ORDER BY `trx_started`;
SELECT * FROM `information_schema`.`innodb_locks`;
show variables like 'innodb_lock_wait_timeout';
show variables like '%wait_timeout%';

Above queries help you to find out why the problem occurs. 

Now you can check your database transaction isolation level in the mysql using following command:

SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;

I think all values are set to "REPEATABLE-READ" if you don't configured it yet.

Make sure the database tables are using InnoDB storage engine and READ-COMMITTED transaction isolation level.

Now you can set it to "READ-COMMITTED" for better performance using below command:

SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

If the the above configuration is correct then please try to increase the database server innodb_lock_wait_timeout variable to 500 (it's a random value, default value is 50).

Restart MySQL database service for the configuration to take place.

Modify MySQL startup options in the configuration file my.cnf (often named my.ini on Windows), so the transaction level is set to transaction-isolation = READ-COMMITTED.

And

innodb_lock_wait_timeout=500

If this not helps you much, you need and database administration as well as expert to troubleshoot the problem.





Saturday, June 3, 2017

PHP Tag Lib: PHP Custom Tag Library (TagLib)

We use tag in your HTML page such as "DIV", "H2", "P" etc in every moment in our life. Who used Grail's or Spring MVC he has knowledge on custom tag library. We can also use custom tag lib in PHP project. Below is a example of PHP custom tag lib usage:

<tglib:upper>Goes to upper</tglib:upper>

To drive output of this custom tag in PHP, you have to download and include tag lib library first from below link:

drive.google.com/PHP Tag Lib: PHP Custom Tag Library (TagLib)

We used tglib:upper in above script, so we have to make a directory in "TagLib" directory named "upper" with a function named "tglib___upper" that support $tag parameter. With will supply tag name as well as any attributes in that tag. 

Below is a sample example of "upper" tag:

function tglib___upper($tag)
{
    return strtoupper($tag['content']);
}


$tag["content"] contains body parts of the tag.

If you download and execute "tag1.php" file, below output will be generated:





jQuery Script: Remove next element by class name

Its very easy to remove next element by checking class is matches or not. You can also remove previous element as well as next element.

$(".base").prev(".search").remove();

<script src="3.2.1/jquery.min.js"></script>

<div class="base">ELEMENT 1</div>
<div class="will_not_remove">ELEMENT WILL NOT REMOVE</div>
<div class="remove">HAS CLASS "REMOVE" BUT WILL NOT REMOVE</div>
<div class="base">ELEMENT 2</div>
<div class="remove">ELEMENT WILL REMOVE</div>

<script type="text/javascript">
    $(".base").next(".remove").remove();
</script>



Sunday, May 28, 2017

PHP Script: Call Method Dynamically

PHP Script: Call Method Dynamically. Below is PHP Script which describes the full process:

<?php
$fnc = "canCall";
if (!is_callable($fnc)) {
    echo "Cant call method: $fnc <BR>";
} else {
    echo "Return from method $fnc: " . $fnc(15) . "<BR>";
}

$fnc = "canCall2";
if (!is_callable($fnc)) {
    echo "Cant call method: $fnc <BR>";
} else {
    echo "Return from method $fnc: " . $fnc(15) . "<BR>";
}

function canCall($a = 10)
{
    return $a * 5;
}

$caller_class = new CallerClass();
$caller_class->check();

class CallerClass
{
    private $for_method1 = 10;

    public function check()
    {
        $fnc = "method1";
        if (!is_callable(array(&$this, $fnc))) {
            echo "$fnc is not callable function";
        } else {
            $this->{"for_method1"} = 20;
            echo "Return from $fnc:" . $this->{$fnc}() . "<BR>";
        }

        $fnc = "method2";
        if (!is_callable(array(&$this, $fnc))) {
            echo "$fnc is not callable function";
        } else {
            echo "Return from $fnc:" . $this->{$fnc}() . "<BR>";
        }
    }

    public function method1()
    {
        return "From method 1 <$this->for_method1>";
    }
}

?>


Which will output as below:

Return from method canCall: 75
Cant call method: canCall2 
Return from method1:From method 1 <20>
method2 is not callable function

PHP Script: Define Variable Dynamically

PHP Script: Define Variable Dynamically. Its easy:

${"variable"} = "Variable defined dynamically";

echo $variable;


Will output:

Variable defined dynamically

And in class file (both static and instance scope):

SomeClass::test();
SomeClass::test2();

$class = new SomeClass();
$class->test3();

class SomeClass {
    static $xxx = null;

    static function test() {
        self::${"xxx"} = "Value";
    }

    static function test2() {
        echo self::${"xxx"} . "::" . self::$xxx;
    }

    function test3() {
        $this->{"yyyy"} = "Value of YYYY";
        echo "<BR>" . $this->yyyy;
    }
}

How to PHP call another page and get output as variable?

How to PHP call another page and get output as variable? it's easy. We can do it in two way. First way is processing via ob_... and second way is get content in a variable and execute eval function. 

Below is a PHP Script which will describes both way:


<?php
ob_start();
${"variable"} = array("as_array" => "Test variable value in array #Method 1");
require 'content.txt';
$output = ob_get_clean();
echo $output;

${"variable"} = array("as_array" => "Test variable value in array #Method 2");
$file = file_get_contents('content.txt');
$content = eval("?>$file");
echo $content;


Content of "content.txt" file below:

<div style="margin: 10px; border: 1px solid red; padding: 10px;">
    <h3>HI, Time = <?= date("d/m/Y h:i A") ?></h3>
    <h4><?= $variable["as_array"] ?></h4>
    <table>
        <tr>
            <td>TABLE > TR > TD</td>
        </tr>
    </table>
</div>


And output of above PHP Script below:


HI, Time = 28/05/2017 02:56 PM

Test variable value in array #Method 1

TABLE > TR > TD

HI, Time = 28/05/2017 02:56 PM

Test variable value in array #Method 2

TABLE > TR > TD