UniFi - HotSpot과 PayPal 스탠다드와 통합하기

download at 2016-11-14T21:24:01Z origin

Overview


PayPal 스탠다드 계정은 무료이므로, 기능에 제한이 존재합니다. 예를 들어, PayPal 스탠다드는 API를 사용할 수 없습니다. 즉, UniFi 컨트롤러를 직접 사용하여 PayPal 스탠다드 계정을 연결할 수 없습니다. 프로 계정은 연계가 가능하며 이 문서 를 확인해보십시오. 통합 작업을 하깅 위해서 외부 웹서버 를 통해 Paypal Instant Payment Notification (IPN) 서비스를 사용하여 성공적으로 UniFi hotspot과 PayPal 스탠다드 계정과 통합할 수 있도록 합니다.

이 통합작업이 가지고 있는 함의는 설치와 유지보수를 위한 노력이 더 많이 필요함을 의미합니다. 아키텍처에 더 많은 요소가 요구되기 때문입니다. 이 문서의 예제는 PayPal Standard Account 이 UniFi Hotspot과 통합이 될 수 있다는 것을 증명하기 위함입니다. 실제로 외부의 웹서버가 존재하지 않습니다. Ubiquiti에서는 이 기능이 올바르게 동작한다는 것만 개런티합니다. 외부의 웹서버가 올바르게 동작하고 모든 에러 내역에 올바르게 처리된다고 보장할 수 있는 것은 이 통합작업을 수행하는 본인임을 잊지 마십시오.

이 문서의 예제는 PayPal Sandbox 로 테스트를 진행합니다. 해당 환경은 개발자에게 제공되는 PayPal 환경입니다. 실제 사용하는 환경과 동일한 기능을 제공합니다.

image0

Disclaimers


  1. 통합 과정은 UniFi 컨트로러 3.2.1 버전의 커스텀 포탈 기능 상요을 기준으로 작성하였습니다. (이전 버전을 사용하고 있다면 3.2.1 버전 이상으로 업그레이드 하는 것을 고려하십시오.)
  2. 아파치2 웹서버에 SSL 설정을 한 것을 권장합니다. 이 설정은 이 문서의 범위를 초과합니다. 그러나 SSL 없이는 PayPal에서 받는 응답이 암호화 되지 않은 값을 받아서 보안적 위협이 있을 수 있습니다.
  3. 이 설정 과정은 인증을 수행하기 이전에 거의 1700만 IP 주소 접근을 처리할 수 있습니다. 이는 PayPal이 지역 기반 IP 주소와 IP 주소 라우팅 기능일 지원하기 때문입니다. 해당 지역의 관련 있는 IP 주소를 찾기 위해서는 dig, nslookup 등을 다음 도메인에 사용하십시오:
    • paypal.com
    • ipnpb.paypal.com
    • sandbox.paypal.com
    • paypalobjects.com

Steps


Part I. 외장 포탈 웹사이트를 준비합니다 .(아파치, PHP, UniFi 예제 포탈을 사용합니다)

