Posted
Filed under 프로그래밍/PHP
프로젝트도 거의 끝나가고 있다.

Slim은 사용방법이 너무 쉬워서 뭐라 설명할것이 없지만 한가지만 소개해본다.

Slim의 최대 강점은 손쉬운 Routing method 처리다


<?php
$app = new \Slim\Slim();
$app->get('/books/:id', function ($id) {
    //Show book identified by $id
});


여기서 $app->get, $app->post, $app->put, $app->delete 처럼 바꿔주는것만으로 method 지원이 해결된다.

동시에 여러가지 method를 지원하게 할수도 있다.

<?php
$app = new \Slim\Slim();
$app->map('/foo/bar', function() {
    echo "I respond to multiple HTTP methods!";
})->via('GET', 'POST');
$app->run();



물론 나만의 커스텀 method도 지원한다.

<?php
$app = new \Slim\Slim();
$app->map('/hello', function() {
    echo "Hello";
})->via('FOO');
$app->run();


2013/09/18 08:49 2013/09/18 08:49
Posted
Filed under 프로그래밍/PHP

요즘 API개발이 한창이다
많이들 사용하는 방식이 헤더에 Authorization 항목을 넣어서 인증하는 방법이다.

사용자는 해더에 아래와 같이 전송한다.

Authorization: Basic 인증코드

인증코드는 아이디와 패스워드를 :로 구분하여 base64로 인코딩후 넣는다.

Authorization: Basic bWl5dTpkbHN3bGR 이런식?

base64_encode("id:pass") 이렇게 인코딩하면 된다.

그럼 서버쪽에서는?

_SERVER["HTTP_AUTHORIZATION"] : Basic bWl5dTpkbHN3bGR
_SERVER["PHP_AUTH_USER"] : id  (자동으로 디코딩 된다)
_SERVER["PHP_AUTH_PW"] : pass (자동으로 디코딩 된다)

이렇게 사용할수 있다.

한차원 높은 보안을 원한다면
base64인코딩 하기전에 token을 사용하여 openssl으로 한번 감싸서 보내도록하자

특정키로 암호화 (AES-256)
base64_encode(openssl_encrypt("id:pass", "aes-256-cbc", $key, true, str_repeat(chr(0), 16)));

복호화 
openssl_decrypt(base64_decode("isZXs9diEm43k6uRBtJJRQ=="), "aes-256-cbc", $key, true, str_repeat(chr(0), 16));

2013/08/31 16:06 2013/08/31 16:06
Posted
Filed under 프로그래밍/PHP


원본 : http://blog.evendanan.net/2012/03/In-App-Purchase-Verification-using-PHP-OR-Making-sure-you-ain-t-getting-ripped-off-PHP-style


Google

function verify_market_in_app($signed_data, $signature, $public_key_base64) 
{
 $key = "-----BEGIN PUBLIC KEY-----\n".
  chunk_split($public_key_base64, 64,"\n").
  '-----END PUBLIC KEY-----';   
 //using PHP to create an RSA key
 $key = openssl_get_publickey($key);
 //$signature should be in binary format, but it comes as BASE64. 
 //So, I'll convert it.
 $signature = base64_decode($signature);   
 //using PHP's native support to verify the signature
 $result = openssl_verify(
   $signed_data,
   $signature,
   $key,
   OPENSSL_ALGO_SHA1);
 if (0 === $result) 
 {
  return false;
 }
 else if (1 !== $result)
 {
  return false;
 }
 else 
 {
  return true;
 }
} 




