[ PHP ] – 歐付寶金流串接範例

注意:從2018/1/1 起將不再回覆此文,相關金流串接 請直接詢問歐付寶官網,因本人很久沒使用歐付寶沒辦法再回覆相關問題。感謝各位支持

最後修改日期 2016/06/21
最後測試日期 2016/06/21

重點提醒:
若你是使用歐付寶SDK 是不用自已 CheckMacValue 他的class已有做確認了。

假設你的主機網址為 http://192.168.1.1

1.下載歐付寶 SDK PHP版本
https://github.com/allpay/PHP
開啟頁面後 點選右方 Download ZIP

下載後本機端解壓縮 開啟資料夾 AioSDK
複製該資料夾中的 AllPay.Payment.Integration.php
到你的主機中
例如放在這裡
http://192.168.1.1/AllPay.Payment.Integration.php

2.產生訂單 order_add.php

ServiceURL ="https://payment-stage.allpay.com.tw/Cashier/AioCheckOut ";
$oPayment->HashKey = "5294y06JbISpM5x9";//這是測試帳號專用的不用改它
$oPayment->HashIV = "v77hoKGq4kWxNNIS";//這是測試帳號專用的不用改它
$oPayment->MerchantID = "2000132";//這是測試帳號專用的不用改它
$time=time();
/* 基本參數 */
$oPayment->Send['MerchantTradeNo'] = $time;//這邊是店家端所產生的訂單編號
$oPayment->Send['MerchantTradeDate'] = date("Y/m/d H:i:s");
$oPayment->Send['TotalAmount'] = "1000";//付款總金額
$oPayment->Send['TradeDesc'] = "年終慶大特賣";//交易敘述
$oPayment->Send['ChoosePayment'] = PaymentMethod::ALL;//付款方式 這邊是開啟所有付款方式讓消費者自行選擇
$oPayment->Send['ReturnURL'] = "http://192.168.1.1/return.php";//請填入你主機要接受訂單付款後狀態 回傳的程式名稱 記住 該網址需能對外
$oPayment->Send['IgnorePayment'] ="Alipay";//把不的付款方式取消掉
//$oPayment->Send['DeviceSource'] ="M";//參數M表示使用行動版的頁面 不設定此參數 預設就是電腦版顯示

$oPayment->SendExtend['PaymentInfoURL']="http://192.168.1.1/payment_info.php";//接受訂單狀態 回傳程式名稱 可在此程式內將付款方式寫入你的訂單中 payment_info.php 與 return.php 程式內容一樣
// 加入選購商品資料。
array_push($oPayment->Send['Items'], array('Name' => "產品名稱", 'Price' => (int)"100", 'Currency' => "元", 'Quantity' => (int) "1", 'URL' => "http://TEST.com.tw/"));

/* 產生訂單 */
$oPayment->CheckOut();
/* 產生產生訂單 Html Code 的方法 */
$szHtml = $oPayment->CheckOutString();

}
catch (Exception $e)
{ // 例外錯誤處理。
throw $e;
}
?>

在網址列輸入 http://192.168.1.1/order_add.php
應該就會跳到歐付寶的付款頁面
我們選擇 信用卡付款

信用卡資料填入 (以下皆為 歐付寶提供的 測試資料)

卡號 4311-9522-2222-2222
安全碼 222
到期年月 月隨便填 年也是但要選大於今年
手機請填你真實的手機 等一下要收驗證碼用的
按送出後 會跳到下一頁請你填入手機驗證碼 請等約一分鐘就會收到 驗證碼簡訊
填入驗證碼後 即付款完成

3.查詢訂單是否存在
先登入測試的歐付寶廠商管理後台
https://vendor-stage.allpay.com.tw/Home/Index

帳號 StageTest
密碼 test1234

登入後 點選左方選單 一般訂單查詢->全方位金流訂單

