zoukankan      html  css  js  c++  java
  • Moneybookers API支付方式开发 步骤

    开发文档:

    支付说明手册

    步骤:

    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;
        }
    }
    ?>
  • 相关阅读:
    Mongoexport导出数据,Mongoimport导入数据,mongodump备份数据,mongorestore恢复恢复
    php7中使用mongodb的驱动
    windows(X64)+apche2.4+php7.2下安装mongodb
    windows(X64)下安装apche2.4+php7.2+mysql5.7
    Django2.0 path与Django1.x版本url正则匹配问题
    Django: ImportError: No module named 'corsheaders'
    linux开启端口
    MySQL 存储过程传参数实现where id in(1,2,3,...)示例
    ubuntu安装pip3
    在Ubuntu 16.04 安装python3.6 环境并设置为默认
  • 原文地址:https://www.cnblogs.com/xcxc/p/4042755.html
Copyright © 2011-2022 走看看