Apple
애플의 경우는 프로덕션에 한번 던지고 21007 코드가 나오면 샌드박스로 다시 던져야 한다.
function verify_app_store_in_app($receipt, $is_sandbox) 
{
 //$sandbox should be TRUE if you want to test against itunes sandbox servers
 if ($is_sandbox)
  $verify_host = "ssl://sandbox.itunes.apple.com";
 else
  $verify_host = "ssl://buy.itunes.apple.com";
 
 $json='{"receipt-data" : "'.$receipt.' }';
 //opening socket to itunes
 $fp = fsockopen ($verify_host, 443, $errno, $errstr, 30);
 if (!$fp) 
 {
  // HTTP ERROR
  return false;
 } 
 else
 { 
  //iTune's request url is /verifyReceipt     
  $header = "POST /verifyReceipt HTTP/1.0\r\n";
  $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $header .= "Content-Length: " . strlen($json) . "\r\n\r\n";
  fputs ($fp, $header . $json);
  $res = '';
  while (!feof($fp)) 
  {
   $step_res = fgets ($fp, 1024);
   $res = $res . $step_res;
  }
  fclose ($fp);
  //taking the JSON response
  $json_source = substr($res, stripos($res, "\r\n\r\n{") + 4);
  //decoding
  $app_store_response_map = json_decode($json_source);
  $app_store_response_status = $app_store_response_map->{'status'};
  if ($app_store_response_status == 0)//eithr OK or expired and needs to synch
  {
   //here are some fields from the json, btw.
   $json_receipt = $app_store_response_map->{'receipt'};
   $transaction_id = $json_receipt->{'transaction_id'};
   $original_transaction_id = $json_receipt->{'original_transaction_id'};
   $json_latest_receipt = $app_store_response_map->{'latest_receipt_info'};
   return true;
  }
  else
  {
   return false;
  }
 }
}





원본 : https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/RenewableSubscriptions/RenewableSubscriptions.html

Table 7-1  Status codes for auto-renewable subscriptions

Status Code

Description

21000

The App Store could not read the JSON object you provided.

21002

The data in the receipt-data property was malformed.

21003

The receipt could not be authenticated.

21004

The shared secret you provided does not match the shared secret on file for your account.

21005

The receipt server is not currently available.

21006

This receipt is valid but the subscription has expired. When this status code is returned to your server, the receipt data is also decoded and returned as part of the response.

21007

This receipt is a sandbox receipt, but it was sent to the production service for verification.

21008

This receipt is a production receipt, but it was sent to the sandbox service for verification.

표 7-1   자동 재생 구독에 대한 상태 코드

상태 코드

기술

21000

앱 스토어가 제공 한 JSON 객체를 읽을 수 없습니다.

21002

수신 데이터 속성의 데이터 형식이 잘못되었습니다.

21003

영수증 인증 할 수 없습니다.

21004

당신이 제공하는 공유 비밀은 귀하의 계정에 대한 파일의 공유 비밀과 일치하지 않습니다.

21005

수신 서버는 현재 사용할 수 없습니다.

21006

이 영수증은 유효하지만 구독이 만료되었습니다. 이 상태 코드는 서버에 반환 될 때, 수신 데이터는 디코딩과 응답의 일부로 반환됩니다.

21007

이 영수증은 샌드 박스 영수증이지만 확인을 위해 생산 서비스로 전송되었습니다.

21008

이 영수증은 제품 수령이지만 확인을 위해 샌드 박스 서비스로 전송되었습니다.



2013/08/29 11:38 2013/08/29 11:38
Posted
Filed under 프로그래밍/PHP

