A framework agnostic PHP library to build chat bots

Overview

BotMan

Latest Version on Packagist Build Status codecov Scrutinizer Code Quality Packagist StyleCI Slack Monthly Downloads

https://phppackagedevelopment.com

If you want to learn how to create reusable PHP packages yourself, take a look at my upcoming PHP Package Development video course.

About BotMan

BotMan is a framework agnostic PHP library that is designed to simplify the task of developing innovative bots for multiple messaging platforms, including Slack, Telegram, Microsoft Bot Framework, Nexmo, HipChat, Facebook Messenger and WeChat.

$botman->hears('I want cross-platform bots with PHP!', function (BotMan $bot) {
    $bot->reply('Look no further!');
});

If you want to learn how to create reusable PHP packages yourself, take a look at my upcoming PHP Package Development video course.

Documentation

You can find the BotMan documentation at https://botman.io.

Support the development

Do you like this project? Support it by donating

Contributing

Please see CONTRIBUTING for details.

0 1 2 3 4 5 6 7

Security Vulnerabilities

If you discover a security vulnerability within BotMan, please send an e-mail to Marcel Pociot at [email protected]. All security vulnerabilities will be promptly addressed.

License

BotMan is free software distributed under the terms of the MIT license.

Comments
  • Telegram: Conversations

    Telegram: Conversations

    Hello,

    I use botman in a new Laravel 5.3 application. I have tried with the laravel starter, but i couldnt get it to work. So i started with a clean install.

    As I am not very familiar with Laravel, I got it working, except the conversations. I have taken the Example conversations from the Laravel Starter.

    When I use Start Conversation, the conversation is triggered and the buttons appear in Telegram. When I click a button, nothing happens.

    Can it be something with the cache? As i can read in previous issues and documentation, when used in Laravel, caching is automatic handled?

    Controller

    namespace App\Http\Controllers;
    use Illuminate\Http\Request;
    use Mpociot\BotMan\BotManFactory;
    use Mpociot\BotMan\BotMan;
    use App\Conversations\ExampleConversation;
    
    class BotManController extends Controller
    {
    	public function handle(Request $request)
    	{
    		$botman = app('botman');
    
    		// Simple respond method
    		$botman->hears('Hello|hi|Hi', function (BotMan $bot) {
    			//Reply
    			$bot->reply('Hi there :)');
    		});
    
    		$botman->hears('Start conversation', function (BotMan $bot) {
    			$bot->startConversation(new ExampleConversation());
    		});
    		
    		$botman->listen();
    	}
    }
    

    Conversation

    namespace App\Conversations;
    
    use Illuminate\Foundation\Inspiring;
    use Mpociot\BotMan\Answer;
    use Mpociot\BotMan\Button;
    use Mpociot\BotMan\Conversation;
    use Mpociot\BotMan\Question;
    
    class ExampleConversation extends Conversation
    {
        /**
         * First question
         */
        public function askReason()
        {
            $question = Question::create("Huh - you woke me up. What do you need?")
                ->fallback('Unable to ask question')
                ->callbackId('ask_reason')
                ->addButtons([
                    Button::create('Tell a joke')->value('joke'),
                    Button::create('Give me a fancy quote')->value('quote'),
                ]);
            return $this->ask($question, function (Answer $answer) {
                if ($answer->isInteractiveMessageReply()) {
                    if ($answer->getValue() === 'joke') {
                        $joke = json_decode(file_get_contents('http://api.icndb.com/jokes/random'));
                        $this->say($joke->value->joke);
                    } else {
                        $this->say(Inspiring::quote());
                    }
                }
            });
        }
    
        /**
         * Start the conversation
         */
        public function run()
        {
            $this->askReason();
        }
    }
    
    opened by mrtn 46
  • BotMan property in Conversation object

    BotMan property in Conversation object

    Didn't find a better place to ask this question, maybe Botman could have it's own gitter or slack? 😃

    Conversation object now get serialized and deserialized from the cache by loadActiveConversation in BotMan while BotMan is an attribute of Conversation itself. I am not yet familiar with a code enough to propose how to avoid this circular dependency, however, BotMan should really be a singleton (which will help to avoid problems with cache and storage drivers that require connecting to some backend). One way to do might be to not serialize it via __sleep and rather inject current BotMan instance in getStoredConversation.

    Any thoughts on this?

    opened by thedotedge 29
  • Start Conversation without hears

    Start Conversation without hears

    Is there a way to start a conversation with ->hears()?

    We are wanting to have our bot ask a question every morning at a certain time, how could we go about that with a conversation?

    opened by brianclogan 26
  • Listen to other data types

    Listen to other data types

    BotMan should be able to listen for other data types, such as images, audio, location or generic attachments.

    Proposed API

    // Images
    $botman->receivesImages(function($bot) {
       $data = $bot->getMessage()->getImages();
    });
    
    // Videos
    $botman->receivesVideos(function($bot) {
       $data = $bot->getMessage()->getVideos();
    });
    
    // Audio
    $botman->receivesAudio(function($bot) {
       $data = $bot->getMessage()->getAudio();
    });
    
    // Location
    $botman->receivesLocation(function($bot) {
       $data = $bot->getMessage()->getLocations();
    });
    
    // Generic
    $botman->receivesAttachments(function($bot) {
       $data = $bot->getMessage()->getAttachments();
    });
    

    Necessary Steps:

    Images

    • [X] Telegram Driver
    • [X] Slack RTM Driver
    • [X] Facebook Driver
    • [x] MS Bot Framework Driver
    • [x] WeChat Driver
    • [ ] HipChat Driver

    Videos

    • [X] Telegram Driver
    • [X] Slack RTM Driver
    • [X] Facebook Driver
    • [ ] MS Bot Framework Driver
    • [x] WeChat Driver
    • [ ] HipChat Driver

    Audio

    • [X] Telegram Driver
    • [X] Slack RTM Driver
    • [X] Facebook Driver ( @christophrumpel )
    • [x] WeChat Driver
    • [ ] HipChat Driver

    Location

    • [X] Telegram Driver
    • [X] Facebook Driver ( @christophrumpel )
    • [x] WeChat Driver
    • [ ] HipChat Driver

    Generic

    • [X] Telegram Driver
    • [X] Slack RTM Driver
    • [X] Facebook Driver ( @christophrumpel )
    • [X] MS Bot Framework Driver
    • [ ] WeChat Driver
    • [ ] HipChat Driver

    Related issue: #169

    help wanted 
    opened by mpociot 24
  • Whatsapp Business API in botman

    Whatsapp Business API in botman

    As a Botman user developing bots for facebook messenger, I wanted to know if it is planned to add whatsapp to the Botman platform? Especially considering that the way to communicate with the api is very similar to facebook messenger.

    Here I leave the links of whatsapp Business APIs

    https://developers.facebook.com/docs/whatsapp https://developers.facebook.com/docs/whatsapp/api/webhooks https://developers.facebook.com/docs/whatsapp/api/webhooks/inbound

    Thank you very much for any information.

    opened by dafner 21
  • no answer, no exception

    no answer, no exception

    I just made like in tutorial

    use Mpociot\BotMan\BotManFactory;
    use Mpociot\BotMan\BotMan;
    use Mpociot\BotMan\Storages\Drivers\FileStorage;
    
    $token = 'MY-TOKEN';
    $config =  [
        'facebook_token' => $token,
        'facebook_app_secret' => 'MY-SECRET',
    
    ];
    
    // $storage = new FileStorage(__DIR__);
    // create an instance
    $botman = BotManFactory::create($config);
    $botman->verifyServices($token);
    
    $botman->hears('foo', function ($bot) {
        $bot->typesAndWaits(2);
        $bot->reply('Hello World');
    });
    // give the bot something to listen for.
    $botman->hears('.*', function (BotMan $bot) {
        $bot->reply('Hello yourself.');
    });
    
    // start listening
    $botman->listen();
    

    I see in logs...that facebook made request to my address. but no answer appear. Also didn't get anythng in error log.

    opened by adeptofvoltron 21
  • "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

    Description:

    For PHP 7.3 :

    composer require botman/botman

    returns :

    [ErrorException]
    "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?

    Steps To Reproduce:

    opened by AdamLew 19
  • Serialization of 'Closure' is not allowed

    Serialization of 'Closure' is not allowed

    I'm using botman with laravel 5.4 when I try to run some conversation with ask function. It will result to Serialization of 'Closure' is not allowed. Example conversation:

    <?php
    namespace App\Conversations;
    
    use Illuminate\Foundation\Inspiring;
    
    use Mpociot\BotMan\Answer;
    use Mpociot\BotMan\Button;
    use Mpociot\BotMan\Conversation;
    use Mpociot\BotMan\Question;
    
    class ReservationConversation extends Conversation
    {
    
        /**
         * First question
         */
        public function askReason()
        {
            $question = Question::create("Ahoj, ako ti pomozem?")
                ->fallback('Unable to ask question')
                ->addButtons([
                    Button::create('Tell a joke')->value('joke'),
                    Button::create('Give me a fancy quote')->value('quote'),
                ]);
    
            return $this->ask($question, function (Answer $answer) {
                $this->say('Hello');
            });
        }
        /**
         * Start the conversation
         */
        public function run()
        {
            $this->askReason();
        }
    }
    

    When I take a look to stack trace I see that error comes from FileStore.php

    public function put($key, $value, $minutes)
        {
            $this->ensureCacheDirectoryExists($path = $this->path($key));
    
            $this->files->put(
                $path, $this->expiration($minutes).serialize($value), true
            );
        }
    
    opened by xar 19
  • Does not send reply

    Does not send reply

    Helo, I have set up the botman project and configured facebook messenger, i can receive messages, but the reply() method does not send a message back to the user.

    I have also tried using botman:tinker but no reply also.

    I am using a windows 10 PC

    opened by jokamjohn 18
  • botman->say()

    botman->say()

    Hi There,

    Firstly, awesome library, what more can be said.

    I was wondering if someone has a working example of botman->say, I am new to all of this and try as I may I can not originate messages to either skype or telegram, my own ignorance I am sure. (Got everything else working, hears, replies, conversations).

    What I am trying to do is originate a message to a user, using laravel, simple get route for testing as follows:

    public function testOriginate()
    {
    	\\ log at this point shows I get here
    	$botman = app('botman');
    	$botman->say('Hello There I have some interesting news','29:xxx',BotFrameworkDriver::class);
    }
    

    switching to telegram driver and user id has no effect. No errors in the log etc. Just seems to disappear into a dark abyss.

    Would appreciate a push down the rabbit hole.

    Thanks in advance.

    opened by jacquesvn 18
  • Nothing being passed in Payload

    Nothing being passed in Payload

    For some reason, the payload that comes from Slack is empty, is that an issue with the repo, or slack?

    I followed your directions, setup a route that responds with the URL verification, that works just fine, but when I send a message to the bot, Slack sends a message with the $request variable being completely empty. Am I missing something here?

    opened by brianclogan 18
  • Add FileCache driver

    Add FileCache driver

    • Please check if the PR fulfills these requirements
    • [x] The commit message follows our guidelines
    • [x] Tests for the changes have been added (for bug fixes / features)
    • [ ] Docs have been added / updated (for bug fixes / features)
    • What kind of change does this PR introduce? (Bug fix, feature, docs update, ...) feature

    • What is the current behavior? (You can also link to an open issue here) None, when testing with the bot the default behavior is the ArrayCache. If you want to test conversations there is no way to do this in a simple manner. This cache driver is not to be used for production usage.

    • What is the new behavior (if this is a feature change)? Add a simple cache implementation to use for testing reasons with the bot.

    • Does this PR introduce a breaking change? (What changes might users need to make in their application due to this PR?) None.

    • Other information: When creation this cache driver a location for the json files can be specified when constructing this driver. When this PR may be excepted I will add the needed documentation :-).

    opened by prennings 0
  • Changelog for latest updates

    Changelog for latest updates

    • BotMan Version: 2.7.7

    Is it possible to tag the latest releases since 2.6.1 and most importantly get a Changelog?

    I just ran composer update on my project and it pulled 2.7.7 but I don't know if there are any breaking changes. So I'm not really confident.

    Very happy to see this package being updated thought. Keep up the good work! Thanks ;)

    opened by clementmas 0
  • Hangout Driver cant originating message (say method)

    Hangout Driver cant originating message (say method)

    BotMan Version: 2.6.1; PHP Version: 7.3; Messaging Service(s): Hangout Driver; Laravel: 5.8;

    Description:

    I'm trying to originating message with say method, but it wont send any message to the recipient. I was try using email and user id, but it was return the same response of payload.

    My Code : ` $email = "users/XXXXXXXXXXXXXXXXXX"; // i got this from $bot->getUser()->getId() from worked conversation $message = "test";

        $config = [
            "hangouts" => [
               "token" => "XXXXXXXXXXXXXXXXXXXXXX"
            ]
        ];
        $botman = BotManFactory::create($config);
    
        $resp = $botman->say($message, $email, HangoutsDriver::class);
    
        dd($resp);
    

    `

    response { "text": "tesfast", "cards": [ { "sections": [ { "widgets": [] } ] } ] }

    and message still wont send. please help me to find out why its not working. thank you.

    Steps To Reproduce:

    opened by tyghaykal 0
  • Master

    Master

    • Please check if the PR fulfills these requirements
    • [ ] The commit message follows our guidelines
    • [ ] Tests for the changes have been added (for bug fixes / features)
    • [ ] Docs have been added / updated (for bug fixes / features)
    • What kind of change does this PR introduce? (Bug fix, feature, docs update, ...)

    docs update

    • What is the current behavior? (You can also link to an open issue here)

    Many people have cant use botman because of errors with installation. After a doing the instruction from official site we understand we haven't composer. After installing composer we try php artisan serve and have a 500 error with "Wooops..."

    It's not clear how to start with botman on the clean installed Operating System On the web there are many questions about problems with errors. Fast search in the botman issues gives me this: 0 1 2

    • What is the new behavior (if this is a feature change)?

    There are many projects with "Example installation" (like nextcloud for example) I wrote a step-by-step guide to have working botman on clean Ubuntu installation

    • Does this PR introduce a breaking change? (What changes might users need to make in their application due to this PR?)

    Absolutely NO!

    • Other information:
    opened by sebaxakerhtc 0
  • ButtonTemplate not working

    ButtonTemplate not working

    • BotMan Version: 2.0.#
    • PHP Version: 7.1.33
    • Messaging Service(s): Facebook Messenger
    • Cache Driver:

    Description:

    I'm trying to use ButtonTemplate but it doesn't work

    $bot->reply(ButtonTemplate::create('Hello world')
        ->addButton(ElementButton::create('button1')->type('postback')->payload('Click me!'))
    );
    
    opened by edmund5 2
  • How to mock or disable Botman middleware?

    How to mock or disable Botman middleware?

    • BotMan Version: 2.6.1
    • PHP Version: 7.4
    • Messaging Service(s): Telegram
    • Cache Driver: file

    Description:

    I need to skip Botman middleware in tests. The default Laravel Illuminate\Foundation\Testing\WithoutMiddleware trait doesn't disable Botman middleware in tests. I also tried to mock it but without success:

    I have a CreateUniverse Matching middleware. First I resolve it through the Service Containter:

    //
    // botman.php
    //
    
    $middleware = resolve(CreateUniverse::class);
    
    $botman->hears('hi', function (BotMan $bot) {
        $bot->reply('hello');
    })->middleware($middleware);
    

    Then I'm trying to mock it:

    //
    // RoutesTests.php
    //
    
    $middleware_double = Mockery::mock(CreateUniverse::class);
    
    $middleware_double->shouldReceive('matching')
        ->once()
        ->with(Mockery::any())
        ->andReturn(true);
    
    $this->app->instance(CreateUniverse::class, $middleware_double);
    
    $this->bot
        ->receives('hi')
        ->assertReply('hello');
    

    But get an error:

    Mockery\Exception\InvalidCountException: Method matching(<Any>) from Mockery_0_App_Http_Middleware_CreateUniverse should be called exactly 1 times but called 0 times.
    

    It looks like my mock is not applied.

    opened by chimit 0