이 예제는 Ubuntu 12.04 LTS 를 기준으로 작성하였지만, 모든 리눅스 배포판에서 동작합니다. 이 작업이 우분투를 기반으로 작성하였기 때문에 패캐지 매니저로 *aptitude*를 사용하였습니다. 다른 리눅스 배포판을 사용한다면 각 패키지 매니저의 메뉴얼을 참조하십시오. 또한 외부 웹서버는 인터넷 IP 주소와 포트 포워딩을 방화벽에 필요하다면 등록해야합니다.

  1. Apach2, PHP5를 설치합니다:

    apt-get install apache2 php5
    
  2. Apache2가 제대로 동작하고 있는지 확인하기 위해서 http://127.0.0.1 혹은 http://포탈 IP 주소 로 접속합니다. 성공적으로 실행이 되었다면 Apache2의 페이지가 로딩됩니다.

  3. /var/www 디렉토리를 포탈 페이지를 구동할 서버에 생성합니다.

    mkdir /var/www/myportal
    
  4. 해당 디렉토리로 이동합니다:

    cd /var/www
    
  5. 샘플포탈을 다운로드 받습니다:

    wget http://dl.ubnt.com/unifi/3.2.10/portal_sample_paypal.zip
    
    • 버전 넘버가 URL에 있다는 사실을 잊지 마세요
  6. 압축을 해제합니다:

    tar -xvf portal_sample_paypal.tar.gz
    
  7. 디렉토리 이름을 원하는 이름으로 변경합니다:

    mv portal_sample_paypal myportal
    
  8. 재사용할 익스텐션을 확인합니다:

    echo '<?php phpinfo(); ?>' > info.php
    
    1. http://[Portal's IP address] 로 접속합니다.

    2. Ctrl+F 를 실행합니다.

    3. "openssl" 와 "curl" 을 검색합니다.

      • OpenSSL 은 설치가 되어 있어야 하며, 기본으로 활성화 되어있어야 합니다.

      • curl 패키지가 설치 되어 있지 않다면, 다음 명령어로 설치하십시오.

        1. apt-get install curl libcurl3 libcurl3-dev php5-curl php5-mcrypt
          
        2. nano /etc/php5/apache2/php.ini
          
        3. 스크롤을 내려서 "Dynamic Extensions" 까지 커서를 이동합니다.

        4. 아래에 새로운 다음 라인을 추가합니다

          extension=curl.so
          
        5. 저장하고 수정을 종료합니다.

        6. apache2를 재시작합니다:

          service apache2 restart
          
  • 포탈 디렉토리로 이동합니다:

    cd myportal
    
  • paypal_ipn.php파일을 수정합니다:

    nano paypal_ipn.php
    
    1. Ctrl+W 를 입력합니다.

      • 서치바가 생성되며 다음을 입력합니다.

        username
        
      • 103 번째 줄로 이동되는 것을 확인할 수 있습니다.

    2. "ubnt"를 삭제하고 컨트롤러 이름으로 변경합니다. (single quote로 감싸도록 합니다)

    3. 다음 라인에 $password 의 값을 "ubnt"에서 원하는 패스워드로 교체합니다. (single quote로 감싸도록 합니다.)

    4. $baseurl을 IP 주소로 변경합니다.

    5. $site를 사이트 이름으로 변경합니다.

    6. 60,62,64 번째 줄을 확인합니다:

      if (strcmp ($_POST['option_selection1'], "8-Hour Pass") == 0) {
      } else if (strcmp ($_POST['option_selection1'], "1-Day Pass") == 0) {
      } else if (strcmp ($_POST['option_selection1'], "3-Day Pass") == 0) {
      

      해당 내용은 패키지 네임이며, 정확하게 일치해야합니다.

      다른 패키지 이름을 사용한다면, paypal_ipn.php 파일에서 이름을 변경하십시오.

      새로운 패키지를 추가하려면 else-if 구문에 새로운 내용을 추가합니다.

      패키지를 삭제하고 싶다면 해당하는 else-if 구문을 삭제합니다.

    7. 저장하고 종료합니다.

  • 로그파일과 쿠키 파일을 생성하고, 적절한 권한을 부여합니다:

    1. touch log.txt
      
    2. chmod 777 log.txt
      
    3. touch unifi_cookie.txt
      
    4. chmod 777 unifi_cookie.txt
      

Part II. PayPal 준비하기

다음 작업은 두개의 버튼을 생성합니다. 프로덕션 버튼과 샌드박스 버튼을 생성합니다. 프로덕션 버튼은 게스트로부터 실제 결제서비스를 시행할 때 사용하는 버튼이며, 샌드박스 버튼은 테스팅 및 코드를 검증할 때 사용합니다. 샌드박스 계정을 실제 사용환경에서 사용할 수 없으며, 프로덕션 버튼을 샌드박스 환경에서 사용할 수 없습니다.

샌드박스 계정 생성하기

  1. 개발자 계정을 생성합니다. https://developer.paypal.com/ 에서 생성합니다.

  2. 계정으로 로그인하면, 메뉴에서 Application으로 이동합니다.

  3. 샌드박스 계정 (Sandbox accounts)를 선택합니다.

    image1

  4. 계정 생성하기 (Create Account) 버튼을 클릭합니다.

    • 본인 설정에 맞도록 입력합니다.
    • 샌드박스 계정에 200불 이상을 적용하십시오.
  5. 생성된 이메일 주소를 사용하여 테스트를 진행합니다.

샌드박스 버튼 생성하기

이제 샌드박스 계정을 사용하여 로그인을 시도하도록 하겠습니다.

  1. https://www.sandbox.paypal.com/ 에 샌드박스 계정으로 로그인합니다.

  2. 메인페이지에서 "My Saved Buttons" 를 클릭합니다.

    image2

  3. 오른쪽 부분에서 "Create new button" 버튼을 클릭합니다.

    pp_sb2.png

  4. 아래의 그림과 같이 버튼을 구조화 할 수 있습니다.

    image4

    Item Name 은 드롭다운 베뉴의 이름이며 Price는 적절한 가격으로 설정해야 할 것입니다. 메뉴 옵션 이름은 반드시 paypal_ipn.php 에서의 이름과 동일해야합니다.

  5. create 버튼을 클릭합니다.

  6. 생성된 코드를 클립보드에 복사합니다.

  7. 포탈 서버를 다시 수정하도록 합니다.

    nano index.php
    
  8. 44-50 번째의 주석으로 이동합니다.

  9. 해당 내용을 삭제합니다.

  10. 45번째 라인부터 HTML 주속 블록에 이전에 복사한 코드를 입력합니다.

    • 포탈에 샌드박스 버튼을 확인할 수 있다면, 주석 블록을 제거하고 저장한 다음에 index.php 페이지를 다시 로드합니다.
  11. 저장하고 종료합니다.

프로덕션 버튼 생성하기

  1. https://www.paypal.com/ 에 로그인합니다.

  2. 메인 페이지에서 "Tools" 옵션을 클릭합니다.

  3. "PayPal Buttons" 옵션을 클릭합니다.

  4. 아래의 그림과 같이 구조화 되는 것을 확인할 수 있습니다.

    image5

    Item Name 은 드롭다운 베뉴의 이름이며 Price는 적절한 가격으로 설정해야 할 것입니다. 메뉴 옵션 이름은 반드시 paypal_ipn.php 에서의 이름과 동일해야합니다.

  5. Create 버튼을 클릭합니다.

  6. 생성된 코드를 클립보드에 복사합니다.

  7. 포탈 서버를 다시 수정하도록 합니다.

nano index.php
  1. 36-42 번째의 주석으로 이동합니다.
  2. 해당 내용을 삭제합니다.
  3. 37번째 라인부터 HTML 주속 블록에 이전에 복사한 코드를 입력합니다.
    • 포탈에 프로덕션 버튼울 확인할 수 있다면, 주석 블록을 제거하고 저장한 다음에 index.php 페이지를 다시 로드합니다.
  4. 저장하고 종료합니다.

버튼 확인하기

HTML 주석을 제거하면 버튼을 확인할 수 있습니다.

테스팅 목적으로 수행할 때에는 프로덕션 버튼 코드를 주석처리합니다.

프로덕션 목적으로 수행할 때에는 샌드박스 버튼 코드를 주석처리합니다.

코드를 확인하려면 다음을 수행합니다:

  1. 웹브라우저를 실행합니다.
  2. http://[포탈 IP 주소]/[/var/www 를 제외한 포탈의 경로] 로 이동합니다.

Part III. 컨트롤러 준비하기

  1. UniFi 컨트롤러에 로그인합니다.

  2. 왼쪽 위의 드롭다운 메뉴로 이동합니다.

    image6

  3. "Settings">"Guest Control">"Guest Policies" 섹션에서 "Enable Guest Portal" 를 체크합니다.

  4. "External Portal Server"를 선택합니다.

  5. 커스텀 포탈 IP 주소를 본인의 IP 주소로 입력합니다. "http://", "https://" 를 경로에 포함하지 마십시오. UniFi가 해당 내용을 입력합니다.

    image7

  6. PayPal IP 주소를 허용 서브넷 리스트에 추가합니다.

    • PayPal IP 주소는 지역 기반 주소이기 때문에 도메인에 해당하는 IP 주소를 확인해야합니다.

      • paypal.com
      • ipnpb.paypal.com
      • sandbox.paypal.com
      • paypalobjects.com
    • 다음을 통해서 확인할 수 있습니다.

      dig paypal.com
      

      포탈 서버에서 획득한 IP 주소를 붙여넣고 허용 서브넷에 A 레코드를 입력합니다. 단일 IP 주소임을 나타내기 위해서 /32를 IP 주소 마지막에 입력합니다.

    • 더 많은 내용은 다음 사이트를 통해 확인합니다: https://ppmts.custhelp.com/app/answers/detail/a_id/92

    • 대신에 다음 서브넷을 허용하도록 추가할 수 있습니다:

      1. 173.0.0.0/16
      2. 64.4.0.0/16
      3. 2.22.0.0/16
      4. 23.0.0.0/8
      • Note: 위의 서브넷을 임의로 등록하는 것은 16,973,816 주소를 인증하도록 허용하는 것과 같습니다. 그렇지만 서브넷은 모든 알려진 PayPal IP 주소를 포함하게 됩니다. 그러므로 PayPal IP 주소를 주소와 함께 저장하는 것을 권장합니다.
    • Apply를 클릭하여 UAP와 동기화를 맞추도록 합니다.

  7. "Settings">"Wireless Networks" 에서 다음과 같이 설정합니다:

    • 게스트 SSID를 설정하였다면, Edit을 클릭합니다. Guest Policy 체크박스를 선택하여 Apply를 클릭합니다.
    • 새로운 게스트 SSID를 설정해야 한다면 Create를 클릭하여 원하는 내용을 입력하고 Guest Policy 체크박스를 체크하고, Apply를 클릭합니다.

Part IV. 테스팅

새로운 포탈을 테스트하려면:

  1. nano index.php
    
  2. 샌드박스 버튼 코드가 주석을 제거하십시오.

  3. WiFi 장치를 사용하여 Guest SSID에 접속합니다.

  4. 게스트 세션을 수립하면, 웹 브라우저 탭을 생성하여 포탈에서 샌드박스 버튼이 생성되는지 확인하십시오.

    • 포탈 페이지로 이동할 수 없다면, WiFi 장치가 포탈과 통신할 수 없다는 것을 의미하며 다음 중 하나의 경우에 해당합니다:
      1. 포탈 사이트가 해당 서브넷 리스트에 포함되어 있지 않음을 의미하며, 포탈 IP 주소를 해당 서브넷에 등록합니다.
      2. 방화벽이 게스트를 포탈과의 통신 과정에서 차단할 수도 있습니다.
      3. 같은 LAN에 포탈과 컴퓨터가 존재하는지 확인하십시오.
  5. Buy Now를 클릭하여 PayPal 로그인 화면으로 이동하는지 확인합니다.

    • PayPal 로그인 화면으로 이동하지 않는다면, 허용 서브넷 리스트에 추가되었는지 확인합니다.
  6. 샌드박스 계정으로 로그인합니다.

  7. Pay 를 시도합니다.(실제 돈을 지불하지 않습니다.)

  8. UniFi 컨트롤러의 Guests 탭으로 이동합니다. 해당 화면에서 장치의 MAC 주소를 확인할 수 있어야하며, 버튼이 "Unauthorize"를 표기하고 있어야합니다.

  9. 이제 UniFi 컨트롤러에서 PayPal 스탠다드 계정을 사용할 수 있습니다!

Part V. 프로덕션

새로운 포탈에 프로덕션 모드를 설정합니다:

  1. nano index.php
    
  2. 프로덕션 버튼 코드를 주석 해제합니다.

  3. 샌드박스 버튼 코드가 주석처리 되었는지 확인합니다.

  4. 저장후에 종료합니다.

Part VI. 결론

PayPal 스탠다드 계정은 게스트 포탈과 통합할 수 있습니다. PayPal 과의 통합을 통해서 PayPal 결제 서비스를 사용할 수 있습니다. 이제 포탈에서 PayPal과 관련된 부분을 수행할 수 있으며, 단순하게 주석의 설정/해제 작업을 통해서 테스트 환경, 프로덕션 환경을 전환할 수 있습니다.

Notes


-  본 예제의 스크립트가 올바르게 동작함을 보장하지 않습니다. 예제는 프로덕션 네트워크 환경에서 사용하면 안됩니다. 이 문서의 대상 독자는 PayPal 서비스와 HTML/PHP에 대한 지식이 충분하다고 가정합니다. 이 문서는 예제이며, 환경에 맞도록 적절하게 수정하는 작업이 필요합니다.

  1. UniFi FAQ
  2. Paypal 샌드박스 사용자 가이드
  3. Paypal Instant Payment Notification 가이드
  4. Super Special Thanks to UBNT-David & UBNT-Jamie.
  5. Special thanks to JustTechmmaxmal , FreenetAntennas