이번 프로젝트는 100% restful API 이기때문에 기존에 사용하던 CI에서 우리나라에서 매우 생소한
SLIM Framework(http://www.slimframework.com)을 사용하기로 했다.

이런류를 마이크로 프레임워크라고 하는데 그중에 SLIM이 restful 지원이 원할하고 속도도 매우 빠르다.
다만...기능이 CI처럼 많진 않다. 뭐 마이크로니까...

http://systemsarchitect.net/performance-benchmark-of-popular-php-frameworks/

근데 CI보다 빠르다던 라라벨이 어째서...


NGINX와 같이 사용하는데 기존 CI 설정대로 하면 $_GET에서 문제가 생긴다.
$_GET 첫번째에 무조건 /v1/aaa/bbb 풀경로가 들어가있다.

이걸 해결하기 위해서는
try_files $uri $uri/ /index.php?$query_string;
이렇게 뒤에 $query_string 으로 해주면 된다.

2013/08/24 16:57 2013/08/24 16:57
Posted
Filed under 프로그래밍/PHP
Zend Studio 10.1을 설치했는데 같이 설치한 Eclipse Color Theme가 항상 있던 자리에 나타나질 않는다
찾아보니 10.1의 버그다.

기존 설치된 Eclipse Color Theme는 체크를 풀고 삭제한다.

Install New Software -> Work with 에
http://eclipse-color-theme.github.io/update/
입력하고 설치한다.

그럼 항상 있던 자리에 다시 나타날것이다.


http://forums.zend.com/viewtopic.php?f=59&t=110918

2013/07/18 15:00 2013/07/18 15:00
Posted
Filed under 프로그래밍/PHP

PHP_EOL (string)

The correct 'End Of Line' symbol for this platform. Available since PHP 4.3.10 and PHP 5.0.2



PHP의 내장 상수 PHP_EOL는 줄바꿈을 뜻한다.

echo '테스트', PHP_EOL;

해보면 <br>이 아닌 실제로 줄바꿈을 해준다

예전에 많이들 사용한 \n 이런거
2013/07/05 18:32 2013/07/05 18:32
Posted
Filed under 프로그래밍/PHP

str_pad

(PHP 4 >= 4.0.1, PHP 5)

str_pad문자열을 지정한 길이가 되도록 다른 문자열로 채웁니다

string str_pad ( string $input , int $pad_length [, string $pad_string [, int $pad_type ]] )

<?php
$input 
"Alien"
;
echo 
str_pad($input10);                      
// "Alien     "을 생성.
echo str_pad($input10"-="STR_PAD_LEFT);  
// "-=-=-Alien"을 생성.
echo str_pad($input10"_"STR_PAD_BOTH);   
// "__Alien___"을 생성.
echo str_pad($input"___");               
// "Alien_"을 생성.
?>


iconv

(PHP 4 >= 4.0.5, PHP 5)

iconvConvert string to requested character encoding

string iconv ( string $in_charset , string $out_charset , string $str )

<?php
$text 
"안녕";

echo 
'Original : '$textPHP_EOL;
echo 
'TRANSLIT : 'iconv("UTF-8""EUC-KR//TRANSLIT"$text), PHP_EOL;
echo 
'IGNORE   : 'iconv("UTF-8""EUC-KR//IGNORE"$text), PHP_EOL;
echo 
'Plain    : 'iconv("UTF-8""EUC-KR"$text), PHP_EOL;

echo 'Plain    : 'iconv("EUC-KR""UTF-8"$text), PHP_EOL;


?>

2013/07/05 18:22 2013/07/05 18:22
Posted
Filed under 프로그래밍/PHP

* notice에러 방지
$ret = $arr[var];
-> $ret = $arr['var'];


* notice에러 방지
if ($_POST['var'])
-> if (isset($_POST['var']))


* 남용하면 이해할수 없는 코드가 됨
isset($_POST['var'])? $_POST['var']:NULL;
-> 삼항연산자는 남용하지 않는다.


* 무한루프 방지
for($i=0; $i<$max; $i++) {
-> for($i=0, $max = count($loop); $i<$max; $i++) {


* 메모리 절약
$msg = '안녕하세요';
echo $msg;
-> echo '안녕하세요';


* 에러 방지
echo "안녕 $msg";
-> echo '안녕 '.$msg;


foreach가 빠르다

explode가 빠르다

모든 변수는 선언하지 않은채 사용하면 notice에러가 발생한다.

2013/07/04 10:34 2013/07/04 10:34
Posted
Filed under 프로그래밍/PHP
개발을 하다보면 설정파일이 필요할때가 있다
프레임웍을 사용하면 자체적으로 별도의 설정파일을 세팅할수 있게 지원하지만 네이티브로 개발할경우
많이 사용하는 방식을 소개한다.

parse_ini_file

설정파일 내용은 기본적으로 php의 ini파일 형태이고
; This is a sample configuration file
; Comments start with ';', as in php.ini

[first_section]
one = 1
five = 5
animal = BIRD

[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"

[third_section]
phpversion[] = "5.0"
phpversion[] = "5.1"
phpversion[] = "5.2"
phpversion[] = "5.3"

 

사용방법은

<?php
$ini_array parse_ini_file("sample.ini"true);
echo $ini_array['first_section']['one'];
?>




배열의 형태로 사용한다.
두번째인자의 true는 그룹명까지 결과에 포함하겠냐는거다


ini파일 노출이 껄그러우면 파일을 php로 만들어버리면 된다
 ;<? /*
; This is a sample configuration file
 ; Comments start with ';', as in php.ini

 [first_section]
 one = 1
 five = 5
 animal = BIRD

 [second_section]
 path = "/usr/local/bin"
 URL = "http://www.example.com/~username"

 [third_section]
 phpversion[] = "5.0"
 phpversion[] = "5.1"
 phpversion[] = "5.2"
 phpversion[] = "5.3"
;*/?>

2013/07/02 09:47 2013/07/02 09:47
Posted
Filed under 프로그래밍/PHP

잘돌아가던게 php 5.4로 업그레이드후 오류가 뜬다

2013/06/09 12:46:16 [error] 2952#0: *11681 FastCGI sent in stderr: "PHP message: PHP Fatal error:
Call-time pass-by-reference has been removed in /home/miyu/html/zboard/zboard.php on line 197"
while reading response header from upstream

 

&$error 와 같이  reference 처리된것은 모두 에러처리 되고 프로그램이 중단된다.
$error 와 같이 모든 코드를 교체해야한다.

예전에는 php.ini에서 allow_call_time_pass_reference = On으로 처리했지만
5.4부터는 사라졌다.

더불어 globals_register와 magic_quotes도 사라졌다.

The ini option allow_call_time_pass_reference was removed
Register globals, magic quotes and safe mode were removed

 

2013/06/09 13:21 2013/06/09 13:21
Posted
Filed under 프로그래밍/PHP
PHP 5.4.15로 업그레이드를 했다
근데 기존에 없던 옵션이 생겼네?
security.limit_extensions 라는 놈이다

php-fpm.conf 을 열어보면
;security.limit_extensions = .php .php3 .php4 .php5

이렇게 되어있을것이다.
주석을 풀어주고 php코드가 들어간 확장자를 추가해준다.

security.limit_extensions = .php .php3 .php4 .php5 .htm .html

기본값이 .php 이기때문에 다른게 들어오면 막아버리는것이다.


2013/05/30 01:21 2013/05/30 01:21
Posted
Filed under 프로그래밍/PHP
네이버 일본어 번역기를 몰래 사용하다가 차단당했는지 언젠가부터 안된다.ㅋㅋㅋ
구글은 유료로 바꼈고....
뭐 없나 찾아봤더니 마소 빙(Bing)에서 번역기를 무료로 사용할수 있다.
Microsoft Translator인데 이게 그냥 사용하기에는 사용방법이 어렵네?

간단하게 사용하는 방법은..

<?
  $trans_mode="&To=%27ko%27&From=%27ja%27";
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, 'https://api.datamarket.azure.com/Data.ashx/Bing/MicrosoftTranslator/v1/Translate?Text=%27'.urlencode($msg).'%27'.$trans_mode.'&$top=100&$format=Raw');
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Basic API코드'));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  $msg_trans=strip_tags(curl_exec($ch));
?>


2013/02/19 11:42 2013/02/19 11:42
Posted
Filed under 프로그래밍/PHP
function __construct(){
생성자
}

function __destruct(){
소멸자
}

class명과 같은 function은 __construct 다음에 실행



<?
class BaseClass {    //부모클래스[BaseClass]
     function __construct()
     {
         print "BaseClass 클래스의 constructor(생성자)\n";
     }
     function __destruct()
     {
         print "BaseClass 클래스의 destructor(소멸자)\n";
     }
}
class SubClass extends BaseClass {  //상속받은 클래스[SubClass]
     function __construct()
     {
         parent::__construct();
         print "SubClass 클래스의 constructor(생성자)\n";
     }
     function __destruct()
     {
         parent::__destruct();
         print "Subclass 클래스의 destructor(소멸자)\n";
     }
}

$obj=new SubClass;  //상속받은 클래스 호출
?>
2013/02/19 11:22 2013/02/19 11:22