Releases(2.6.1)
  • 2.6.1(Sep 11, 2020)

  • 2.6.0(May 31, 2020)

    Changes

    • Added missing namespace 'File' (#1105)
    • Apply fixes from StyleCI (#1107)
    • symfony/http-foundation 5.0 (#1117)
    • Allow any callable as a callback (#1102)
    • Added OutgoingMessage type to BotMan::reply() $message parameter (#1104)
    • Add tests for PHP 7.4. (#1134)
    • Update LaravelCache.php (#1028)
    • Indicate possible null values in PHPDoc @return (#1097)
    • Updated compatibility for tightenco/collect (#1063)
    • fix wit ai connection (#1131)
    • Add Select action for Slack (#1087)
    • Allow BotMan to hear from an array of commands (#855)
    • Fix type of Curl::prepareRequest() (#1059)
    Source code(tar.gz)
    Source code(zip)
  • 2.4.1(Aug 9, 2018)

  • 2.4.0(Aug 8, 2018)

    Added

    • Added ability to listen for multiple events at once

    Fixed

    • Fixed Symfony dependency issues
    • Allow using opis/closure 3.0
    • Fix invalid conversation cache handling
    Source code(tar.gz)
    Source code(zip)
  • 2.3.3(May 2, 2018)

  • 2.3.2(Apr 16, 2018)

  • 2.3.1(Apr 3, 2018)

  • 2.3.0(Feb 20, 2018)

    Added

    • Added extras on attachment objects
    • Added support for Laravel's autowiring in the PSR-11 implementation

    Fixed

    • Fixed an issue with custom middleware added to specific hears commands
    Source code(tar.gz)
    Source code(zip)
  • 2.2.0(Feb 19, 2018)

  • 2.1.10(Feb 7, 2018)

  • 2.1.9(Jan 19, 2018)

  • 2.1.8(Jan 18, 2018)

  • 1.5.9(Jan 15, 2018)

  • 2.1.7(Jan 12, 2018)

  • 2.1.6(Dec 19, 2017)

  • 2.1.5(Dec 4, 2017)

  • 2.1.4(Dec 1, 2017)

  • 2.1.3(Oct 18, 2017)

  • 2.1.2(Oct 9, 2017)

  • 2.1.1(Oct 5, 2017)

  • 2.1.0(Sep 30, 2017)

    Added

    • Added ability to cache message user information (#542)
    • Added macro functionality to the Conversation method
    • Added getStoredConversationQuestion method
    • Improved Fake Driver

    Fixed

    • Fix incorrect 'conversation_cache_time' config path (#557)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.4(Sep 11, 2017)

  • 2.0.3(Sep 10, 2017)

  • 2.0.2(Sep 6, 2017)

    Added

    • Drivers can have a method called additionalDrivers to simplify manual driver loading, when not using BotMan studio.

    Fixed

    • Fixed matching middleware inside of conversations not receiving the manipulated $message object.
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Aug 28, 2017)

    Added

    • Added ability to originate inline conversations.
    • Moved each driver into their own repository.
    • Facebook - Added support to send file and audio attachments.
    • Telegram - Added support to send file, audio and location attachments.
    • Added Kik driver.
    • Added custom Attachment classes.
    • Added support to listen for message service events.
    • Changed the way middleware works in BotMan.
    • Added support for Slack interactive menu messages.
    • Added Facebook Referral driver.
    • Allow replying to an existing thread for Slack drivers (#327).
    • Added loadDriver method to BotMan.
    • Added ability to use BotMan with a local socket.

    Changed

    • Switched from plain text to JSON responses for Slack slash commands, to allow richer message formatting.
    • Moved message matching into a separate Matcher class.

    Removed

    • Removed FacebookPostbackDriver, FacebookOptinDriver and FacebookReferralDriver in favor of the new event API.
    Source code(tar.gz)
    Source code(zip)
  • 1.5.8(Jul 12, 2017)

    [1.5.8]

    Added

    • Allow adding of plain array buttons on Element class (#448)
    • Added Authentication to RedisStorage (#439)

    Fixed

    • Fixes an issue with Facebook attachment detection. (#463)
    Source code(tar.gz)
    Source code(zip)
  • 1.5.7(May 30, 2017)

  • 1.5.6(May 18, 2017)

  • 1.5.5(Apr 24, 2017)

The best PHP library for VK Users Longpoll Api (Page Bots).

vk-page-bot-lib Description: There are 2 commands and a logger. There is a logger of new messages and a logger that a friend has entered/left in/from

KirillChimbur 6 Jul 25, 2022
TeleBot - Easy way to create Telegram-bots in PHP. Rich Laravel support out of the box.

TeleBot is a PHP library for telegram bots development. Rich Laravel support out of the box. Has an easy, clean, and extendable way to handle telegram Updates.

WeStacks 198 Nov 27, 2022
Create modern Telegram Bots with PHP.

Telepath Create Telegram Bots with this modern PHP library Explore the docs » Report Bug · Request Feature Table of Contents About The Project Before

Telepath 5 Nov 7, 2022
SDK for latest version of Telegram bots API

SDK for latest version of Telegram bots API (from April 24, 2020) Using Examples Installing composer require "DiyorbekUz/Telelib: dev-master" Init bot

Diyorbek 2 Sep 5, 2021
Telegraph - a Laravel package for fluently interaction with Telegram Bots

Telegraph - a Laravel package for fluently interaction with Telegram Bots

def:studio 404 Dec 7, 2022
Todo plugin for Zuri Chat

ZURI.CHAT TODO PLUGIN Stack Laravel and VueJs To install dependencies You need to composer installed, after installing composer composer install whi

Zuri Chat 19 Sep 30, 2022
SimSimi Bot - a Telegram ChatBot like the old SimSimi app that simulates a normal chat experience, created directly by users

SimSimi Bot - a Telegram ChatBot like the old SimSimi app that simulates a normal chat experience, created directly by users

NeleB54Gold 4 Oct 21, 2022
A bot that translates the words you choose during the chat in Telegram to the language you want.

About Needy Telegram Translator If you are constantly using telegram and want to translate words into different languages, this library is for you. Qu

Ä°brahim Sayar 2 May 27, 2022
Shopee Open API v2 Client build with php

Shopee PHP Client This is a Shopee PHP Client, currently supported for API V2 in ShopeeOpenPlatform Composer Install composer require haistar/shopee-p

ravimukti 16 Nov 9, 2022
A2Reviews Client API lets you build apps, extensions or plugins to get reviews from the A2reviews APP

A2Reviews Client API lets you build apps, extensions or plugins to get reviews from the A2reviews APP. Including adding reviews to a store's products. It is used to import and export reviews through the API. This is the official package built and developed by A2Reviews, Inc.

Be Duc Tai 2 Sep 25, 2021
Where we build an open source API to retrieve some data about Togo's region

???? Subdivision administrative du Togo Base de données complÚte des régions, préfectures, communes, cantons et quartiers disponible au format JSON, S

Togo Developers 5 Jun 27, 2022
Build a Telegram Bot

Build a Telegram Bot

Msf 7 Sep 29, 2022
Laravel Package for 1APP. Learn how to integrate our APIs to build a web or mobile integration to send and accept payments for your application and businesses.

1APP Laravel Library Learn how to integrate our APIs to build a web or mobile integration to accept payments, make payment of Bills and as well custom

O'Bounce Technologies 4 Jul 25, 2022
This package help you build your REST API documentation.

Laravel API Doc This package help you build your REST API documentation. Installation You can install the package via composer: composer require axeld

Axel 2 May 19, 2022
BeckhoffPLCSoapClient - SoapClient to communicate with BeckHoff PLC. Library made in PHP based on TcAdsWebService JavaScript Library.

BeckhoffPLCSoapClient - SoapClient to communicate with BeckHoff PLC. Library made in PHP based on TcAdsWebService JavaScript Library.

null 3 May 18, 2022
Lightweight PHP library for WhatsApp API to send the whatsapp messages in PHP provided by ultramsg.com

Ultramsg.com WhatsApp API PHP SDK Lightweight PHP library for WhatsApp API to send the whatsappp messages in PHP provided by Ultramsg.com Installation

Ultramsg 114 Dec 5, 2022
Google-api-php-client - A PHP client library for accessing Google APIs

Google APIs Client Library for PHP Reference Docs https://googleapis.github.io/google-api-php-client/main/ License Apache 2.0 The Google API Client Li

Google APIs 8.3k Dec 1, 2022
Wise-php - This library is written to accommodate the wise API's use in php projects With Wise

Wise-php - This library is written to accommodate the wise API's use in php projects With Wise you can automate payments, connect your business tools, and create ways to manage your finances. You can also power your cross-border and domestic payouts.

Albert Xhani 15 Nov 17, 2022
PHP library for the Stripe API.

Stripe PHP bindings The Stripe PHP library provides convenient access to the Stripe API from applications written in the PHP language. It includes a p

Stripe 3.3k Dec 6, 2022