Moneybookers API支付方式開發 步驟

神馬和浮雲發表於2014-10-22

開發文件:

支付說明手冊

步驟:

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;
    }
}
?>

 

相關文章