You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

265 lines
6.8 KiB
PHP

<?php
namespace App\Services;
use App\Models\Sms;
use App\Models\SmsDetail;
class SmsService
{
private $sms_url = "https://apis.aligo.in/send/";
private $user_id = "jiasoft";
private $api_key = "0rsw46blu616mp6geidaldsy9z6o0pgi";
private $sender = '1577-5993';
/**
* Create a new job instance.
*/
public function __construct()
{
}
/**
* 문자전송
* @param int $sms_id
* @param string $phone
* @param string $message
* @return bool
*/
public function sendSms(int $sms_id = 0, string $phone = '', string $message = '')
{
// 비어 있으면 건너뛰기
if (!$sms_id || empty($phone) || empty($message)) {
return false;
}
$result = $this->requestSms($phone, $message);
logger(json_encode($result));
$success = 0;
if ($result->result_code == 1) {
$success = 1;
}
if ($sms_id && $sms_id > 0) {
$fields = array(
'sms_id' => $sms_id,
'phone' => $phone,
'success' => $success,
'error' => $result->message
);
SmsDetail::query()->create($fields);
}
if (!$success) {
return false;
}
return true;
}
/**
* 단일번호 문자전송
* @param string $phone
* @param string $message
* @return bool
*/
public function sendPhone(string $phone = '', string $message = '')
{
$fields = array(
'title' => '',
'content' => $message,
'callback' => $this->sender,
'total' => 1,
'success' => 0,
'failure' => 0
);
$data = Sms::query()->create($fields);
if ($data) {
$success = $this->sendSms($data->id, $phone, $message);
if ($success) {
$data->success = 1;
$data->failure = 0;
} else {
$data->success = 0;
$data->failure = 1;
}
$data->save();
return true;
}
return false;
}
/**
* 단일회원 문자전송
* @param $user
* @param $message
* @return bool
*/
public function sendUser($user, $message)
{
$fields = array(
'title' => '',
'content' => $message,
'callback' => $this->sender,
'total' => 1,
'success' => 0,
'failure' => 0
);
$data = Sms::query()->create($fields);
if ($data) {
$success = $this->sendSms($data->id, $user->phone, $message);
if ($success) {
$data->success = 1;
$data->failure = 0;
} else {
$data->success = 0;
$data->failure = 1;
}
$data->save();
return true;
}
return false;
}
/**
* 복수회원 문자전송
* @param array $users
* @param string $message
* @return int
*/
public function sendUsers(array $users = [], string $message = '')
{
$total = count($users);
$success = 0;
$fields = array(
'title' => '',
'content' => $message,
'callback' => $this->sender,
'total' => $total,
'success' => 0,
'failure' => 0
);
$data = Sms::query()->create($fields);
if ($data) {
foreach ($users as $user) {
$result = $this->sendSms($data->id, $user->phone, $message);
if ($result) {
$success++;
}
}
}
$data->success = $success;
$data->failure = $total - $success;
$data->save();
return $success;
}
/**
* 복수번호 문자전송
* @param array $phones
* @param string $message
* @return int
*/
public function sendPhones(array $phones = [], string $message = '')
{
$total = count($phones);
$success = 0;
$fields = array(
'title' => '',
'content' => $message,
'callback' => $this->sender,
'total' => $total,
'success' => 0,
'failure' => 0
);
$data = Sms::query()->create($fields);
if ($data) {
foreach ($phones as $phone) {
$result = $this->sendSms($data->id, $phone, $message);
if ($result) {
$success++;
}
}
}
$data->success = $success;
$data->failure = $total - $success;
$data->save();
return $success;
}
/**
* 문자전송 요청
* @param string $phone
* @param string $message
* @return mixed
*/
public function requestSms(string $phone = '', string $message = '')
{
$sms = [];
$sms['user_id'] = $this->user_id;
$sms['key'] = $this->api_key;
$sms['msg'] = stripslashes($message);
$sms['receiver'] = $phone;
$sms['sender'] = $this->sender;
$sms['rdate'] = '';
$sms['rtime'] = '';
$sms['testmode_yn'] = '';
$sms['title'] = '';
$sms['msg_type'] = 'SMS';
return $this->postUrl($this->sms_url, $sms);
}
/**
* 문자 전송 연동 모듈 함수 호출
* @param string $url
* @param array $fields
* @return mixed
*/
private function postUrl(string $url = '', array $fields = [])
{
$schema = explode("/", $url);
$port = $schema[0] == 'https:' ? 443 : 80;
$oCurl = curl_init();
curl_setopt($oCurl, CURLOPT_PORT, $port);
curl_setopt($oCurl, CURLOPT_URL, $url);
curl_setopt($oCurl, CURLOPT_POST, 1);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($oCurl, CURLOPT_POSTFIELDS, $fields);
curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, false);
$ret = curl_exec($oCurl);
curl_close($oCurl);
// result_code : 전송성공유무 (성공:1 / 실패: -100 부터 -999)
// message : success (성공시) / reserved (예약성공시) / 그외 (실패상세사유가 포함됩니다)
// msg_id : 메세지 고유ID = 고유값을 반드시 기록해 놓으셔야 sms_list API를 통해 전화번호별 성공/실패 유무를 확인하실 수 있습니다
// error_cnt : 에러갯수 = receiver 에 포함된 전화번호중 문자전송이 실패한 갯수
// success_cnt : 성공갯수 = 이동통신사에 전송요청된 갯수
// msg_type : 전송된 메세지 타입 = SMS / LMS / MMS (보내신 타입과 다른경우 로그로 기록하여 확인하셔야 합니다)
// 결과배열
return json_decode($ret);
}
}