Avangate支付方式因为其整合了其他比较多的支付方式,而感觉比较好用,下面介绍Avangate支付方式的开发流程。
- 首先当然是先去Avangate官网注册一个账号,他们可以提供中文服务的哦。
- 登录到Avangate管理后台设置产品等信息。如果你自己的网站上有产品了,只是希望别人通过他的网址完成付款的话,可以只在后台设置一个$1的产品,通过产品个数来实现付款钱数。
- 在自己的网站的checkout页面添加表单,用于提交付款。表单格式看下面。
- 支付流程这里就不写了。
- 如果需要客户付款成功后通知到网站,这需要在后台设置IPN。
- IPN设置页面地址 中填写接受消息的地址,这个地址需要先在服务器上存在,否则无法保存成功。其他需要IPN通知的内容根据自己需要修改。
- 处理IPN得到的数据。具体处理代码见下面。
- 由于Avangate需要得到我们的处理结果,所以最后我们还需要将处理结果返回给Avangate。(这个不做在后台会有Notice,但不影响实际结果。)
下面是checkout页面需要提交的表单代码。
其中URL的内容请参考这个测试地址https://secure.avangate.com/order/checkout.php?PRODS=123456&QTY=299&CART=1&CARD=1&DOTEST=1&REF=thisismyorderID
You can use the REF parameter which will be received in the IPN as REFNOEXT. For example, if you place a test order using https://secure.avangate.com/order/checkout.php?PRODS=123456&QTY=299&CART=1&CARD=1&DOTEST=1&REF=thisismyorderID you will receive that parameter in the IPN as REFNOEXT=thisismyorderID
<form id="avangatepost" action="https://secure.avangate.com/order/pf.php" method="get" name="form">
<input name="MERCHANT" type="hidden" value="XXXXXXXX" />
<input name="AUTOMODE" type="hidden" value="1" />
<input name="URL" type="hidden" value="checkout.php?PRODS=123456&QTY=299&REF=ORDER228E713B&DOTEST=1" />
<input name="BILL_FNAME" type="hidden" value="fname" />
<input name="BILL_LNAME" type="hidden" value="lname" />
<input name="BILL_EMAIL" type="hidden" value="uname@windigniter.com" />
<input type="submit" value="Submit" />
</form>
这个表单使用get方式类似于这样:https://secure.avangate.com/order/pf.php?MERCHANT=SHANGHAI&BILL_FNAME=xue&BILL_LNAME=&BILL_EMAIL=cheney@topcmm.com&URL=https%3A%2F%2Fsecure.avangate.com%2Forder%2Fcheckout.php%3FPRODS%3D4620517%26QTY%3D299%26CART%3D1%26CARD%3D1
其中
- MERCHANT 的值是 在 avangate管理后台可以看到的。
- URL参数中的PRODS是Avangate的产品ID.
- QTY是购买数量。
- REF是我们自定义的订单ID,为了知道是哪笔订单购买的。
- 如果URL的参数中还带了DOTEST=1,则表示为测试订单,我们前期测试肯定是用得到的。
- BILL_FNAME,BILL_LNAME,BILL_EMAIL 这些信息可能你需要动态获取,请根据自己的情况使用。如果现在不带,在提交之后也会要输入的。
下面是IPN返回数据后我们需要处理的代码(下面代码中的左右尖括号为全角,请使用半角)。
if(!isset($_POST)) exit;
define('DEBUGMODE', 'NO' );
define('SECRETKEY', 'xxxxxxxxxxxxxx'); //这个值需要在avangate后台查看
首页我们需要根据他们官方提供的文档判断得到的数据是否是真实的,参考:https://secure.avangate.com/cpanel/help.php?view=topic&topic=432#Instant Payment Notification。
function isRightOrder(){
$hashstr = '';
foreach ($_POST as $key => $value){
if(!empty($value)){
if(is_array($value)){
if(!empty($value[0])){
$hashstr .= strlen($value[0]) . $value[0];
}else{
$hashstr .= '0';
}
}else{
if($key != 'HASH'){
$hashstr .= strlen($value) . $value;
}
}
}else{
$hashstr .= '0';
}
}
if($_POST['ORDERSTATUS'] == 'COMPLETE' || DEBUGMODE == 'YES'){
$hashResult = hash_hmac('MD5', $hashstr, SECRETKEY);
if($_POST['HASH'] == $hashResult && !empty($_POST['REFNOEXT']) && !empty($_POST['REFNO']) && !empty($_POST['IPN_QTY'][0])){
//check ok
return true;
}else{
//error order
return false;
}
}else{
//test order
return false;
}
}
if(isRightOrder()){
//验证通过,继续处理订单状态
}else{
//验证失败,不在处理
}
需要注意的是上面的代码在处理的过程中会存在一点瑕疵,就是用户信息中带单引号(’)的时候会出现验证通不过,因为我们拿到的信息他们已经反斜杠处理过了(\')(这里的单引号我都用的全角,请在使用的时候使用半角).
最后通过下面的代码返回给Avangate处理结果,参考地址:https://secure.avangate.com/cpanel/help.php?view=topic&topic=432#2.3%20Read%20receipt%20response%20for%20Avangate。
//IPN response
$date = date('YmdHis');
$hashstr = strlen($_POST['IPN_PID'][0]) . $_POST['IPN_PID'][0] . strlen($_POST['IPN_PNAME'][0]) . $_POST['IPN_PNAME'][0] . strlen($_POST['IPN_DATE']) . $_POST['IPN_DATE'] . strlen($date) . $date;
$hash = hash_hmac('MD5', $hashstr, SECRETKEY);
echo '<EPAYMENT>'.$date.'|'.$hash.'</EPAYMENT>';
(4204)