[PHP - Laravel] 팝빌 전자명세서 SDK 튜토리얼

Laravel 프레임워크를 사용하는 환경에서 팝빌 PHP-Laravel SDK를 적용하여 전자명세서 즉시발행(RegistIssue) 함수를 구현하는 예시입니다.

1. Popbill SDK Composer 추가 팝빌 PHP SDK Laravel 예시 개발 환경 - CentOS v6.8 | PHP v7.1.16 | Laravel v5.7

① 팝빌 PHP SDK를 추가하기 위해 Laravel 프로젝트의 composer.json 파일의 require 필드 오브젝트에 Popbill SDK 정보를 추가합니다.

 {
   "name" : "laravel/laravel" ,
   "type" : "project" ,
   "description" : "The Laravel Framework." ,
   "keywords" : [
     "framework" ,
     "laravel"
   ],
   "license" : "MIT" ,
   "require" : {
     "php" : "^7.1.3" ,
     "fideloper/proxy" : "^4.0" ,
     "laravel/framework" : "5.7.*" ,
     "laravel/tinker" : "^1.0" ,
     "linkhub/popbill" : "^1.13.1"
   },
   // 생략..

② composer.json 파일 수정후 composer update 커멘드를 실행하여 popbill 패키지를 설치합니다.

③ 전자명세서 SDK의 환경설정을 위해 laravel 프로젝트 config 폴더에 popbill.php 파일을 추가합니다.

연동신청시 발급받은 인증정보로 링크아이디(LinkID)와 비밀키(SecretKey) 값을 변경이 필요합니다.
Window 계열 OS 환경에서 APM을 통해 개발환경을 구성한 경우 LINKHUB_COMM_MODE 상수의 값을 "STREAM"으로 변경합니다.

<?php
return [

    // 파트너 신청시 발급받은 링크아이디
    'LinkID' => 'TESTER',

    // 파트너 신청시 발급받은 비밀키
    'SecretKey' => 'SwWxqU+0TErBXy/9TVjIPEnI0VTUMMSQZtJf3Ed8q3I=',

    // 통신방식 기본은 CURL , PHP curl 모듈 사용에 문제가 있을 경우 STREAM 기재가능.
    // STREAM 사용시에는 php.ini의 allow_url_fopen = on 으로 설정해야함.
    'LINKHUB_COMM_MODE' => 'CURL',

    // 연동환경 설정값, 개발용(true), 상업용(false)
    'IsTest' => true,

    // 인증토큰의 IP제한기능 사용여부, 권장(true)
    'IPRestrictOnOff' => true,

    // 팝빌 API 서비스 고정 IP 사용여부(GA), true-사용, false-미사용, 기본값(false)
    'UseStaticIP' => false,
];

2. 전자명세서 즉시발행(RegistIssue) 함수 구현

① Controller를 추가하고 클래스 생성자(__construct)에 팝빌 서비스 클래스 초기화 코드와 RegistIssue 함수를 추가합니다.

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use Linkhub\LinkhubException;
use Linkhub\Popbill\JoinForm;
use Linkhub\Popbill\CorpInfo;
use Linkhub\Popbill\ContactInfo;
use Linkhub\Popbill\ChargeInfo;
use Linkhub\Popbill\PopbillException;

use Linkhub\Popbill\PopbillStatement;
use Linkhub\Popbill\Statement;
use Linkhub\Popbill\StatementDetail;


class TestController extends Controller
{
  public function __construct() {

    // 통신방식 설정
    define('LINKHUB_COMM_MODE', config('popbill.LINKHUB_COMM_MODE'));

    // 전자명세서 서비스 클래스 초기화
    $this->PopbillStatement = new PopbillStatement(config('popbill.LinkID'), config('popbill.SecretKey'));

    // 연동환경 설정값, 개발용(true), 상업용(false)
    $this->PopbillStatement->IsTest(config('popbill.IsTest'));

    // 인증토큰의 IP제한기능 사용여부, 권장(true)
    $this->PopbillStatement->IPRestrictOnOff(config('popbill.IPRestrictOnOff'));

    // 팝빌 API 서비스 고정 IP 사용여부(GA), true-사용, false-미사용, 기본값(false)
    $this->PopbillStatement->UseStaticIP(config('popbill.UseStaticIP'));
  }

  public function RegistIssue(){

    // 팝빌 회원 사업자번호, '-' 제외 10자리
    $testCorpNum = '1234567890';

    // 전자명세서 문서번호
    // 1~24자리 숫자, 영문, '-', '_' 조합으로 사업자별로 중복되지 않도록 구성
    $mgtKey = '20190828-021';

    // 명세서 종류코드 - 121(거래명세서), 122(청구서), 123(견적서) 124(발주서), 125(입금표), 126(영수증)
    $itemCode = '121';

    // 메모
    $memo = '즉시발행 메모';

    // 전자명세서 객체 생성
    $Statement = new Statement();

    /************************************************************
     *                       전자명세서 정보
     ************************************************************/

    // [필수] 기재상 작성일자
    $Statement->writeDate = '20190828';

    // [필수] (영수, 청구) 중 기재
    $Statement->purposeType = '영수';

    // [필수]  과세형태, (과세, 영세, 면세) 중 기재
    $Statement->taxType = '과세';

    // 맞춤양식코드, 미기재시 기본양식으로 처리
    $Statement->formCode = '';

    // 명세서 종류 코드
    $Statement->itemCode = $itemCode;

    // 전자명세서 문서번호
    $Statement->mgtKey = $mgtKey;

    /************************************************************
     *                         공급자 정보
     ************************************************************/
    $Statement->senderCorpNum = $testCorpNum;
    $Statement->senderTaxRegID = '';
    $Statement->senderCorpName = '공급자 상호';
    $Statement->senderCEOName = '공급자 대표자 성명';
    $Statement->senderAddr = ' 공급자 주소';
    $Statement->senderBizClass = '공급자 업종';
    $Statement->senderBizType = '공급자 업태';
    $Statement->senderContactName = '공급자 담당자명';
    $Statement->senderTEL = '070-7070-0707';
    $Statement->senderHP = '010-000-2222';
    $Statement->senderEmail = 'test@test.com';

    /************************************************************
     *                         공급받는자 정보
     ************************************************************/
    $Statement->receiverCorpNum = '8888888888';
    $Statement->receiverTaxRegID = '';  // 공급받는자 종사업장 식별번호, 필요시 기재. 형식은 숫자 4자리
    $Statement->receiverCorpName = '공급받는자 상호';
    $Statement->receiverCEOName = '공급받는자 대표자 성명';
    $Statement->receiverAddr = '공급받는자 주소';
    $Statement->receiverBizClass = '공급받는자 업종';
    $Statement->receiverBizType = '공급받는자 업태';
    $Statement->receiverContactName = '공급받는자 담당자명';
    $Statement->receiverTEL = '010-0000-1111';
    $Statement->receiverHP = '010-1111-2222';
    $Statement->receiverEmail = 'test@test.com'; // 수신자 이메일주소, 팝빌 개발환경에서 테스트하는 경우에도 안내 메일이 전송되므로, 실제 거래처의 메일주소가 기재되지 않도록 주의

    /************************************************************
     *                       전자명세서 기재정보
     ************************************************************/
    $Statement->supplyCostTotal = '200000'; // [필수] 공급가액 합계
    $Statement->taxTotal = '20000'; // [필수] 세액 합계
    $Statement->totalAmount = '220000'; // [필수] 합계금액 (공급가액 합계+세액합계)
    $Statement->serialNum = '123';  // 기재상 일련번호 항목
    $Statement->remark1 = '비고1';
    $Statement->remark2 = '비고2';
    $Statement->remark3 = '비고3';
    $Statement->businessLicenseYN = False;  // 사업자등록증 첨부 여부
    $Statement->bankBookYN = False; // 통장사본 첨부 여부
    $Statement->smssendYN = False;  // 발행시 안내문자 전송여부

    /************************************************************
     *                       상세항목(품목) 정보
     ************************************************************/
    $Statement->detailList = array();
    $Statement->detailList[0] = new StatementDetail();
    $Statement->detailList[0]->serialNum = '1'; // 품목 일련번호 1부터 순차 기재
    $Statement->detailList[0]->purchaseDT = '20190828'; // 거래일자 yyyyMMdd
    $Statement->detailList[0]->itemName = '품명';
    $Statement->detailList[0]->spec = '규격';
    $Statement->detailList[0]->unit = '단위';
    $Statement->detailList[0]->qty = '1000';  // 수량
    $Statement->detailList[0]->unitCost = '1000000';
    $Statement->detailList[0]->supplyCost = '10000000';
    $Statement->detailList[0]->tax = '1000000';
    $Statement->detailList[0]->remark = '11,000,000';
    $Statement->detailList[0]->spare1 = '1000000';
    $Statement->detailList[0]->spare2 = '1000000';
    $Statement->detailList[0]->spare3 = 'spare3';
    $Statement->detailList[0]->spare4 = 'spare4';
    $Statement->detailList[0]->spare5 = 'spare5';

    $Statement->detailList[1] = new StatementDetail();
    $Statement->detailList[1]->serialNum = '2'; // 품목 일련번호 순차기재
    $Statement->detailList[1]->purchaseDT = '20190828'; // 거래일자 yyyyMMdd
    $Statement->detailList[1]->itemName = '품명';
    $Statement->detailList[1]->spec = '규격';
    $Statement->detailList[1]->unit = '단위';
    $Statement->detailList[1]->qty = '1';
    $Statement->detailList[1]->unitCost = '100000';
    $Statement->detailList[1]->supplyCost = '100000';
    $Statement->detailList[1]->tax = '10000';
    $Statement->detailList[1]->remark = '비고';
    $Statement->detailList[1]->spare1 = 'spare1';
    $Statement->detailList[1]->spare2 = 'spare2';
    $Statement->detailList[1]->spare3 = 'spare3';
    $Statement->detailList[1]->spare4 = 'spare4';
    $Statement->detailList[1]->spare5 = 'spare5';

    /************************************************************
     * 전자명세서 추가속성
     * - 추가속성에 관한 자세한 사항은 "[전자명세서 API 연동매뉴얼] >
     *   5.2. 기본양식 추가속성 테이블"을 참조하시기 바랍니다.
     ************************************************************/
    $Statement->propertyBag = array(
        'Balance' => '50000',
        'Deposit' => '100000',
        'CBalance' => '150000'
    );

    try {
        $result = $this->PopbillStatement->RegistIssue($testCorpNum, $Statement, $memo);
        $code = $result->code;
        $message = $result->message;
    }
    catch(PopbillException $pe) {
        $code = $pe->getCode();
        $message = $pe->getMessage();
    }

    return view('PResponse', ['code' => $code, 'message' => $message]);
  }
}

② 호출 결과를 출력하는 페이지(PResponse.blade.php)를 resources/views/에 추가합니다.

<html xmlns=" http://www.w3.org/1999/xhtml ">
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title>Popbill Statement Response.</title>
  </head>
  <body>
    <div>
      <p>Response</p>
      <br/>
      <fieldset>
        <ul>
          <li>code (응답코드) : {{ $code }}</li>
          <li>message (응답메시지) : {{ $message }}</li>
        </ul>
      </fieldset>
    </div>
  </body>
</html>

③ 아래 코드를 참고하여 routes/web.php 파일에 route 부분을 입력합니다.

<?php
// 생략..

Route::get('/RegistIssue ', 'TestController@RegistIssue');

// 생략..

④ 웹브라우저 페이지를 호출하여 함수호출 결과를 확인합니다.

팝빌 PHP Laravel SDK 전자명세서 Example

기술지원센터

팝빌 기술지원은 유선, 메일, 원격지원 등 다양한 채널을 통해 제공됩니다.

T. 1600-9854   E. code@linkhub.co.kr

연동문의