자유게시판

제목 sms 업체 팀장과의 대화..
글쓴이 DJ구스 작성시각 2011/10/20 09:53:11
댓글 : 10 추천 : 0 스크랩 : 0 조회수 : 13287   RSS
 ICODEKOREA 이라는 SMS 발송솔루션 업체가 있다..
SMS를 보내고 남은 코인값을 리턴을 못받길래 잔여 코인 부족으로 메세지 발송 오류가 발생했을 때 대처가 전혀 되지 않아서 고객문의를 해서 개발팀장이랑 이야기를 했다..
 
남구스: "잔여 코인 API 하나만 만들어 배포 해주면 안될까요? 10분이면 끝나는건데?"
팀장 :"보안상 어렵습니다."
남구스: "소스를 보니 이미 보안상 문제가 많은데 ID/PASS로 인증하고 서버 IP값만 저장하셔서 해당 IP업체만 가능토록 해주면 안되나요? 경쟁사들은 모두 다 가능한데.."
팀장 :"그럼 그 경쟁사 서비스를 이용하세요..!!"
남구스: " 그럼 당신네 사장에게 그렇게 그대로 전해 드리지요.. 일개 개발 팀장이 회사 이익을 위해 경쟁사 가라고 하는데 귀찮니즘에 잘못된 설계로 추가 하기 힘든 부분의 책임을 고객에게 전가 시키는 고객 대응 참 팀장으로서 보기 좋습니다. 같은 개발자로서 부끄럽네요.."
팀장:"그럼 운영팀과 논의를 통해서 다시 이메일로 알려드리겠습니다"
 
개발자가 욕먹는 이유...
이미 만들어 놓은것을 바꾸기 싫어한다. 존심도 상하고 귀찮기 때문에.. 출근해서 네이버 뉴스 볼 시간에 월급 받아 쳐드시면서 회사를 위해 한번만 이라도 더 생각 해보시길.. 역지사지로 조팀장 당신이 고객이었으면?? 이래서 발전이 없는 것이요..
 
소스를 직접 만들었다고 하던데 일전에 포스팅 했지만 당신이 이미 만들어 놓은 소스는 개쓰레기 소스야.. 클래스를 개떡같이 만들어 놓고 흉내만 내놓고 보안상 문제? 당신이 만들어 놓은 소스 자체가 보안 허점 투성이야.. 해킹..? 보안??
 
하지만 당신의 고객 응대는 당신 천성을 바꾸기 전 까진 힘들거 같소이다..

언제나 기획자/디자이너와 개발자의 전투를 보면 항상 무조건 안된다는 식이다. 
안되는데에는 두가지 이유가 있다.

1. 모르기 때문에 안된다고 한다.
2. 바꾸기에는 너무 많은 유지보수가 필요하다.

내가 볼땐 개발팀장은 1,2 번 모두 해당된다.
2번은 설계단계 부터 확장성 없이 개발 한 당신의 문제이고..
1번은 노력만 하면 되는 것인데 지금 내 실력에 만족한다고 생각지는 않는가?
팀장이 저러는데 밑에 개발자들은 뭘 보고 배울 수 있을까..?

사수 잘 만나 경험과 노하우를 전수 받는 목적으로 밤세고 적은 연봉으로 참고 일하는 개발자들이 얼마나 많은데...
언제 시간 되시면 Icodekorea sms php 모듈 한번 보시길.. 밤새 작업하고 전화 한통으로 썩 좋은 하루가 시작 되진 않을 듯..

첨부로 icodeSMS api 인데.. 시간이 없어서 CI맞게 100% 최적화 못하고 테스트 하기 위해 일단 찍어 볼려고 수정을 했는데..
제가 보기에는 분명 ASP개발자였던거 같습니다. 프x챌, 소xx다 초기 개발자들과 비슷한 코딩과 네이밍..

그누보드 사용자들은 모두 이 업체 Sms를 사용 할텐데... 
언제 개발 완료가 되면 Zuna_sms 라이브러리 공개를 하도록 하겠습니다. 
zuna = 여친 이름.. ㅋㅋㅋ 
 
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
///////////////////////////////////////////////////////////////////////////////////////////
// 이 부분은 건드릴 필요가 없습니다.

class Zuna_sms {
 var $ID;
 var $PWD;
 var $SMS_Server;
 var $port;
 var $SMS_Port;
 var $Data = array();
 var $Result = array();

