開發文件:
支付說明手冊
步驟:
1.使用商家帳號,登入到www.moneybookers.com,核對商家資訊是否正確。
2.在賬戶-->商家工具(設定)
a.API/MQI password:這個pwd的設定,是用在介面中,用於二次驗證訂單的真實性要用到。(可選,非必須)
b. 在同一個頁面中,Secret word(金鑰)的設定,在頂部。注意程度是10,必須是小寫,同時不能包含一些特殊字元。(必須填寫,介面要用到)
3.準備工作已經OK,現在就可以寫API了。
a.組合FORM表單,提交交易資訊,開始支付。
引數 | 是否必須 | 值 |
pay_to_email | 是 | 商家的帳號(可在商家後臺更改) |
pay_from_email | 可選 | 如果是使用的信用卡支付可以傳遞,其他支付可以不傳 |
transaction_id | 是 | 交易的訂單號 |
amount | 是 | 交易金額 |
currency | 是 | 交易貨幣 |
return_url | 可選 | 支付完成後,跳回的網頁地址 |
cancel_url | 是 | 支付過程中,取消或出錯後,跳轉的地址 |
status_url | 是 | 支付完成後(成功時),MB的server(POST)傳遞支付資訊(curl方式),處理交易訂單狀態的地址 |
hide_login | 可選 | 是否隱藏掉MB支付頁面右邊的登入表單,是用信用卡時,可以傳遞【1:隱藏,0:顯示】 |
merchant_fields | 可選 | 回傳時,會加到status_url作為引數返回.如果使用了,比如我傳遞mytest那麼就必須傳遞mytest的引數. |
mytest | 可選 | 依據merchant_fields引數,有傳遞,則必傳,不然為空值 |
merchant_id | 是 | 商家的ID,可以理解為主鍵ID(唯一標識).可以在後臺找到,也可以向MB索要 |
payment_methods | 可選 | 如果想指定在MB支付時,只使用指定的支付方式,就可以傳遞,比如VISA(VSA),具體可參照:測試頁面 Split Gateway 中(mark 1) |
其他引數不重要.... |
b.組合後的表單資訊。
<form method="post" action="https://www.moneybookers.com/app/payment.pl" > <input type="hidden" name="pay_to_email" value="商家帳號"> <input type="hidden" name="recipient_description" value="商家名稱"> <input type="hidden" name="transaction_id" value="訂單號"> <input type="hidden" name="amount" value="金額"> <input type="hidden" name="currency" value="貨幣(USD..)"> <input type="hidden" name="return_url" value="支付完成後返回地址"> <input type="hidden" name="cancel_url" value="支付失敗/取消地址"> <input type="hidden" name="status_url" value="支付成功處理地址"> <input type="hidden" name="hide_login" value="0"> <input type='hidden' name='merchant_fields' value="payapi"> <input type="hidden" name="payapi" value="test"> <input type="submit" style="display:none"> </form> <script>document.forms[0].submit();</script>
c.回傳處理訂單資料有兩部分:
I. 訂單成功後回傳頁面的處理(status_url):接收的引數說明.
引數 | 說明 |
transaction_id | 交易時,Form傳遞的訂單號 |
merchant_id | 商家ID |
pay_to_email | 商家email帳號 |
pay_from_email | 買家(email帳號) |
mb_amount | MB的交易金額 (已經mb_currency轉換後交易的金額,可能和傳遞的不一樣) |
mb_currency | MB的交易貨幣 (可能和傳遞currency不一樣,這個是MB的貨幣,EUR) |
mb_transaction_id | MB的交易訂單(商家後臺可以檢視交易成功的訂單) |
status | 交易的狀態 |
md5sig | 加密碼(下面詳細說明) |
amount | 我們傳遞的金額 |
currency | 我們傳遞的貨幣 |
payment_type | 在MB中選擇的交易支付方式。可參照 mark 1 |
II. 接收到了引數,那麼就要校驗資料是否跟下單時的資料一致。一般的做法就是根據獲取的訂單號,查詢資料庫資訊,與之對比。無誤才能處理。
因為有可能模擬資料,這樣就可以避免不安全的情況。
III. status(交易回傳的狀態):MB文件中有5種狀態,分別是:
2->Processed(支付成功)
0->Pendding(已經下單,但未支付)
-1->Cancelled(使用者customer取消訂單,可以是取消0狀態的訂單,或中途沒有交易下去的訂單)
-2->Failed(支付失敗)
-3->Chargeback(退款,使用者customer,退款後,會通知status_url )
IV.md5sig :通過:
$sign_msg_str = $merchant_id . $transaction_id. strtoupper(md5($Secret key)) . $mb_amount . $mb_currency . $status;
$sign_msg = STRTOUPPER(MD5($sign_msg_str));
這樣的規則組合後加密的,這樣我們在接收到md5sig後就可以按照上面的sign_msg對比,這樣就能夠基本杜絕假的資料。
V. 這些步驟就可以處理返回的資料,之後就處理自己的業務邏輯即可。
d. 第二種就是取消交易的情況。這種情況是沒有成功的,但MB會通知合作商地址:(return_url)。以GET方式回傳transaction_id,引數。 這個地方自己簡單處理即可。
4.至於二次驗證的部分。商家設定,開發手冊 的page 8,和page 9. 基本流程是。根據商家提供的地址和要傳遞的引數,step1(page 8)中, curl的方式傳遞給MB, 然後就可以獲取MB返回的 驗證sid,而step 2 則是,結合sid和引數,去獲取訂單的詳細支付資訊。這部分也比較簡單。
至此MB主要的東西就說完了。一些其他細節可以參考文件。或使用我提供的demo.
DEMO程式碼:
<?php /* * Money bookers */ class Mbookers_api { var $account; //商戶名:email var $key; //商戶祕鑰 var $orderno; //訂單號 var $currency; //貨幣型別 var $amount; //金錢數 var $action; //傳送到對方伺服器的網址 var $merchant; //商戶編號 var $merchant_name; //商戶名稱 /**支付閘道器向我係統發資訊**/ var $rsSuccessUrl; //成功的處理網址 var $rsFailUrl; //失敗的處理網址 /****初始化商家資訊 01 ****/ function __construct() { $this->account = "xxx@xx.com.hk"; $this->key = "123123123"; $this->merchant = "2348234"; $this->merchant_name = "商家名稱"; $this->action = "https://www.moneybookers.com/app/payment.pl"; $this->rsSuccessUrl = "http://www.yousite.com/receive.php"; $this->rsFailUrl = "http://www.yousite.com/failure.php"; $this->rsNoticeUrl = $this->rsFailUrl; } /****傳送請求 02 ****/ function send($info=array()) { $temp = <<<EOD <form method="post" action="{$this->action}"> <input type="hidden" name="pay_to_email" value="{$this->account}"> <input type="hidden" name="recipient_description" value="{$this->merchant_name}"> <input type="hidden" name="transaction_id" value="{$info['orderno']}"> <input type="hidden" name="amount" value="{$info['amount']}"> <input type="hidden" name="currency" value="{$info['currency']}"> <input type="hidden" name="return_url" value="{$this->rsNoticeUrl}"> <input type="hidden" name="cancel_url" value="{$this->rsFailUrl}"> <input type="hidden" name="status_url" value="{$this->rsSuccessUrl}"> <input type="hidden" name="payment_methods" value="VSA"> <input type="hidden" name="hide_login" value="1"> <input type='hidden' name='merchant_fields' value="payapi"> <input type="hidden" name="payapi" value="MBookers"> <input type="submit" style="display:none"> </form> <script>document.forms[0].submit();</script> EOD; $result = trim($temp); echo $result; } /****接收請求 03 02 ****/ function receive($debug) { //trackback payapi to get the payment info $payback = $this->getPayTrackback($debug); if ($debug) { echo("從getPayTrackback返回的資料:<hr />"); dump($payback); } //檢查返回結果 if (empty($payback) && !is_array($payback)) $tb = "err0101"; elseif ($this->orderno != $payback["orderno"]) $tb = "err0102"; //訂單號是否修改 elseif ($this->amount != $payback["amount"]) $tb = "err0105"; //金錢 elseif ($this->account != $payback['account']) $tb = "err0106"; //賬號 elseif ($this->currency != $payback['currency']) $tb = "err0103"; //貨幣 //如果通過以上檢測,則返回成功的驗證程式碼 elseif ($payback['pay_rs'] && '2' == $payback['pay_rs']) $tb = "Completed"; //成功 else $tb = "err0301"; //無修改但支付失敗 $rs["rs"] = $tb; $rs["pay_id"] = $payback["pay_id"]; $rs["pay_rs"] = $payback["pay_rs"]; $rs["pay_username"] = $payback["pay_username"]; $rs["memo"] = $payback; return $rs; } //生成返回的MD5加密摘要 function getPayTrackback($debug) { $orderno = $_POST['transaction_id']; $merchant_id= $_POST['merchant_id']; $account = $_POST['pay_to_email']; $amount = $_POST['mb_amount']; $currency = $_POST['mb_currency']; $pay_id = $_POST['mb_transaction_id']; $pay_rs = $_POST['status']; $pay_from_email = $_POST['pay_from_email']; $md5sig = $_POST['md5sig']; $sign_msg_str = $merchant_id . $orderno . strtoupper(md5($this->key)) . $amount . $currency . $pay_rs; $sign_msg = STRTOUPPER(MD5($sign_msg_str)); if($md5sig != $sign_msg) { return false; } if('2' != $pay_rs) { return false; } $result['account'] = $account; $result['pay_id'] = $pay_id; $result['pay_rs'] = $pay_rs; $result['pay_username'] = $pay_from_email; $result['amount'] = $amount; $result['currency'] = $currency; $result['orderno'] = $orderno; return $result; } } ?>