PHP code example of daworks / laravel-sens

1. Go to this page and download the library: Download daworks/laravel-sens library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

daworks / laravel-sens example snippets


> use Daworks\Sens\Facades\Sens;   // 필요
> // \Sens::sms() 처럼 전역 별칭으로는 동작하지 않습니다.
> 

> 'alimtalk_service_id' => env('SENS_ALIMTALK_SERVICE_ID'),        // 1.3.1 이하에서 위험
> 'alimtalk_service_id' => env('SENS_ALIMTALK_SERVICE_ID', ''),    // 패키지 기본값
> 

> 'plus_friend_id' => env('SENS_PLUS_FRIEND_ID', '@id'),
> 

'sens' => [
    'services' => [
        'sms' => [
            'sender' => env('SENS_SMS_FROM'),
        ],
    ],
],



namespace App\Notifications;

use Daworks\Sens\Sms\SmsChannel;
use Daworks\Sens\Sms\SmsMessage;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class SendPurchaseReceipt extends Notification
{
    use Queueable;

    public function via($notifiable)
    {
        return [SmsChannel::class];
    }

    public function toSms($notifiable)
    {
        return (new SmsMessage)
            ->to($notifiable->phone)
            ->from('055-000-0000')   // 생략하면 설정값을 사용합니다.
            ->content('주문이 접수되었습니다.')
            ->contentType('AD')      // 생략 가능 (기본: COMM)
            ->type('SMS');           // 생략 가능 (기본: SMS)
    }
}

use App\Models\User;
use App\Notifications\SendPurchaseReceipt;

User::find(1)->notify(new SendPurchaseReceipt);

(new SmsMessage)
    ->to('01000000001')
    ->to('01000000002')
    ->content('공지 사항입니다.');

public function toSms($notifiable)
{
    return (new SmsMessage)
        ->type('MMS')
        ->to($notifiable->phone)
        ->subject('청구서')
        ->content("청구서를 첨부합니다.")
        /* 파일 경로 문자열 또는 Illuminate\Http\UploadedFile 객체 */
        ->file('invoice.jpg', $this->image);
}

> use Daworks\Sens\Facades\Sens;
>
> $attachment = Sens::sms()->uploadAttachment('invoice.jpg', base64_encode($contents));
>
> $attachment->fileId;     // 'a136...74f7'
> $attachment->expireTime; // '2025-11-27T10:12:47.520'
>
> // 이후 발송에서는 파일 아이디만 넘깁니다.
> (new SmsMessage)->type('MMS')->to($phone)->content('...')->fileId($attachment->fileId);
> 



namespace App\Notifications;

use Daworks\Sens\AlimTalk\AlimTalkChannel;
use Daworks\Sens\AlimTalk\AlimTalkMessage;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;

class SendShippingNotice extends Notification
{
    use Queueable;

    public function via($notifiable)
    {
        return [AlimTalkChannel::class];
    }

    public function toAlimTalk($notifiable)
    {
        return (new AlimTalkMessage())
            ->templateCode('TEMPLATE001')                            // 필수
            ->to($notifiable->phone)                                 // 필수
            ->content('주문하신 상품이 발송되었습니다.')                  // 필수
            ->countryCode('82')                                      // 선택
            ->addButton(['type' => 'DS', 'name' => '배송 조회'])        // 선택
            ->setReserved('2026-08-31 14:20', 'Asia/Seoul');         // 선택
    }
}

new AlimTalkMessage('@another-channel');
// 또는
(new AlimTalkMessage)->plusFriendId('@another-channel');

use Daworks\Sens\Facades\Sens;
use Daworks\Sens\Sms\SmsMessage;

$message = (new SmsMessage)->to('01000000000')->content('안녕하세요.');

$response = Sens::sms()->send($message->toArray());

public function __construct(private \Daworks\Sens\Sms\Sms $sms) {}

use Daworks\Sens\Facades\Sens;

$response = Sens::sms()->send($message->toArray());

