Moneybookers支付方式开发

Moneybookers 支付方式接入整理

简介:

Moneybookers(MB)是一家极具有竞争力的网络电子银行,它诞生于2002年4月,是英国伦敦Gatcombe Park风险投资公司的子公司之一。 如果公司所在的业务会涉及到海外的支付,那么接入Moneybookers支付方式,将会是一个很不错的选择,因为安全性高,使用人数多,同时内部可使用的子支付方式也非常多,基本上可以适用大多数人

 

接入流程:

MB对商家和个人都审核非常的严格,如果你打算接入MB,那将会是一个漫长,痛苦的过程,在国内因为时差的问题,我们的白天基本是他们的晚上。所以交流比较麻烦。这个部分不用程序员动手,谈妥后,我们就拿到一分开发文档和相关的帐号信息(开发中将会用到)。之后就可以着手开发了。

开发文档:

我们到MB的官网上 可以下载到最新的  支付说明手册(MB支付方式大体说明)   同时   商家设置,开发手册 (开发,查询细节)

正题:

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.组合后的表单信息。

 1 <form method="post" action="https://www.moneybookers.com/app/payment.pl" >
2 <input type="hidden" name="pay_to_email" value="商家帐号">
3 <input type="hidden" name="recipient_description" value="商家名称">
4 <input type="hidden" name="transaction_id" value="订单号">
5 <input type="hidden" name="amount" value="金额">
6 <input type="hidden" name="currency" value="货币(USD..)">
7 <input type="hidden" name="return_url" value="支付完成后返回地址">
8 <input type="hidden" name="cancel_url" value="支付失败/取消地址">
9 <input type="hidden" name="status_url" value="支付成功处理地址">
10 <input type="hidden" name="hide_login" value="0">
11 <input type='hidden' name='merchant_fields' value="payapi">
12 <input type="hidden" name="payapi" value="test">
13 <input type="submit" style="display:none">
14 </form>
15 <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.

 没发现怎么上传附件,所以贴出代码:

View Code
<?php
/*
* Money bookers
*/
class Mbookers_api {
var $account; //商戶名:委託單位代號
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;
}

}



 

  
  
  
  
  
  
  
  
  
  

转载于:https://www.cnblogs.com/lansexin/archive/2011/12/18/2291394.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值