From f7c151f15c470a286b5f9e422fabeebd5b2f8c5e Mon Sep 17 00:00:00 2001 From: cnohall Date: Tue, 26 Nov 2024 17:36:36 +0900 Subject: [PATCH 1/6] Update: Update Blockonomics driver --- .../Blockonomics/Blockonomics.php | 40 +++++++++++++------ .../BlockonomicsPaymentDriver.php | 18 +++++++++ database/seeders/PaymentLibrariesSeeder.php | 6 ++- .../blockonomics/pay_livewire.blade.php | 5 +++ 4 files changed, 55 insertions(+), 14 deletions(-) diff --git a/app/PaymentDrivers/Blockonomics/Blockonomics.php b/app/PaymentDrivers/Blockonomics/Blockonomics.php index bc758d0941..69238838f3 100644 --- a/app/PaymentDrivers/Blockonomics/Blockonomics.php +++ b/app/PaymentDrivers/Blockonomics/Blockonomics.php @@ -47,24 +47,34 @@ class Blockonomics implements LivewireMethodInterface } - public function getBTCAddress(): string + public function getBTCAddress(): array { $api_key = $this->blockonomics->company_gateway->getConfigField('apiKey'); - // $params = config('ninja.environment') == 'development' ? '?reset=1' : ''; - $url = 'https://www.blockonomics.co/api/new_address'; - - $r = Http::withToken($api_key) - ->post($url, []); - - nlog($r->body()); - - if ($r->successful()) { - return $r->object()->address ?? 'Something went wrong'; + if (!$api_key) { + return ['success' => false, 'message' => 'Please enter a valid API key']; } - return $r->object()->message ?? 'Something went wrong'; + $url = 'https://www.blockonomics.co/api/new_address'; + $response = Http::withToken($api_key) + ->post($url, []); + + nlog($response->body()); + + if ($response->status() == 401) { + return ['success' => false, 'message' => 'API Key is incorrect']; + }; + + if ($response->successful()) { + if (isset($response->object()->address)) { + return ['success' => true, 'address' => $response->object()->address]; + } else { + return ['success' => false, 'message' => 'Address not returned']; + } + } else { + return ['success' => false, 'message' => $response->object()->message ?? 'Something went wrong']; + } } public function getBTCPrice() @@ -81,6 +91,10 @@ class Blockonomics implements LivewireMethodInterface $btc_price = $this->getBTCPrice(); $btc_address = $this->getBTCAddress(); + $data['error'] = null; + if (!$btc_address['success']) { + $data['error'] = $btc_address['message']; + } $fiat_amount = $data['total']['amount_with_fee']; $btc_amount = $fiat_amount / $btc_price; $_invoice = collect($this->blockonomics->payment_hash->data->invoices)->first(); @@ -89,7 +103,7 @@ class Blockonomics implements LivewireMethodInterface $data['amount'] = $fiat_amount; $data['currency'] = $this->blockonomics->client->getCurrencyCode(); $data['btc_amount'] = number_format($btc_amount, 10, '.', ''); - $data['btc_address'] = $btc_address; + $data['btc_address'] = $btc_address['address'] ?? ''; $data['btc_price'] = $btc_price; $data['invoice_number'] = $_invoice->invoice_number; diff --git a/app/PaymentDrivers/BlockonomicsPaymentDriver.php b/app/PaymentDrivers/BlockonomicsPaymentDriver.php index cad8b74711..dfa717f3f9 100644 --- a/app/PaymentDrivers/BlockonomicsPaymentDriver.php +++ b/app/PaymentDrivers/BlockonomicsPaymentDriver.php @@ -143,4 +143,22 @@ class BlockonomicsPaymentDriver extends BaseDriver $this->setPaymentMethod(GatewayType::CRYPTO); return $this->payment_method->refund($payment, $amount); //this is your custom implementation from here } + + public function auth(): bool + { + try { + // TODO: Add check /api/new_address?reset=1 to see if the API key is valid + $this->company_gateway->getConfigField('apiKey'); + $url = $this->NEW_ADDRESS_URL . '?reset=1'; + $response = Http::withToken($api_key) + ->post($url, []); + if($response->successful()) { + return true; + } + return false; + } catch (\Exception $e) { + return false; + } + return false; + } } diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index edd1d050ef..ff5d7b6a2b 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -17,6 +17,7 @@ use App\Models\GatewayType; use App\Utils\Ninja; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Seeder; +use Illuminate\Support\Str; class PaymentLibrariesSeeder extends Seeder { @@ -24,6 +25,9 @@ class PaymentLibrariesSeeder extends Seeder { Model::unguard(); + // Generate a random callback secret for Blockonomics users + $callbackSecret = Str::random(32); + $gateways = [ ['id' => 1, 'name' => 'Authorize.Net', 'provider' => 'Authorize', 'sort_order' => 5, 'key' => '3b6621f970ab18887c4f6dca78d3f8bb', 'fields' => '{"apiLoginId":"","transactionKey":"","testMode":false,"developerMode":false,"liveEndpoint":"https:\/\/api2.authorize.net\/xml\/v1\/request.api","developerEndpoint":"https:\/\/apitest.authorize.net\/xml\/v1\/request.api"} '], @@ -90,7 +94,7 @@ class PaymentLibrariesSeeder extends Seeder ['id' => 62, 'name' => 'BTCPay', 'provider' => 'BTCPay', 'key' => 'vpyfbmdrkqcicpkjqdusgjfluebftuva', 'fields' => '{"btcpayUrl":"", "apiKey":"", "storeId":"", "webhookSecret":""}'], ['id' => 63, 'name' => 'Rotessa', 'is_offsite' => false, 'sort_order' => 22, 'provider' => 'Rotessa', 'key' => '91be24c7b792230bced33e930ac61676', 'fields' => '{"apiKey":"", "testMode":false}'], ['id' => 64, 'name' => 'CBA PowerBoard', 'is_offsite' => false, 'sort_order' => 26, 'provider' => 'CBAPowerBoard', 'key' => 'b67581d804dbad1743b61c57285142ad', 'fields' => '{"publicKey":"", "secretKey":"", "testMode":false, "gatewayId":"", "amex":false, "ausbc":false, "discover":false, "japcb":false, "laser":false, "mastercard":true, "solo":false, "visa":true, "visa_white":false}'], - ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":""}'], + ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":"' . $callbackSecret . '"}'], ]; foreach ($gateways as $gateway) { diff --git a/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php b/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php index cd1d59f5da..4343cd38c0 100644 --- a/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php +++ b/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php @@ -4,7 +4,11 @@ + + @if ($error) +
{{ $error }}
+ @else
@@ -43,6 +47,7 @@
+ @endif
@csrf From 7880a35b3a595b60df250fdc637ed09836461804 Mon Sep 17 00:00:00 2001 From: cnohall Date: Tue, 26 Nov 2024 17:46:51 +0900 Subject: [PATCH 2/6] error message UI improvement --- app/PaymentDrivers/Blockonomics/Blockonomics.php | 4 +++- .../ninja2020/gateways/blockonomics/pay_livewire.blade.php | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/PaymentDrivers/Blockonomics/Blockonomics.php b/app/PaymentDrivers/Blockonomics/Blockonomics.php index 69238838f3..35f430da92 100644 --- a/app/PaymentDrivers/Blockonomics/Blockonomics.php +++ b/app/PaymentDrivers/Blockonomics/Blockonomics.php @@ -55,6 +55,7 @@ class Blockonomics implements LivewireMethodInterface return ['success' => false, 'message' => 'Please enter a valid API key']; } + // $params = config('ninja.environment') == 'development' ? '?reset=1' : ''; $url = 'https://www.blockonomics.co/api/new_address'; $response = Http::withToken($api_key) @@ -73,8 +74,9 @@ class Blockonomics implements LivewireMethodInterface return ['success' => false, 'message' => 'Address not returned']; } } else { - return ['success' => false, 'message' => $response->object()->message ?? 'Something went wrong']; + return ['success' => false, 'message' => "Could not generate new address (This may be a temporary error. Please try again). \n\n

