Open frankly034 opened 6 years ago
Hello good day . If you check the repo here on GitHub , you would see that the methods for subaccounts have been implemented . However for some reason , the package doesn't auto update on packagist ( where composer fetches the package from ) . Hence when you use " composer require unicodeveloper/laravel-paystack" , composer installs an older version of the package that existed before Paystack implemented the subaccounts feature
please i need your help. i want to integrate paystack payment getway in laravel 8 livewire component but am having this error Error Call to undefined method Unicodeveloper\Paystack\Paystack::make() http://localhost:8000/checkout take look at my settings For Checkout component <?php
namespace App\Http\Livewire;
use App\Models\Order; use App\Models\OrderItem; use App\Models\Shipping; use App\Models\Transaction; use Cart; use Exception; use Illuminate\Support\Facades\Auth; use Livewire\Component; use Paystack;
class CheckoutComponent extends Component { public $ship_to_different;
public $firstname;
public $lastname;
public $mobile;
public $email;
public $line1;
public $line2;
public $city;
public $province;
public $country;
public $zipcode;
public $s_firstname;
public $s_lastname;
public $s_mobile;
public $s_email;
public $s_line1;
public $s_line2;
public $s_city;
public $s_province;
public $s_country;
public $s_zipcode;
public $paymentmode;
public $thankyou;
public $card_no;
public $exp_month;
public $exp_year;
public $cvc;
public function updated($fields)
{
$this->validateOnly($fields,[
'firstname' =>'required',
'lastname' =>'required',
'mobile' =>'required|numeric',
'email' =>'required|email',
'line1' =>'required',
'city' =>'required',
'province' =>'required',
'country' =>'required',
'zipcode' =>'required',
'paymentmode' => 'required'
]);
if($this->ship_to_different)
{
$this->validateOnly($fields,[
's_firstname' =>'required',
's_lastname' =>'required',
's_mobile' =>'required|numeric',
's_email' =>'required|email',
's_line1' =>'required',
's_city' =>'required',
's_province' =>'required',
's_country' =>'required',
's_zipcode' =>'required'
]);
}
if($this->paymentmode == 'card')
{
$this->validateOnly($fields,[
'card_no' => 'required|numeric',
'exp_month' => 'required|numeric',
'exp_year' => 'required|numeric',
'cvc' => 'required|numeric'
]);
}
}
public function placeOrder()
{
$this->validate([
'firstname' =>'required',
'lastname' =>'required',
'mobile' =>'required|numeric',
'email' =>'required|email',
'line1' =>'required',
'city' =>'required',
'province' =>'required',
'country' =>'required',
'zipcode' =>'required',
'paymentmode' => 'required'
]);
if($this->paymentmode == 'card')
{
$this->validate([
'card_no' => 'required|numeric',
'exp_month' => 'required|numeric',
'exp_year' => 'required|numeric',
'cvc' => 'required|numeric'
]);
}
$order = new Order();
$order->user_id = Auth::user()->id;
$order->subtotal = session()->get('checkout')['subtotal'];
$order->discount = session()->get('checkout')['discount'];
$order->tax = session()->get('checkout')['tax'];
$order->total = session()->get('checkout')['total'];
$order-> firstname = $this->firstname;
$order-> lastname = $this->lastname;
$order-> mobile = $this->mobile;
$order-> email = $this->email;
$order-> line1 = $this->line1;
$order-> line2 = $this->line2;
$order-> city = $this->city;
$order-> province = $this->province;
$order-> country = $this->country;
$order-> zipcode = $this->zipcode;
$order->status = 'ordered';
$order->is_shipping_different = $this->ship_to_different ? 1:0;
$order->save();
foreach(Cart::instance('cart')->content()as $item)
{
$orderItem = new OrderItem();
$orderItem->product_id = $item->id;
$orderItem->order_id = $order->id;
$orderItem->price = $item->price;
$orderItem->quantity = $item->qty;
$orderItem->save();
}
if($this->ship_to_different)
{
$this->validate([
's_firstname' =>'required',
's_lastname' =>'required',
's_mobile' =>'required|numeric',
's_email' =>'required|email',
's_line1' =>'required',
's_city' =>'required',
's_province' =>'required',
's_country' =>'required',
's_zipcode' =>'required'
]);
$shipping = new Shipping();
$shipping->order_id = $order->id;
$shipping-> firstname = $this->s_firstname;
$shipping-> lastname = $this->s_lastname;
$shipping-> mobile = $this->s_mobile;
$shipping-> email = $this->s_email;
$shipping-> line1 = $this->s_line1;
$shipping-> line2 = $this->s_line2;
$shipping-> city = $this->s_city;
$shipping-> province = $this->s_province;
$shipping-> country = $this->s_country;
$shipping-> zipcode = $this->s_zipcode;
$shipping->save();
}
if($this->paymentmode == 'cod')
{
$this->makeTransaction($order->id,'pending');
$this->resetCart();
}
else if($this->paymentmode == 'card')
{
$paystack = Paystack::make(env('sk_test_827a36210be0e3a737f323aecd3c2cd0dd6b2615'));
try{
$token = $paystack->tokens()->create([
'card' => [
'number' => $this->card_no,
'exp_month' => $this->exp_month,
'exp_year' => $this->exp_year,
'cvc' => $this->cvc
]
]);
if(!isset($token['id']))
{
session()->flash('paystack_error','The Paystack token was not generated correctly!');
$this-> thankyou = 0;
}
$customer = $paystack-> customers()->create([
'name' => $this->firstname . ' ' . $this->lastname,
'phone' =>$this->mobile,
'email' =>$this->email,
'address' =>[
'line1' =>$this->line1,
'postal_code' =>$this->zipcode,
'state' => $this->state,
'country' => $this->country
],
'shipping' => [
'name' => $this->firstname . '' . $this->lastname,
'address' =>[
'line1' =>$this->line1,
'postal_code' =>$this->zipcode,
'state' => $this->state,
'country' => $this->country
],
],
'source' => $token['id']
]);
$charge = $paystack->charges()->create([
'customer' => $customer['id'],
'currency' => 'NGN',
'amount' => session()->get('checkout')['total'],
'description' => 'payment for order no' . $order->id
]);
if($charge['status'] == 'succeeded')
{
$this-> makeTransaction($order->id, 'approved');
$this->resetCart();
}
else
{
session()->flash('paystack_error','Error in Transaction!');
$this->thankyou = 0;
}
}catch(Exception $e){
session()->flash('paystack_error',$e->getMessage());
$this->thankyou = 0;
}
}
}
public function resetCart()
{
$this->thankyou = 1;
Cart::instance('cart')->destroy();
session()->forget('checkout');
}
public function makeTransaction($order_id,$status)
{
$transaction = new Transaction();
$transaction->user_id = Auth::user()->id;
$transaction->order_id = $order_id;
$transaction->mode = $this->paymentmode;
$transaction->status = $status;
$transaction->save();
}
public function verifyForCheckout()
{
if(!Auth::check())
{
return redirect()->route('login');
}
else if($this->thankyou)
{
return redirect()->route('thankyou');
}
else if(!session()->get('checkout'))
{
return redirect()->route('product.cart');
}
}
public function render()
{
$this->verifyForCheckout();
return view('livewire.checkout-component')->layout("layouts.base");
}
}
For config/app/settings <?php
return [
/*
|--------------------------------------------------------------------------
| Application Name
|--------------------------------------------------------------------------
|
| This value is the name of your application. This value is used when the
| framework needs to place the application's name in a notification or
| any other location as required by the application or its packages.
|
*/
'name' => env('APP_NAME', 'Laravel'),
/*
|--------------------------------------------------------------------------
| Application Environment
|--------------------------------------------------------------------------
|
| This value determines the "environment" your application is currently
| running in. This may determine how you prefer to configure various
| services the application utilizes. Set this in your ".env" file.
|
*/
'env' => env('APP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| Application Debug Mode
|--------------------------------------------------------------------------
|
| When your application is in debug mode, detailed error messages with
| stack traces will be shown on every error that occurs within your
| application. If disabled, a simple generic error page is shown.
|
*/
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
| Application URL
|--------------------------------------------------------------------------
|
| This URL is used by the console to properly generate URLs when using
| the Artisan command line tool. You should set this to the root of
| your application so that it is used when running Artisan tasks.
|
*/
'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL', null),
/*
|--------------------------------------------------------------------------
| Application Timezone
|--------------------------------------------------------------------------
|
| Here you may specify the default timezone for your application, which
| will be used by the PHP date and date-time functions. We have gone
| ahead and set this to a sensible default for you out of the box.
|
*/
'timezone' => 'UTC',
/*
|--------------------------------------------------------------------------
| Application Locale Configuration
|--------------------------------------------------------------------------
|
| The application locale determines the default locale that will be used
| by the translation service provider. You are free to set this value
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'en',
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
|--------------------------------------------------------------------------
|
| The fallback locale determines the locale to use when the current one
| is not available. You may change the value to correspond to any of
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
|--------------------------------------------------------------------------
|
| This key is used by the Illuminate encrypter service and should be set
| to a random, 32 character string, otherwise these encrypted strings
| will not be safe. Please do this before deploying an application!
|
*/
'key' => env('APP_KEY'),
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
|--------------------------------------------------------------------------
|
| The service providers listed here will be automatically loaded on the
| request to your application. Feel free to add your own services to
| this array to grant expanded functionality to your applications.
|
*/
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Illuminate\Auth\AuthServiceProvider::class,
Illuminate\Broadcasting\BroadcastServiceProvider::class,
Illuminate\Bus\BusServiceProvider::class,
Illuminate\Cache\CacheServiceProvider::class,
Illuminate\Foundation\Providers\ConsoleSupportServiceProvider::class,
Illuminate\Cookie\CookieServiceProvider::class,
Illuminate\Database\DatabaseServiceProvider::class,
Illuminate\Encryption\EncryptionServiceProvider::class,
Illuminate\Filesystem\FilesystemServiceProvider::class,
Illuminate\Foundation\Providers\FoundationServiceProvider::class,
Illuminate\Hashing\HashServiceProvider::class,
Illuminate\Mail\MailServiceProvider::class,
Illuminate\Notifications\NotificationServiceProvider::class,
Illuminate\Pagination\PaginationServiceProvider::class,
Illuminate\Pipeline\PipelineServiceProvider::class,
Illuminate\Queue\QueueServiceProvider::class,
Illuminate\Redis\RedisServiceProvider::class,
Illuminate\Auth\Passwords\PasswordResetServiceProvider::class,
Illuminate\Session\SessionServiceProvider::class,
Illuminate\Translation\TranslationServiceProvider::class,
Illuminate\Validation\ValidationServiceProvider::class,
Illuminate\View\ViewServiceProvider::class,
Gloudemans\Shoppingcart\ShoppingcartServiceProvider::class,
Unicodeveloper\Paystack\PaystackServiceProvider::class,
/*
* Package Service Providers...
*/
/*
* Application Service Providers...
*/
App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,
App\Providers\FortifyServiceProvider::class,
App\Providers\JetstreamServiceProvider::class,
],
/*
|--------------------------------------------------------------------------
| Class Aliases
|--------------------------------------------------------------------------
|
| This array of class aliases will be registered when this application
| is started. However, feel free to register as many as you wish as
| the aliases are "lazy" loaded so they don't hinder performance.
|
*/
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
'Broadcast' => Illuminate\Support\Facades\Broadcast::class,
'Bus' => Illuminate\Support\Facades\Bus::class,
'Cache' => Illuminate\Support\Facades\Cache::class,
'Config' => Illuminate\Support\Facades\Config::class,
'Cookie' => Illuminate\Support\Facades\Cookie::class,
'Crypt' => Illuminate\Support\Facades\Crypt::class,
'Date' => Illuminate\Support\Facades\Date::class,
'DB' => Illuminate\Support\Facades\DB::class,
'Eloquent' => Illuminate\Database\Eloquent\Model::class,
'Event' => Illuminate\Support\Facades\Event::class,
'File' => Illuminate\Support\Facades\File::class,
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Http' => Illuminate\Support\Facades\Http::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
'Notification' => Illuminate\Support\Facades\Notification::class,
'Password' => Illuminate\Support\Facades\Password::class,
'Queue' => Illuminate\Support\Facades\Queue::class,
'RateLimiter' => Illuminate\Support\Facades\RateLimiter::class,
'Redirect' => Illuminate\Support\Facades\Redirect::class,
'Redis' => Illuminate\Support\Facades\Redis::class,
'Request' => Illuminate\Support\Facades\Request::class,
'Response' => Illuminate\Support\Facades\Response::class,
'Route' => Illuminate\Support\Facades\Route::class,
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,
'Cart'=> Gloudemans\Shoppingcart\Facades\Cart::class,
'Paystack' => Unicodeveloper\Paystack\Facades\Paystack::class,
],
];
For env. settings
PAYSTACK_PUBLIC_KEY=pk_test_1694c701c73219fd261e3d324c2be6d9fd72acbd PAYSTACK_SECRET_KEY=sk_test_827a36210be0e3a737f323aecd3c2cd0dd6b2615 PAYSTACK_PAYMENT_URL=https://api.paystack.co MERCHANT_EMAIL=tbase2050r@gmail.com
and For Checkout resources/ view/livewire
Quisque gravida turpis sit amet nulla posuere lacinia. Cras sed est sit amet ipsum luctus.
{{-- --}}
please help
I tried implementing the subaccount creation using the Laravel api method Paystack::createSubAccount(); but returned the error "Call to undefined method Unicodeveloper\Paystack\Paystack::createSubAccount()". I also noticed that all the other subaccount methods to fetchsubaccount or list subaccount have no implementation yet.