$response->requestId;      // 'RSLA-...'  ← 이 값을 저장해 두면 추적할 수 있습니다.
$response->requestTime;    // '2025-11-25T09:39:40.535'
$response->statusCode;     // '202'
$response->isAccepted();   // true
$response->isSuccessful(); // true

$response = Sens::alimTalk()->send($message->toArray());

$response->isAccepted();   // true  (요청은 접수됨)
$response->isSuccessful(); // false (수신자 중 일부가 실패)

foreach ($response->failedMessages() as $message) {
    logger()->warning('알림톡 접수 실패', [
        'requestId' => $response->requestId,
        'to' => $message->getTo(),
        'reason' => $message->getStatusMessage(),
    ]);
}

use Daworks\Sens\Responses\SendResponse;
use Illuminate\Notifications\Events\NotificationSent;

class RecordSensRequestId
{
    public function handle(NotificationSent $event): void
    {
        if (! $event->response instanceof SendResponse) {
            return;
        }

        SentMessage::create([
            'notifiable_type' => $event->notifiable::class,
            'notifiable_id' => $event->notifiable->getKey(),
            'request_id' => $event->response->requestId,
            'status_code' => $event->response->statusCode,
        ]);
    }
}

use Daworks\Sens\Facades\Sens;

// 요청 아이디로 해당 발송 요청의 메시지 목록을 조회합니다.
$list = Sens::sms()->findByRequestId($requestId);

$list->messageIds();   // ['f574d3f0-...', ...]
$list->isSuccessful(); // 모든 메시지가 수신 성공했는지
$list->isPending();    // 아직 결과를 확정할 수 없는지
$list->isEmpty();      // 조회 결과가 없는지
$list->pending();      // 아직 처리 중인 메시지
$list->failed();       // 수신 실패한 메시지

foreach ($list->failed() as $message) {
    echo $message->getTo() . ': ' . $message->getStatusMessage();
}

// 개별 메시지의 상세 결과를 조회합니다.
$result = Sens::sms()->findMessage($list->messageIds()[0]);

$result->isSuccessful();     // 수신 성공 여부
$result->isPending();        // 아직 처리 중인지 (실패로 단정하면 안 됩니다)
$result->getStatusCode();    // '3018'
$result->getStatusMessage(); // '발신번호 변작 방지 서비스에 가입된 번호'
$result->toArray();          // SENS 원본 응답

$result = Sens::alimTalk()->findMessage($messageId);

$result->isSuccessful();      // 알림톡으로 전달되었는지
$result->failoverSucceeded(); // SMS 대체 발송이 성공했는지
$result->isDelivered();       // 둘 중 하나로 전달되었는지

> $list = Sens::sms()->findByRequestId($requestId);
>
> if ($list->isPending()) {
>     return; // 아직 처리 중 — 잠시 후 다시 조회합니다.
> }
>
> if ($list->failed()) {
>     // 실패 처리
> }
> 

$list = Sens::sms()->findMessages([
    'requestStartTime' => '2025-11-25 09:00:00',
    'requestEndTime' => '2025-11-25 18:00:00',
    'statusName' => 'fail',
    'pageSize' => 100,
]);

if ($list->hasMore) {
    $next = Sens::sms()->findMessages([/* ... */ 'nextToken' => $list->nextToken]);
}

$status = Sens::sms()->getReservationStatus($requestId);

$status->reserveStatus; // 'READY'
$status->isPending();   // 아직 발송되지 않음 (이 상태에서만 취소할 수 있습니다)

if ($status->isPending()) {
    Sens::sms()->cancelReservation($requestId);
}

use Daworks\Sens\Exceptions\SensException;

try {
    $response = Sens::sms()->send($message->toArray());
} catch (SensException $e) {
    $e->getStatusCode();   // 401
    $e->getErrorCode();    // '210'
    $e->getMessage();      // '[210] Authentication Failed'
    $e->getResponseBody(); // SENS 원본 오류 응답
}

Sens::sms()->setHttpClient($mockedGuzzleClient);
bash
php artisan vendor:publish --provider="Daworks\Sens\SensServiceProvider" --tag="config"
bash
php artisan config:clear && php artisan config:cache
bash
php artisan make:notification SendPurchaseReceipt