開啟該頁面後 查詢條件 付款方式 請選擇信用卡付款 然後按 查詢
接著在下面應該就能看到剛剛已經付款完成的訂單紀錄

4.接收訂單狀態程式 http://192.168.1.1/return.php
注意:您的主機需要是對外開放的ip才能接受 歐付寶 無法連到內網IP
注意:這一隻程式是給 歐付寶 呼叫的

HashKey = "5294y06JbISpM5x9";
$oPayment->HashIV = "v77hoKGq4kWxNNIS";
$oPayment->MerchantID = "2000132";
/* 取得回傳參數 */
$arFeedback = $oPayment->CheckOutFeedback();
/* 檢核與變更訂單狀態 */
if (sizeof($arFeedback) > 0) {
foreach ($arFeedback as $key => $value) {
switch ($key)
{
/* 支付後的回傳的基本參數 */
case "MerchantID": $szMerchantID = $value; break;
case "MerchantTradeNo": $szMerchantTradeNo = $value; break;
case "PaymentDate": $szPaymentDate = $value; break;
case "PaymentType": $szPaymentType = $value; break;
case "PaymentTypeChargeFee": $szPaymentTypeChargeFee = $value; break;
case "RtnCode": $szRtnCode = $value; break;
case "RtnMsg": $szRtnMsg = $value; break;
case "SimulatePaid": $szSimulatePaid = $value; break;
case "TradeAmt": $szTradeAmt = $value; break;
case "TradeDate": $szTradeDate = $value; break;
case "TradeNo": $szTradeNo = $value; break;
default: break;
}
}
// 其他資料處理。
print '1|OK';
} else {print '0|Fail';}
}
catch (Exception $e){
// 例外錯誤處理。
print '0|' . $e->getMessage();
}

?>

2015-12-28 更新 若想測試 webatm
請選擇 台新銀行付款即可完成付款

5.接收訂單資訊程式 http://192.168.1.1/payment_info.php
注意:您的主機需要是對外開放的ip才能接受 歐付寶 無法連到內網IP

HashKey = "5294y06JbISpM5x9";//這是測試帳號專用的不用改它
		$oPayment->HashIV = "v77hoKGq4kWxNNIS";
		$oPayment->MerchantID = "2000132";
		/* 取得回傳參數 */
		$arFeedback = $oPayment->CheckOutFeedback();
		/* 檢核與變更訂單狀態 */
		if (sizeof($arFeedback) > 0) {
			foreach ($arFeedback as $key => $value) {
				switch ($key)
				{
					/* 支付後的回傳的基本參數 */
					case "MerchantID": $szMerchantID = $value; break;
					case "MerchantTradeNo": $szMerchantTradeNo = $value; break;
					case "PaymentDate": $szPaymentDate = $value; break;
					case "PaymentType": $szPaymentType = $value; break;
					case "PaymentTypeChargeFee": $szPaymentTypeChargeFee = $value; break;
					case "RtnCode": $szRtnCode = $value; break;
					case "RtnMsg": $szRtnMsg = $value; break;
					case "SimulatePaid": $szSimulatePaid = $value; break;
					case "TradeAmt": $szTradeAmt = $value; break;
					case "TradeDate": $szTradeDate = $value; break;
					case "TradeNo": $szTradeNo = $value; break;
					case "PaymentNo": $szPaymentNo = $value; break;//超商代碼
					case "vAccount": $szVirtualAccount = $value; break;//ATM 虛擬碼
					default: break;
				}
			}
			// 其他資料處理。
			if(substr($szPaymentType, 0, 3)=='CVS'){//若付款方式為 超商代碼
				//在這裡把超商代碼存進你的訂單資料表中
			}else if(substr($szPaymentType, 0, 3)=='ATM'){//若付款方式為ATM 虛擬碼
				//在這裡把ATM虛擬碼存進你的訂單資料表中
			}else{
				//寫入付款方式
			}
			print '1|OK';
		} else {print '0|Fail';}
	}
	catch (Exception $e){
		// 例外錯誤處理。
		print '0|' . $e->getMessage();
	}

