-
-
Save echr/d5141b0a3210462d32ed1fc3a621c371 to your computer and use it in GitHub Desktop.
<?php | |
namespace Drivers\Whatsapp; | |
use BotMan\BotMan\Exceptions\Base\DriverException; | |
class WhatsappConnectionException extends DriverException | |
{ | |
} |
<?php | |
return [ | |
'url' => env('WHATSAPP_PARTNER', 'http://127.0.0.1:3001/v1'), | |
'throw_http_exceptions' => true | |
]; |
<?php | |
namespace Drivers\Whatsapp; | |
use BotMan\BotMan\Drivers\HttpDriver; | |
use BotMan\BotMan\Interfaces\UserInterface; | |
use BotMan\BotMan\Messages\Incoming\Answer; | |
use BotMan\BotMan\Messages\Incoming\IncomingMessage; | |
use BotMan\BotMan\Users\User; | |
use Illuminate\Support\Collection; | |
use Symfony\Component\HttpFoundation\ParameterBag; | |
use Symfony\Component\HttpFoundation\Request; | |
use Symfony\Component\HttpFoundation\Response; | |
class WhatsappDriver extends HttpDriver | |
{ | |
const DRIVER_NAME = 'Whatsapp'; | |
protected $endpoint = 'messages'; | |
/** | |
* @var array | |
*/ | |
protected $messages = []; | |
/** | |
* @param Request $request | |
* @return void | |
*/ | |
public function buildPayload(Request $request) | |
{ | |
$this->payload = new ParameterBag((array) json_decode($request->getContent(), true)); | |
$this->event = Collection::make((array) $this->payload->get('messages') ? (array) $this->payload->get('messages')[0] : ''); | |
$this->content = $request->getContent(); | |
$this->config = Collection::make($this->config->get('whatsapp', [])); | |
} | |
/** | |
* Determine if the request is for this driver. | |
* | |
* @return bool | |
*/ | |
public function matchesRequest() | |
{ | |
return !is_null($this->payload->get('contacts')) || !is_null($this->event->get('from')); | |
} | |
/** | |
* Retrieve the chat message(s). | |
* | |
* @return array | |
*/ | |
public function getMessages() | |
{ | |
if (empty($this->messages)) { | |
$this->messages = [ | |
new IncomingMessage( | |
$this->event->get('text')['body'], | |
$this->event->get('from'), | |
$this->event->get('from'), | |
$this->payload | |
) | |
]; | |
} | |
return $this->messages; | |
} | |
/** | |
* Retrieve User information. | |
* @param IncomingMessage $matchingMessage | |
* @return UserInterface | |
*/ | |
public function getUser(IncomingMessage $matchingMessage) | |
{ | |
$contact = Collection::make($matchingMessage->getPayload()->get('contacts')[0]); | |
return new User( | |
$contact->get('wa_id'), | |
$contact->get('profile')['name'], | |
null, | |
$contact->get('wa_id'), | |
$contact | |
); | |
} | |
/** | |
* @param IncomingMessage $message | |
* @return \BotMan\BotMan\Messages\Incoming\Answer | |
*/ | |
public function getConversationAnswer(IncomingMessage $message) | |
{ | |
return Answer::create($message->getText())->setMessage($message); | |
} | |
/** | |
* @param string|\BotMan\BotMan\Messages\Outgoing\Question $message | |
* @param IncomingMessage $matchingMessage | |
* @param array $additionalParameters | |
* @return $this | |
*/ | |
public function buildServicePayload($message, $matchingMessage, $additionalParameters = []) | |
{ | |
return [ | |
'preview_url' => true, | |
'recipient_type' => 'individual', | |
'to' => $matchingMessage->getSender(), | |
'type' => 'text', | |
'text' => [ | |
'body' => $message->getText() | |
] | |
]; | |
} | |
/** | |
* @param mixed $payload | |
* @return Response | |
*/ | |
public function sendPayload($payload) | |
{ | |
if ($this->config->get('throw_http_exceptions')) { | |
return $this->postWithExceptionHandling($this->buildApiUrl($this->endpoint), [], $payload, $this->buildAuthHeader(), true); | |
} | |
return $this->http->post($this->buildApiUrl($this->endpoint), [], $payload, $this->buildAuthHeader(), true); | |
} | |
/** | |
* @return bool | |
*/ | |
public function isConfigured() | |
{ | |
// TODO: Check token existence from DB? | |
return !empty($this->config->get('url')); | |
} | |
/** | |
* Low-level method to perform driver specific API requests. | |
* | |
* @param string $endpoint | |
* @param array $parameters | |
* @param \BotMan\BotMan\Messages\Incoming\IncomingMessage $matchingMessage | |
* @return void | |
*/ | |
public function sendRequest($endpoint, array $parameters, IncomingMessage $matchingMessage) | |
{ | |
$parameters = array_replace_recursive([ | |
'to' => $matchingMessage->getRecipient(), | |
], $parameters); | |
if ($this->config->get('throw_http_exceptions')) { | |
return $this->postWithExceptionHandling($this->buildApiUrl($endpoint), [], $parameters, $this->buildAuthHeader()); | |
} | |
return $this->http->post($this->buildApiUrl($endpoint), [], $parameters, $this->buildAuthHeader()); | |
} | |
protected function buildApiUrl($endpoint) | |
{ | |
return $this->config->get('url') . '/' . $endpoint; | |
} | |
protected function buildAuthHeader() | |
{ | |
// TODO: Token should from DB & Re-Fetch before expired | |
// TODO: Should create Artisan command + Scheduler | |
$token = 'YOUR-BEARER-TOKEN-HERE'; | |
return [ | |
"Authorization: Bearer $token", | |
'Content-Type: application/json', | |
'Accept: application/json' | |
]; | |
} | |
/** | |
* @param $url | |
* @param array $urlParameters | |
* @param array $postParameters | |
* @param array $headers | |
* @param bool $asJSON | |
* @param int $retryCount | |
* @return Response | |
* @throws \Modules\ChatBot\Drivers\Whatsapp\WhatsappConnectionException | |
*/ | |
private function postWithExceptionHandling( | |
$url, | |
array $urlParameters = [], | |
array $postParameters = [], | |
array $headers = [], | |
$asJSON = false, | |
int $retryCount = 0 | |
) { | |
$response = $this->http->post($url, $urlParameters, $postParameters, $headers, $asJSON); | |
$responseData = json_decode($response->getContent(), true); | |
if ($response->isSuccessful()) { | |
return $responseData; | |
} | |
$responseData['errors']['code'] = $responseData['errors']['code'] ?? 'No description from Vendor'; | |
$responseData['errors']['title'] = $responseData['errors']['title'] ?? 'No error code from Vendor'; | |
$message = "Status Code: {$response->getStatusCode()}\n". | |
"Description: ".print_r($responseData['errors']['title'], true)."\n". | |
"Error Code: ".print_r($responseData['errors']['code'], true)."\n". | |
"URL: $url\n". | |
"URL Parameters: ".print_r($urlParameters, true)."\n". | |
"Post Parameters: ".print_r($postParameters, true)."\n". | |
"Headers: ". print_r($headers, true)."\n"; | |
throw new WhatsappConnectionException($message); | |
} | |
} |
which partner would this work with? Or is it a direct integration with Facebook?
I'm using facebook partner https://wappin.id/ , the API looks similar with the FB documentation have, just the endpoint is using the partner host.
Did you manage to load this driver?
I am using botman studio
Yes.. @legreco we're using it for production purposes but only for plain text (non-media) bot response. You might need to adjust some code to match your requirement.
@echr is there a possible way i use this with whatsapp cloud api?
@echr is there a possible way i use this with whatsapp cloud api?
Never connect directly with whatsapp cloud api, but I guess the API reference is same with the partner one.
@echr is there a possible way i use this with whatsapp cloud api?
Never connect directly with whatsapp cloud api, but I guess the API reference is same with the partner one.
Brother can you please help of direct whatsapp cloud api plugin
@echr is there a possible way i use this with whatsapp cloud api?
Never connect directly with whatsapp cloud api, but I guess the API reference is same with the partner one.
Brother can you please help of direct whatsapp cloud api plugin
Sorry, I'm afraid can't help right now. It's been a long time since the last time I handled this bot project, it might have different spec now.
This package might be helpful to get started... https://github.com/irwan-runtuwene/driver-whatsapp
which partner would this work with? Or is it a direct integration with Facebook?