unicodeveloper / laravel-paystack

:credit_card: :package: :moneybag: Laravel 6, 7, 8, 9, 10 and 11 Package for Paystack
https://paystack.co
MIT License
605 stars 312 forks source link

Call to undefined method Unicodeveloper\Paystack\Paystack::createSubAccount() #54

Open frankly034 opened 6 years ago

frankly034 commented 6 years ago

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.

sayopaul commented 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

godianski commented 2 years ago

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

{{--

Returning customer? Click here to login

Quisque gravida turpis sit amet nulla posuere lacinia. Cras sed est sit amet ipsum luctus.

Lost your password?

Have a coupon? Click here to enter your code

@if(!Session::has('coupon'))
@if (Session::has('coupon_message'))
{{Session::get('coupon_message')}}
@endif

@endif
--}}

Billing Details

{{--
--}}
@error('firstname'){{$message}}@enderror
@error('lastname'){{$message}}@enderror
@error('line1'){{$message}}@enderror
{{--
--}}
@error('email'){{$message}}@enderror
@error('mobile'){{$message}}@enderror
@error('city'){{$message}}@enderror
@error('province'){{$message}}@enderror
@error('country'){{$message}}@enderror
@error('zipcode'){{$message}}@enderror

@if ($ship_to_different)
{{--
--}}
@error('s_firstname'){{$message}}@enderror
@error('s_lastname'){{$message}}@enderror
@error('s_line1'){{$message}}@enderror
{{--
--}}
@error('s_email'){{$message}}@enderror
@error('s_mobile'){{$message}}@enderror
@error('s_city'){{$message}}@enderror
@error('s_province'){{$message}}@enderror
@error('s_country'){{$message}}@enderror
@error('s_zipcode'){{$message}}@enderror
@endif

Your order

@if (Session::has('checkout')) @endif
Product Total
Vestibulum suscipit × 1 0.00
Vestibulum suscipit × 1 0.00
Cart Subtotal 0.00
Order Total${{Session::get('checkout')['total']}}

Payment Method

@if ($paymentmode == 'card')
@if (Session::has('paystack_error')) @endif
@error('card_no'){{$message}}@enderror
@error('exp_month'){{$message}}@enderror
@error('exp_year'){{$message}}@enderror
@error('cvc'){{$message}}@enderror
@endif

Order Now and Pay on Delivery.

Debit / Credit Card.

Make your payment directly into our bank account. Please use your Order ID as the payment reference. Your order won’t be shipped until the funds have cleared in our account.

@error('paymentmode'){{$message}}@enderror

{{-- --}}

please help