I found what you mistaked.
$receipt = $_POST['purchase_data'];
$billInfo = json_decode($receipt,true);
...
$result = openssl_verify($billInfo, $signature, $key);
you verified decoded object with key. so it is always be failed.
try this and get success,
$result = openssl_verify($receipt, $signature, $key);
signature verify string(purchase_data) not decoded OBJECT.