 function __construct()
 {
  $this->ci =& get_instance();
  // @todo 향후 DB에 넣어서 처리 하기 때문에 config 파일은 필요 없음.
  $this->ci->load->config('zuna_setting');

  if ($this->ci->config->item('SMS_service_type') == 1) {
   $port=(int)rand(7192,7195);
  } else {
   $port=(int)rand(7196,7199);
  }
  // SMS 모듈 초기화

  $this->ID    = $this->ci->config->item('SMS_icode_id');
  $this->PWD    = $this->ci->config->item('SMS_icode_passwd');
  $this->SMS_Server  = $this->ci->config->item('SMS_server_ip');
  $this->SMS_Port  = $port;
  $this->ID    = spacing($this->ID,10);
  $this->PWD    = spacing($this->PWD,10);
 }


 function Init() {
  $this->Data = "";
  $this->Result = "";
 }

 function Add($dest, $callBack, $Caller, $msg, $rsvTime="") {
  // 내용 검사 1
  $Error = CheckCommonType($dest, $rsvTime);
  if ($Error) return $Error;
  // 내용 검사 2
  if ( eregi("[^0-9]",$callBack) ) return "회신 전화번호가 잘못되었습니다";
  $msg=cut_char($msg,80); // 80자 제한
  // 보낼 내용을 배열에 집어넣기
  $dest = spacing($dest,11);
  $callBack = spacing($callBack,11);
  $Caller = spacing($Caller,10);
  $rsvTime = spacing($rsvTime,12);
  $msg = spacing($msg,80);
  $this->Data[] = '01144 '.$this->ID.$this->PWD.$dest.$callBack.$Caller.$rsvTime.$msg;
  return true;
 }

 function AddURL($dest, $callBack, $URL, $msg, $rsvTime="") {
  // 내용 검사 1
  $Error = CheckCommonType($dest, $rsvTime);
  if ($Error) return $Error;
  // 내용 검사 2
  //$URL=str_replace("http://","",$URL);
  if (strlen($URL)>50) return "URL이 50자가 넘었습니다";
  switch (substr($dest,0,3)) {
   case '010': //20바이트
    $msg=cut_char($msg,20);
    break;
   case '011': //80바이트
    $msg=cut_char($msg,80);
    break;
   case '016': // 80바이트
    $msg=cut_char($msg,80);
    break;
   case '017': // URL 포함 80바이트
    $msg=cut_char($msg,80-strlen($URL));
    break;
   case '018': // 20바이트
    $msg=cut_char($msg,20);
    break;
   case '019': // 20바이트
    $msg=cut_char($msg,20);
    break;
   default:
    return "아직 URL CallBack이 지원되지 않는 번호입니다";
    break;
  }
  // 보낼 내용을 배열에 집어넣기
  $dest = spacing($dest,11);
  $URL = spacing($URL,50);
  $callBack = spacing($callBack,11);
  $rsvTime = spacing($rsvTime,12);
  $msg = spacing($msg,80);
  $this->Data[] = '05173 '.$this->ID.$this->PWD.$dest.$callBack.$URL.$rsvTime.$msg;
  return "";
 }

 function Send () {
  $fp=fsockopen($this->SMS_Server,$this->SMS_Port);
  if (!$fp) return false;
  set_time_limit(300);
  $gets = '';

  foreach($this->Data as $puts) {
   $dest = substr($puts,26,11);
   fputs($fp,$puts);
   while(!$gets) { $gets=fgets($fp,30); }

   $strMsg = '';
   switch (substr($gets,6,2)) {
    case '00': $strMsg = "정상적으로 메세지를 보냈습니다."; break;
    case '99': $strMsg = "[ERROR] 인증실패 또는 포트오류"; break;
    case '98': $strMsg = "[ERROR] 사용기간 만료"; break;
    case '97': $strMsg = "[ERROR] 잔여코인 부족"; break;
    case '23': $strMsg = "[ERROR] 인증실패, 데이타 오류, 전송날짜 오류"; break;
    case '16': $strMsg = "[ERROR]발송서버 IP오류"; break;
    default: $strMsg = "[ERROR] 알수 없는 오류 발생";break;
   }
   $this->Result[] = $strMsg;

   $gets="";
  }
  fclose($fp);
  $this->Data="";
  return true;
 }
}

function spacing($text,$size) {
 for ($i=0; $i<$size; $i++) $text.=" ";
 $text = substr($text,0,$size);
 return $text;
}

function cut_char($word, $cut) {
 // $word=trim(stripslashes($word));
 $word=substr($word,0,$cut);      // 필요한 길이만큼 취함.
 for ($k=$cut-1; $k>1; $k--) {
  if (ord(substr($word,$k,1))<128) break;  // 한글값은 160 이상.
 }
 $word=substr($word,0,$cut-($cut-$k+1)%2);
 return $word;
}