?>

超商條碼的部份 也是可以取得 那三個barcode編碼,但你不知他用的是什麼條碼編碼所以你在前台也沒辦法把條碼顯示出來 顯示數字意義不大,這部份我就沒有去實作。

歐付寶提供的線上教學文件 https://developers.allpay.com.tw/Prepare/Intro

如果我的文章有幫助到您的話,請幫我點擊廣告,一天最少需有五人點擊廣告才有足夠經費繼續經營下去,感謝! ⇩⇩⇩ 如果我的文章有幫助到您的話,請幫我點擊廣告,一天最少需有五人點擊廣告才有足夠經費繼續經營下去,感謝! ⇧⇧⇧

78 thoughts on “[ PHP ] – 歐付寶金流串接範例

  1. 你好~請問為何我都照上面步驟使用~~
    刷卡也都正常~~可是為什麼最後付款成功沒顯示返回商店按鈕~~
    這樣怎麼回到購物網站??

  2. 感謝 jeff 大的範例,return.php 這我串好了可以用,剩下payment_info.php 還沒串,還好有找到這範例,如果只看官方提供的文檔,ReturnURL這塊不知道要玩到哪時候了!

    1. 可以請問一下return.php的用途嗎??我遇到跟wayne一模一樣的問題,return.php接收綠界傳POST過來的參數,再透過他SDK裡面的class去checkvalue,所以return.php幾乎不用更動,不知道我的理解這樣對嗎??

      1. 4.接收訂單狀態程式 http://192.168.1.1/return.php
        我很清楚寫了 return.php的作用了。
        你完全不需要去check return.php回傳的值是寫什麼,因為這支程式不是給你去執行呼叫的…

        你要寫的是如果他回傳是訂單狀態是ok你要執行那些動作
        // 其他資料處理。 例如我要把訂單狀態變更成已付款
        if(substr($szPaymentType, 0, 3)==’CVS’){//若付款方式為 超商代碼
        //在這裡把超商代碼存進你的訂單資料表中
        }else if(substr($szPaymentType, 0, 3)==’ATM’){//若付款方式為ATM 虛擬碼
        //在這裡把ATM虛擬碼存進你的訂單資料表中
        }else{
        //寫入付款方式
        }

  3. 你好,有個問題請問一下~

    就是關於return.php這隻,我知道他的作用了,然後也可以接收到他回給我的訂單編號,還有他自己產生的訂單編號,這些我都可以用POST抓到並且寫入資料庫,但是就還是會出現0 | CheckMacValue verify fail.(登入歐付寶系統用模擬付款也是)

    進入他的測試環境看是有訂單產生,接到的post也是有顯示成功(即使是模擬的)

    但總是覺得怪怪的~這應該還是會有問題吧?

    1. 你應該不懂這隻 return.php 程式是要幹麻的,因為他是給 歐付寶 呼叫的,
      所以你不可能會看到 0 | CheckMacValue verify fail 的錯誤訊息。

      1. 不好意思,應該是說,我用他後台的模擬付款,都只會彈出沒收到1|ok的訊息

        http://beanci.com/notice.png
        像上圖一樣

        但是我再return.php這隻裡面我有去設定接收他會推給我的那些MerchantTradeNo(我方訂單編號)等數值,我都可以收到並且寫入資料庫內,也可以設定一些條件讓他去檢查我方資料庫是否有此筆訂單比對金額等,去更改訂單狀態~
        順便去改一下商品數量~
        感覺上好像都是沒問題,但就他一直沒顯示成功,但是我方資料庫都會有寫入相關資訊的記錄

        所以我有點困惑,到底我還需不需要在對他給我的CheckMacValue在去做一次運算比對?

        1. 基本上你不用對他給你的CheckMacValue在去做一次運算比對,
          但你給的圖錯誤訊息,應該是你的return.php有錯,print ‘0|’ . $e->getMessage(); 這回傳的錯誤訊息你可能要問歐付寶
          給他你測試的訂單編號,請他查錯誤碼表示什麼意思。

          1. 還是卡在這邊,他有回信跟我說可能是我的checkmacvalue有錯,但是我都用它的SDK了阿~崩潰

            後來我嘗試自己在針對他傳來的數值作checkmacvalue,兩者比對是正確的…
            所以我更困惑了

            然後重點是我隨便用wordpress架設購物車,加上歐付寶的外掛,模擬付款是沒問題的,這就讓我更崩潰了…

            wayne大你是怎麼解決的?

  4. 請問一下 我有試刷,但是在歐付寶廠商管理後台查不到資料~~~

    有完成整個流程,也有訂單編號1479195678 但是後台查不到?

  5. 抱歉,我有點笨需要再確認一次ˋ,所以payment_info.php是當客戶選擇付款訂單成立後就會執行,在這裡是加入訂單資訊,return.php是當客戶付款之後才會執行主要是傳回值判斷客戶是否付款成功,這樣理解有錯誤嗎?

    1. 我訂單成立的時候沒有執行到payment_info.php,所以沒有把訂單資訊傳到到資料庫該如何解決呢?

        1. 這是設定 付款方式 要回傳給那隻程式用的,跟付款畫面完全無關,你不填他就不呼叫而已

          歐付寶的文件中 有流程圖 你可以完整的看過一遍 了解流程後 再實作比較不會遇到一堆問題

    2. 這樣理解是對的,但這兩隻程式 會不會執行取決於 歐付寶有沒有主動的呼叫…
      目前歐付寶 金流的部份正在轉回綠界科技 我不知 是不是因為這個原因造成測試環境有問題 我不確定 目前也有沒時間去做測試(這部份可以打電話問他們客服)

      建議你可以改用 智付寶 會好串很多 請參考這篇 https://www.webteach.tw/?p=1004

  6. $oPayment->SendExtend[‘PaymentInfoURL’]確定有打對,所以我點選付款方式後出現訂單成立時,只會運行 return.php ,不會使用到payment_info.php嗎?另外我登入測試的歐付寶廠商管理後台
    http://vendor-stage.allpay.com.tw/Home/Index帳號 StageTest密碼 test1234查看訂單發現沒有顯示MerchantID,傳回來的值中MerchantID也是空的這樣正常嗎?是模擬的都這樣嗎?

    1. return.php 這是當客戶付款完成時 歐付寶會背景呼叫跟你說已經收到款項了,你就可以在這一隻程式中變更你自已資料庫中的訂單狀態 待付款 變 已付款之類的。
      payment_info.php是當客戶要付款時 選擇某一種付款方式 並完成整個付款流程 不論是不是 即時還是非即時付款方式 ,才會呼叫這支這隻主要是讓你將超商條碼/虛擬atm帳號存到你的資料庫 讓客戶可以登進你的系統再次查詢。

      你應該用你的 MerchantTradeNo 去他的後台查才對,MerchantID 應該是固訂的。

  7. 我使用超商代碼,然後使用模擬付款,但是卻只有執行return.php 而沒有執行payment_inof.php來寫入資料庫,請問該怎麼辦呢?

    1. 歐付寶模擬付款本來就只會呼叫 return.php 付款成功通知,不會呼叫payment 付款方式這隻。

      payment是在選擇付款方式後才會在背景呼叫。

      另請問你 在 產生訂單 order_add.php 這隻程式中的
      $oPayment->SendExtend[‘PaymentInfoURL’]=”http://192.168.1.1/payment_info.php”;//接受訂單狀態
      這行的ip有沒有打對

      1. 所以我如果要新增回傳的資料到資料庫只要打在return.php 就好了嗎?payment_info.php就可以不用理會它嗎?

  8. 請問大大如果網站是用codeigniter的框架式寫法
    上述資料部分的放置位置請問是放在application/controllers裡面嗎?
    需要額外加寫view相關部分嗎?
    不好意思,這邊不知道大大清不清楚,還請指點

    1. sorry 小的不才 沒在用MVC框架,但歐付寶是另開視窗,基本上應該是不用另外寫view 只要新增訂單成功他會自行跳到付款的頁面

  9. 不知道大大有沒有遇到這樣的問題
    我發送到歐付寶開單的 MAC 和 歐付寶付款成功返回給我的MAC 不相符
    我開單發送到歐付寶前 有進行寫到數據庫
    RAN534153 – 訂單號
    E2E2CD7C429467388B520B6A628CD083 – MAC
    但我記錄歐付寶發給我return頁面的值
    RAN534153 – 訂單號
    646F7C958F146E55F884A2C8A5EE5291 -MAC

    導致我驗證訂單資料的問題
    大大有沒有解決方式?

      1. 大大 我已经完成了
        也大致上了解整个过程了
        虽然我写的是ASP版本
        与.net相符 但这次也学到了不少东西
        谢谢你

        1. 我也沒真能幫到你什麼忙,都是你自已解決的比較多,
          如果可以也希望你能分享你的經驗讓大家少繞遠路,
          我好像還沒看過有人分享asp.net歐付寶金流的版本。

  10. 感谢大大的文章,我在这里看到了几篇
    把POST问题解决了
    目前我遇到CheckMacValue的问题
    我想问问 是不是按照以下的顺序排列
    先进行 URL Encode
    然后 进行小写
    再来 更换
    $sMacValue = str_replace(‘%2d’, ‘-‘, $sMacValue);
    $sMacValue = str_replace(‘%5f’, ‘_’, $sMacValue);
    $sMacValue = str_replace(‘%2e’, ‘.’, $sMacValue);
    $sMacValue = str_replace(‘%21’, ‘!’, $sMacValue);
    $sMacValue = str_replace(‘%2a’, ‘*’, $sMacValue);
    $sMacValue = str_replace(‘%28’, ‘(‘, $sMacValue);
    $sMacValue = str_replace(‘%29’, ‘)’, $sMacValue);
    在进行 MD5加密 就形成了 CheckMacValue 是吗?

    之后 按照顺序 http POST 到 欧付宝
    后面加多一个 CheckMacValue

    请问我有没有理解错?
    HashKey:
    ChoosePayment:
    ChooseSubPayment:
    ClientBackURL:
    Desc_1:
    Desc_2:
    Desc_3:
    Desc_4:
    DeviceSource:
    Email:
    ExpireDate:
    ExpireTime:
    IgnorePayment:
    ItemName:
    ItemURL:
    MerchantID:
    MerchantTradeDate:
    MerchantTradeNo:
    NeedExtraPaidInfo:
    OrderResultURL:
    PaymentInfoURL:
    PaymentType:
    PhoneNo:
    Remark:
    ReturnURL:
    TotalAmount:
    TradeDesc:
    UserName:
    HashIV:

      1. 因为我所使用的官网系统是ASP版本
        所以我自己在写过 但遇到MAC错误
        所以想请教大大 怎么的排列法

  11. 請問
    payment_info.php
    裡面的[//寫入付款方式]
    寫入我的資料庫資訊
    可是為什我的資料庫沒有資料
    還是不是輸入在這裡呢??
    輸入IP是對外的網址

        1. 應該是都會跑才對
          我是信用卡付款直接用return.php 查是否以付款
          其它非即時付款的就用payment_inof.php來寫入相關付款資訊

          1. 了解,謝謝你
            我都用信用卡測試所以才只會跑return.php
            非即時付款只是哪些?
            是除了信用卡之外嗎?

          2. 我按照大大给的提示
            我进行了PHP MSSQL测试
            语句写入成功
            目前我在 Paymentinfo 那边写
            我想请问
            MerchantID 的数值 是 $szMerchantID 还是 $szMerchantID=$Value
            ?

  12. 您好,我的接收訂單狀態程式都可接收到歐付寶回傳資料並寫入資料庫,但接收訂單資訊程式從來都沒有資料被寫入資料庫,是正常的嗎??

      1. 抱歉不方便提供聯絡資訊,請提供錯誤的畫面資訊方便判斷,另資料庫寫入方面請先確認語法可正常執行。

  13. 不好意思請問一下,如果我想把這套用到我所寫的Dreamweaver中的話,是不是更改
    $oPayment->HashKey = “5294y06JbISpM5x9”;//這是測試帳號專用的不用改它
    $oPayment->HashIV = “v77hoKGq4kWxNNIS”;//這是測試帳號專用的不用改它
    $oPayment->MerchantID = “2000132”;//這是測試帳號專用的不用改它
    這三行改成我自己ALLPAY的代碼就好了呢?
    抱歉我初學還請指導一下,謝謝^^”

    1. 你好,我所寫的範例是針對歐付寶金流的部份(也就是結帳),其它還有你自已訂單狀態要處理 包含很多資料庫的東西

      以下是簡易的購物車流程給你參考
      購物車功能說明

      產品加入到購物車中
      將產品從購物車中移除
      修改購物車中 某項產品的數量

      顯示該會員購物車產品清單

      會員按下結帳後 會先出現 收貨資訊的頁面(若之前有新增過且勾選預設 就自動帶出 預設的資料)

      若無輸入過 收貨資訊 或是 想使用其它收貨地址等 可以再新增一筆收貨資訊(新增頁面)

      在使用者輸入完 收貨資訊後會自動導到 歐付寶 做付款的動作

      付款完後 即會導回 訂單查詢(頁面)

      1. 好的,感謝您回覆我
        我會試試看串接自己的歐付寶

        如有其他問題還煩請您指教一下
        謝謝^^”

  14. 按照文章的程式(只改192.168….)部分,但不會跳轉到付款畫面,而是到github,是什么原因?

    1. 你好,應該是歐付寶測試環境有修改程式的關係,剛我用測試環境測也是有短暫的時間無法建立訂單的問題,後來又恢複正常了。
      希望正式環境不會發生這種情況…

        1. 在我的環境上測試是這樣沒錯,若還是有問題你可能直接聯絡歐付寶的技術客服才能真的幫助到你哦。

  15. 您好,訂單送出後,使用webatm,選擇台新銀行,付款成功,按返回商店。回應的是payment_info.php這支程式碼,試了很多遍,結果都是 0|Fail ,想請問是否是給的ip位址,無法收到它的傳回值嗎?

      1. 想再請教您,我在送出訂單後,用webatm方式付款,付款完成後,我是另外再手動執行return.php這個程式,得到 0|Fail 的結果。是我使用的測試方式有問題嗎?

        1. 我想你是搞錯方向了…return.php這支程式不是要你去執行的,是要給歐付寶回傳資料呼叫的,你自已執行的話永遠都會回傳 Fail

          請參考 order_add.php 中的 20 24 行這兩行的設定

          1. 不客氣,指導不敢講 分享學習的經驗 而已。
            有問題歡迎多多留言 教學相長一下

  16. 想請教您,歐付寶非及時付款(實體ATM帳號、超商條碼、超商代碼)的資訊可否串接?目前是會產生付款資訊網頁,一但網頁關閉,即無從查詢!不知您是否有串接過?

    1. 請參考本文第5點範例程式。

      基本上歐付寶有提供後台訂單查詢的api讓你可以串,但我覺得用我的方式就可以達到你的需求。你參考看看~

  17. return.php
    第13行會出現錯誤:( ! ) Parse error: syntax error, unexpected ‘;’ in C:\wamp\www\return.php on line 13

    請問該如何修改

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *