iT邦幫忙

0

PHP紀錄: Api串接綠界 ECpay 線上發票

  • 分享至 

  • xImage
  •  

前情提要:

因應手上接到的專案,
需做發票廠商的置換,
但是對PHP也不熟悉,
故順便做個紀錄紀錄起來。


綠界電子發票串接說明文件

https://www.ecpay.com.tw/Content/files/ecpay_004.pdf

線上測試程式碼

https://paiza.io/projects/dSoC3N7pYCvEfrm0lKjQRg?language=php

注意

PHP urlencode function 會將 ! 字元編碼成 %21,不符合「.NET 編碼(ecpay)」,所以在 PHP urlencode 後需用 str_replace function 將%21 轉回 ! 字元。
以下僅以 PHP 轉換範例說明:
$sMacValue = str_replace('%21', '!', $sMacValue);
$sMacValue = str_replace('%2a', '*', $sMacValue);
$sMacValue = str_replace('%28', '(', $sMacValue);
$sMacValue = str_replace('%29', ')', $sMacValue);
其它程式語言的轉換功能,請看串接說明文件內該程式語言的編碼轉換規則改寫。

範例

<?php
    date_default_timezone_set('Asia/Taipei');

    $CustomerName = '測試';
    $CustomerAddr = '台北市';
    $CustomerEmail = "abc@ecpay.com.tw";
    $ItemName = '測試';
    $ItemWord = '支';
    $TimeStamp = strtotime("now");
    $RelateNumber = strtotime("now");
    
    //  ECPay_EInvoice的Request參數建立
    //  參照綠界電子發票串接說明文件,說明中有說明部分參數需將參數值做 UrlEncode
    $ECPay_EInvoice = array(
        'CustomerName' => urlencode($CustomerName),
        'CustomerAddr' => urlencode($CustomerAddr),
        'CustomerEmail' => str_replace('@','%40',$CustomerEmail),
        'TimeStamp' => $TimeStamp,
        'MerchantID' => '2000132',
        'RelateNumber' => $RelateNumber,
        'TaxType' => '1',
        'SalesAmount' => 100,
        'ItemCount' => '1',
        'ItemPrice' => '100',
        'ItemAmount' => '100',
        'InvType' => '07',
        'LoveCode' => '168001',
        'Print' => '0',
        'Donation' => '1',
    );
    
    //  依照array的key去做順序排序
    ksort($ECPay_EInvoice);
    
    //  利用json_encode將資料轉成JSON格式
    $data_json = json_encode($ECPay_EInvoice, JSON_UNESCAPED_UNICODE);
    
    //  利用str_replace以其他字符替换字符串中的一些字符
    $data_json = str_replace('{','',$data_json);
    $data_json = str_replace('}','',$data_json);
    $data_json = str_replace('"','',$data_json);
    $data_json = str_replace(':','=',$data_json);
    $data_json = str_replace(',','&',$data_json);
    
    //  塞入HashKey以及HashIV
    $originStr = 'HashKey=ejCk326UnaZWKisg&' .$data_json. '&HashIV=q9jcZX8Ib9LM8wYk';
    
    //  以urlencode做URI(Uniform Resource Identifier)的轉換
    $originStr = urlencode($originStr);
    
    //  轉為小寫
    $originStr = strtolower($originStr);
    
    //  利用str_replace以其他字符替换字符串中的一些字符
    $originStr = str_replace('%20', '+', $originStr);
    $originStr = str_replace('%21', '!', $originStr);
    $originStr = str_replace('%2a', '*', $originStr);
    $originStr = str_replace('%2d', '-', $originStr);
    $originStr = str_replace('%2e', '.', $originStr);
    $originStr = str_replace('%28', '(', $originStr);
    $originStr = str_replace('%29', ')', $originStr);
    $originStr = str_replace('%5f', '_', $originStr);
    
    //  MD5加密方式
    $hashed = hash("md5",$originStr);
    
    //  轉為大寫
    $checkMacValue = strtoupper($hashed);
    
    //  實際測試,僅有在做CheckMacValue時,需將參數值做 UrlEncode,但說明文件內未有記載,故需重新將部分參數塞至Array內
    $ECPay_EInvoice['CheckMacValue']= $checkMacValue;
    $ECPay_EInvoice['ItemName']= $ItemName;
    $ECPay_EInvoice['ItemWord']= $ItemWord;
    $ECPay_EInvoice['CustomerEmail']= $CustomerEmail;
    $ECPay_EInvoice['CustomerName']= $CustomerName;
    $ECPay_EInvoice['CustomerAddr']= $CustomerAddr;

    //  API URL 
    $EInvoice_URL = 'https://einvoice-stage.ecpay.com.tw/Invoice/Issue';
    
    //  創建一個新的cURL資源
    $ch = curl_init($EInvoice_URL);
    
    function httpRequest($api, $data) {
      $ch = curl_init($api);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
      curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      $result = curl_exec($ch);
      curl_close($ch);
      
      //  印出 result
      print_r($result);
      return json_decode($result, true);
    }
      
      $data = httpRequest($EInvoice_URL, $ECPay_EInvoice);
?>

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言