function CheckCommonType($dest, $rsvTime) {
 $dest=eregi_replace("[^0-9]","",$dest);
 if (strlen($dest)<10 || strlen($dest)>11) return "휴대폰 번호가 틀렸습니다";
 $CID=substr($dest,0,3);
 if ( eregi("[^0-9]",$CID) || ($CID!='070' && $CID!='010' && $CID!='011' && $CID!='016' && $CID!='017' && $CID!='018' && $CID!='019') ) return "휴대폰 앞자리 번호가 잘못되었습니다";
 $rsvTime=eregi_replace("[^0-9]","",$rsvTime);
 if ($rsvTime) {
  if (!checkdate(substr($rsvTime,4,2),substr($rsvTime,6,2),substr($rsvTime,0,4))) return "예약날짜가 잘못되었습니다";
  if (substr($rsvTime,8,2)>23 || substr($rsvTime,10,2)>59) return "예약시간이 잘못되었습니다";
 }
}

/* End of file Zuna_sms.php */
/* Location: ./application/libraries/Zuna_sms.php */

 다음글 무서운 개발자... (6)
 이전글 포럼 메일이 셋팅됐습니다. (4)

댓글

DJ구스 / 2011/10/20 10:06:45 / 추천 0
답변이 왔네요..ㅋㅋ
5분도 안되어서.. 이미 API가 있었거나 아님 급하게 만들었던가..
==================================================

안녕하세요 ?

아이코드 XXX입니다.

오전에 통화하면서 약간 불편했던점은 사과 드립니다.

요즘 서버관련해서 여러가지 이슈가 많아서 좀 예민했던 모양입니다.

 

요청하신 부분은 운영팀에 협의 하여 아래와 같은 답변을 받았습니다. 참고 바랍니다.

파라미터는 Post 방식으로 전송하여 주시기 바랍니다.

감사합니다.

 

1.1.      파라메터 처리 주소

http://www.icodekorea.com/res/userinfo.php

 

1.2.      아이코드로 보내는 파라메터

항목

필수

자리수

내용

userid

필수

10

고객 아이디

userpw

필수

10

고객 비밀번호

r_url

 

 

회신받을 주소

 

1.3.      리턴 처리되는 파라메터

항목

내용

code

결과코드

payment

요금제 표시 – A: 충전제, C: 정액제, 기타: 협의된 요금제

coin

고객 잔액 (충전제만 해당)

gpay

고객의 건수 별 차감액 표시 (충전제만 해당)

 

1.4.      결과코드

항목

내용

0

성공

101

필수 파라메터 부족

102

비밀번호의 길이가 4~10사이를 벗어나는 경우

105

고객 아이디 길이가 4~10사이를 벗어나는 경우

202

아이디와 비밀번호가 맞지 않는 경우

변종원(웅파) / 2011/10/20 10:09:38 / 추천 0
아무리 그대로 "그러면 경쟁사 쓰세요"라는건 용산에서나 듣던 멘트인데
기본 자세가 안되어 있네요. 

(아이코드 예전에 사용했었고 한 군데 추천하려고 했던 곳인데 다른데 알아봐야겠네요.)
DJ구스 / 2011/10/20 10:21:50 / 추천 0
 사실 whois보단 좋아요..ㅋㅋㅋ
그누보드에서 사용을 하길래 쓰려고 했던것인데...

고객응대가.. 어이 없었고.. 이미 API가 있는걸 알고 문의 했는데 
귀찮아서 해주기 싫다는 식..

사람 잘못 봤죠.. 그쪽 업체들 물어보면 다 아는 사람들이 대표일텐데..
그냥 넘어 가기로 했습니다. 

그래도...
경쟁사 가서 쓰라는건.. ㅋㅋㅋ
한대승(불의회상) / 2011/10/20 10:46:59 / 추천 0
ㅎㅎㅎㅎ.. 고객응대 자세가 영~~~ ^^
UYEONG / 2011/10/20 11:06:15 / 추천 0
파폭으로 이 게시물 글 보는데 테이블 꺠지네요?? 음..
변종원(웅파) / 2011/10/20 11:52:11 / 추천 0
 크롬에서도 SyntaxHighlighter 부분때문에 조금 벗어납니다.
탱크 / 2011/10/20 12:38:23 / 추천 0
 여친이름을 코드에 사용하시는... 부럽네요~~
 제겐 더 이상 그럴 일이 없겠죠? ㅜㅜ

 울 예쁜 딸래미 이름을 사용할 일은 있을 수 있겠군여 ^^;
무명의시인2 / 2011/10/21 10:11:00 / 추천 0
좋은 간접경험을 배웁니다. ㅎㅎ
1day1 / 2011/10/22 18:22:05 / 추천 0
윗글 '무서운개발자' 이야기가 오버랩되네요.

그러고 보니 얼마전 거기것 쓰다가 바꿨네요.

송군 / 2011/10/28 02:01:01 / 추천 0
허허...