If this continues, please ask website administrator to check blockonomics registered email address for error messages"]; } + return ['success' => false, 'message' => 'Something went wrong']; } public function getBTCPrice() diff --git a/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php b/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php index 4343cd38c0..0e03cec1e5 100644 --- a/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php +++ b/resources/views/portal/ninja2020/gateways/blockonomics/pay_livewire.blade.php @@ -7,7 +7,7 @@ @if ($error) -
{{ $error }}
+
{!! $error !!}
@else
From 94a099769f76d7e173a5fa1172ff5e32005f6de3 Mon Sep 17 00:00:00 2001 From: cnohall Date: Wed, 27 Nov 2024 16:50:34 +0900 Subject: [PATCH 3/6] re-introduce the callback url --- .../migrations/2024_08_27_230111_blockonomics_gateway.php | 1 + database/seeders/PaymentLibrariesSeeder.php | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/database/migrations/2024_08_27_230111_blockonomics_gateway.php b/database/migrations/2024_08_27_230111_blockonomics_gateway.php index 14d13aa1a2..accecc193f 100644 --- a/database/migrations/2024_08_27_230111_blockonomics_gateway.php +++ b/database/migrations/2024_08_27_230111_blockonomics_gateway.php @@ -18,6 +18,7 @@ return new class extends Migration $fields = new \stdClass; $fields->apiKey = ""; $fields->callbackSecret = ""; + $fields->callbackUrl = ""; $gateway = new Gateway; $gateway->id = 65; diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index ff5d7b6a2b..5e10b28490 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -27,6 +27,8 @@ class PaymentLibrariesSeeder extends Seeder // Generate a random callback secret for Blockonomics users $callbackSecret = Str::random(32); + // Generate a callback URL for Blockonomics users + $callbackUrl = config('ninja.app_url') . '/payment_webhook/?secret=' . $callbackSecret; $gateways = [ ['id' => 1, 'name' => 'Authorize.Net', 'provider' => 'Authorize', 'sort_order' => 5, 'key' => '3b6621f970ab18887c4f6dca78d3f8bb', 'fields' => '{"apiLoginId":"","transactionKey":"","testMode":false,"developerMode":false,"liveEndpoint":"https:\/\/api2.authorize.net\/xml\/v1\/request.api","developerEndpoint":"https:\/\/apitest.authorize.net\/xml\/v1\/request.api"} @@ -94,7 +96,7 @@ class PaymentLibrariesSeeder extends Seeder ['id' => 62, 'name' => 'BTCPay', 'provider' => 'BTCPay', 'key' => 'vpyfbmdrkqcicpkjqdusgjfluebftuva', 'fields' => '{"btcpayUrl":"", "apiKey":"", "storeId":"", "webhookSecret":""}'], ['id' => 63, 'name' => 'Rotessa', 'is_offsite' => false, 'sort_order' => 22, 'provider' => 'Rotessa', 'key' => '91be24c7b792230bced33e930ac61676', 'fields' => '{"apiKey":"", "testMode":false}'], ['id' => 64, 'name' => 'CBA PowerBoard', 'is_offsite' => false, 'sort_order' => 26, 'provider' => 'CBAPowerBoard', 'key' => 'b67581d804dbad1743b61c57285142ad', 'fields' => '{"publicKey":"", "secretKey":"", "testMode":false, "gatewayId":"", "amex":false, "ausbc":false, "discover":false, "japcb":false, "laser":false, "mastercard":true, "solo":false, "visa":true, "visa_white":false}'], - ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":"' . $callbackSecret . '"}'], + ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":"' . $callbackSecret . '", "callbackUrl": "' . $callbackUrl . '"}'], ]; foreach ($gateways as $gateway) { From 7d886c82e5398336352aa7437d1b0450fd5b5947 Mon Sep 17 00:00:00 2001 From: cnohall Date: Tue, 3 Dec 2024 07:59:58 +0900 Subject: [PATCH 4/6] Update Blockonomics help link to an url with a dedicated article --- app/Models/Gateway.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index 59dbedb855..bb918a8de3 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -108,7 +108,7 @@ class Gateway extends StaticModel } elseif ($this->id == 63) { $link = 'https://rotessa.com'; } elseif ($this->id == 64) { - $link = 'https://blockonomics.co'; + $link = 'https://help.blockonomics.co/a/solutions/articles/33000291849'; } return $link; From 858d72adae53f70289497ef5b4a6eebc6ffa897e Mon Sep 17 00:00:00 2001 From: cnohall Date: Tue, 3 Dec 2024 11:53:25 +0900 Subject: [PATCH 5/6] use relative path for callbackUrl --- database/seeders/PaymentLibrariesSeeder.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index 5e10b28490..cb7934c5e1 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -28,7 +28,7 @@ class PaymentLibrariesSeeder extends Seeder // Generate a random callback secret for Blockonomics users $callbackSecret = Str::random(32); // Generate a callback URL for Blockonomics users - $callbackUrl = config('ninja.app_url') . '/payment_webhook/?secret=' . $callbackSecret; + $callbackUrl = '/payment_webhook/?secret=' . $callbackSecret; $gateways = [ ['id' => 1, 'name' => 'Authorize.Net', 'provider' => 'Authorize', 'sort_order' => 5, 'key' => '3b6621f970ab18887c4f6dca78d3f8bb', 'fields' => '{"apiLoginId":"","transactionKey":"","testMode":false,"developerMode":false,"liveEndpoint":"https:\/\/api2.authorize.net\/xml\/v1\/request.api","developerEndpoint":"https:\/\/apitest.authorize.net\/xml\/v1\/request.api"} From ed80c1a48e56283628ee4703eed968b41de1ede1 Mon Sep 17 00:00:00 2001 From: cnohall Date: Tue, 3 Dec 2024 12:56:38 +0900 Subject: [PATCH 6/6] remove callbackUrl --- .../migrations/2024_08_27_230111_blockonomics_gateway.php | 1 - database/seeders/PaymentLibrariesSeeder.php | 4 +--- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/database/migrations/2024_08_27_230111_blockonomics_gateway.php b/database/migrations/2024_08_27_230111_blockonomics_gateway.php index accecc193f..14d13aa1a2 100644 --- a/database/migrations/2024_08_27_230111_blockonomics_gateway.php +++ b/database/migrations/2024_08_27_230111_blockonomics_gateway.php @@ -18,7 +18,6 @@ return new class extends Migration $fields = new \stdClass; $fields->apiKey = ""; $fields->callbackSecret = ""; - $fields->callbackUrl = ""; $gateway = new Gateway; $gateway->id = 65; diff --git a/database/seeders/PaymentLibrariesSeeder.php b/database/seeders/PaymentLibrariesSeeder.php index cb7934c5e1..ff5d7b6a2b 100644 --- a/database/seeders/PaymentLibrariesSeeder.php +++ b/database/seeders/PaymentLibrariesSeeder.php @@ -27,8 +27,6 @@ class PaymentLibrariesSeeder extends Seeder // Generate a random callback secret for Blockonomics users $callbackSecret = Str::random(32); - // Generate a callback URL for Blockonomics users - $callbackUrl = '/payment_webhook/?secret=' . $callbackSecret; $gateways = [ ['id' => 1, 'name' => 'Authorize.Net', 'provider' => 'Authorize', 'sort_order' => 5, 'key' => '3b6621f970ab18887c4f6dca78d3f8bb', 'fields' => '{"apiLoginId":"","transactionKey":"","testMode":false,"developerMode":false,"liveEndpoint":"https:\/\/api2.authorize.net\/xml\/v1\/request.api","developerEndpoint":"https:\/\/apitest.authorize.net\/xml\/v1\/request.api"} @@ -96,7 +94,7 @@ class PaymentLibrariesSeeder extends Seeder ['id' => 62, 'name' => 'BTCPay', 'provider' => 'BTCPay', 'key' => 'vpyfbmdrkqcicpkjqdusgjfluebftuva', 'fields' => '{"btcpayUrl":"", "apiKey":"", "storeId":"", "webhookSecret":""}'], ['id' => 63, 'name' => 'Rotessa', 'is_offsite' => false, 'sort_order' => 22, 'provider' => 'Rotessa', 'key' => '91be24c7b792230bced33e930ac61676', 'fields' => '{"apiKey":"", "testMode":false}'], ['id' => 64, 'name' => 'CBA PowerBoard', 'is_offsite' => false, 'sort_order' => 26, 'provider' => 'CBAPowerBoard', 'key' => 'b67581d804dbad1743b61c57285142ad', 'fields' => '{"publicKey":"", "secretKey":"", "testMode":false, "gatewayId":"", "amex":false, "ausbc":false, "discover":false, "japcb":false, "laser":false, "mastercard":true, "solo":false, "visa":true, "visa_white":false}'], - ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":"' . $callbackSecret . '", "callbackUrl": "' . $callbackUrl . '"}'], + ['id' => 65, 'name' => 'Blockonomics', 'is_offsite' => false, 'sort_order' => 27, 'provider' => 'Blockonomics', 'key' => 'wbhf02us6owgo7p4nfjd0ymssdshks4d', 'fields' => '{"apiKey":"", "callbackSecret":"' . $callbackSecret . '"}'], ]; foreach ($gateways as $gateway) {