大概一年多前串了綠界金流的外掛,當時其實也有想試試看串物流,但因為看起來有點複雜加上各種偷懶到現在才補坑,經過一年的成長其實發現沒有當初想像的那麼難但也沒有多簡單而且還有很多坑。
先附上外掛載點:
https://drive.google.com/drive/folders/1PcfhV4skRgFMiT9YhK_f-PyV7sH2gztW?usp=sharing
跟綠界的物流界接說明文件:
https://www.ecpay.com.tw/Content/files/ecpay_030.pdf
這次的範例外掛主要流程如下:
- 點下按鈕後 -> 開啟綠界超商api
- 接收到綠界超商api使用者選完回傳的商店資訊後 -> 建立物流訂單
外掛使用方式:
- 下載後安裝
- 建立一個頁面 輸入短代碼 [c2c-test type=”c2c_btn_test”]
- 點選按鈕”建立物流訂單”
開啟超商地圖api程式碼說明:
其實跟一般的api沒什麼兩樣,只是可能因為綠界那邊太少更新了,在串的時候就發現幾個點
- ServerReplyURL IsCollection ->這個欄位在綠界的說明文件是要填 Y or N 實際上要填 YES or NO
- LogisticsSubType ->這個欄位看文件說明會以為要切成C2C應該要改成UNIMARTC2C,實際上這樣寫會導致程式錯誤,應該要填寫 UNIMART_C2C即可正常運作
- ServerReplyURL->綠界api回傳超商資料的網址
function createC2COrder(){
// 一般物流訂單建立
require_once(ECPAY_C2C_TEST_DIR.'/SDK/Ecpay.Logistic.Integration.php');
try {
$AL = new EcpayLogistics();
$AL->Send = array(
'MerchantID' => '2000132',
'MerchantTradeNo' => 'no' . date('YmdHis'),
'LogisticsSubType' => EcpayLogisticsSubType::UNIMART,
'IsCollection' => EcpayIsCollection::NO,
'ServerReplyURL' => get_home_url(). '/ServerReplyURL.php',
'ExtraData' => '測試額外資訊',
'Device' => EcpayDevice::PC
);
// CvsMap(Button名稱, Form target)
$html = $AL->CvsMap('電子地圖(統一)');
echo $html;
exit();
} catch(Exception $e) {
echo $e->getMessage();
exit();
}
}
建立物流訂單api程式碼說明:
- LogisticsC2CReplyURL -> 建立訂單失敗會回傳的網址
- ClientReplyURL -> 訂單物流狀態更改時會回傳的網址
if(strpos($_SERVER['REQUEST_URI'], '/ServerReplyURL')===0||strpos($_SERVER['REQUEST_URI'], '/ServerReplyURL')>0){
require_once(ECPAY_C2C_TEST_DIR.'/SDK/Ecpay.Logistic.Integration.php');
echo $_POST["MerchantID"]."\r\n";
echo $_POST["MerchantTradeNo"]."\r\n";
echo $_POST["LogisticsSubType"]."\r\n";
echo $_POST["CVSStoreID"]."\r\n";
echo $_POST["CVSStoreName"]."\r\n";
echo $_POST["CVSAddress"]."\r\n";
echo $_POST["CVSTelephone"]."\r\n";
echo $_POST["CVSOutSide"]."\r\n";
echo $_POST["ExtraData"]."\r\n";
//這些是超商地圖api選擇完後會回傳的參數
try {
$AL = new EcpayLogistics();
$AL->HashKey = '5294y06JbISpM5x9';
$AL->HashIV = 'v77hoKGq4kWxNNIS';
$AL->Send = array(
'MerchantID' => '2000132',
'MerchantTradeNo' => 'no' . date('YmdHis'),
'MerchantTradeDate' => date('Y/m/d H:i:s'),
'LogisticsType' => EcpayLogisticsType::CVS,
'LogisticsSubType' => EcpayLogisticsSubType::UNIMART,
'GoodsAmount' => 1500,
'CollectionAmount' => 10,
'IsCollection' => EcpayIsCollection::NO,
'GoodsName' => '測試商品',
'SenderName' => '測試寄件者',
'SenderPhone' => '0226550115',
'SenderCellPhone' => '0911222333',
'ReceiverName' => '測試收件者',
'ReceiverPhone' => '0226550115',
'ReceiverCellPhone' => '0933222111',
'ReceiverEmail' => 'test_emjhdAJr@test.com.tw',
'TradeDesc' => '測試交易敘述',
'ServerReplyURL' => get_home_url() . '/ServerReplyURL.php',
'ClientReplyURL' => get_home_url(),
'LogisticsC2CReplyURL' => get_home_url() . '/LogisticsC2CReplyURL.php',
'Remark' => '測試備註',
'PlatformID' => '',
);
$AL->SendExtend = array(
'ReceiverStoreID' => '991182',
'ReturnStoreID' => '',
);
// CreateShippingOrder()
$Result = $AL->CreateShippingOrder();
echo '<pre>' . print_r($Result, true) . '</pre>';
exit();
} catch(Exception $e) {
echo $e->getMessage();
exit();
}
}
本次範例外掛只針對最核心的部分來做說明跟講解,各位小夥伴可依據自己開發的程式需求及功能做架構上的調整,有問題的話歡迎留言一起討論 。