贝赫帕尔达赫/behpardakht_ipg

v1.0.1 2021-12-12 06:02 UTC

This package is auto-updated.

Last update: 2024-09-12 12:00:47 UTC


README

对于一笔支付交易,我们必须通过Web服务请求一笔支付。如果我们的请求成功,IPG将返回一个令牌,我们应该在将客户重定向到支付页面时使用此令牌。客户将通过POST请求从支付页面重定向回我们想要的URL(回调URL),该请求包含可以用于使用Web服务检查和验证客户交易的数据。

请求支付

对于一笔支付交易,我们应该向IPG发送支付请求并获取一个令牌。这可以通过调用getToken方法来完成。

实例化IPG对象

要实例化一个IPG对象,我们应该调用Dizatech\BehpardakhtIpg\BehpardakhtIpg构造函数,传递一个包含所需参数的数组,包括

  • terminalId:您的支付网关终端ID
  • userName:您的支付网关用户名
  • userPassword:您的支付网关密码

代码示例

$args = [
    'terminalId'    => '123',
    'userName'      => '456',
    'userPassword'  => '789'
]; //Replace arguments with your gateway actual values
$ipg = new BehpardakhtIpg($args);

getToken方法

参数

  • order_id:唯一的订单ID
  • redirect_address:客户支付后可能被重定向的URL
  • mobile_no(可选):客户手机号码,格式为989*********

返回

一个包含以下属性的对象

  • status:成功错误
  • token:在成功请求的情况下,包含生成的令牌,可以在将客户重定向到支付页面时使用
  • message:当status错误时包含错误消息

将客户重定向到支付页面

如果调用getToken的结果的status属性为成功,我们可以将客户重定向到支付页面URL,当前为https://bpm.shaparak.ir/pgwchannel/startpay.mellat。我们必须通过POST请求将用户重定向到支付页面。因此,有必要在页面中注入HTML表单并将其提交,如下面的示例所示。获取的令牌应作为RefId隐藏输入的值。

有必要保存获取到的令牌以供进一步使用

代码示例

$args = [
    'terminalId'    => '123',
    'userName'      => '456',
    'userPassword'  => '789'
]; //Replace arguments with your gateway actual values
$ipg = new BehpardakhtIpg($args);
$amount = 1000; //Replace with actual order amount in Rials
$order_id = 1; //Replace it with unique order id
$redirect_address = 'http://my.com/verify'; //Replace with your desired callback page URL
$result = $ipg->getToken($amount, $order_id, $redirect_address);
if( $result->status == 'success' ){
    ?>
    <form
        style="display: none;" id="bp_start_pay"
        action="https://bpm.shaparak.ir/pgwchannel/startpay.mellat" method="post">
        <input type="hidden" name="RefId" value="<?php echo $result->token; ?>">
    </form>
    <script>
        window.onload = function(){
            document.forms['bp_start_pay'].submit();
        }
    </script>
    <?php
    die();
}
else{
    echo "Error: {$result->message}";
}

支付验证和结算

支付后,客户将通过POST请求从支付请求阶段提供的回调URL重定向回来,携带所有必要的数据。IPG发送的重要数据字段包括

  • RefId:用户被重定向到支付页面的支付令牌
  • ResCode:支付状态,对于成功的支付应该是0
  • SaleOrderId:在支付请求阶段使用的唯一订单ID以获取支付令牌
  • SaleReferenceId:可能用于进一步请求并显示给客户的参考ID
  • FinalAmount:用户实际支付的金额

必须确保返回的RefId与我们发起支付时使用的令牌匹配,并且FinalAmount与我们请求的金额匹配。

如果ResCode等于0RefId与原始令牌匹配,并且FinalAmount与请求的金额匹配,我们可以调用verifyRequest方法来验证支付。

verifyRequest方法

参数

  • order_id:支付验证请求ID(没有唯一约束)。我们可以使用相同的值用于order_id和sale_order_id
  • sale_order_id:网关返回的SaleOrderId
  • sale_reference_id:网关返回的SaleReferenceId

返回

一个包含以下属性的对象

  • status:成功错误
  • message:描述状态的消息

代码示例

$args = [
    'terminalId'    => '123',
    'userName'      => '456',
    'userPassword'  => '789'
]; //Replace arguments with your gateway actual values
$ipg = new BehpardakhtIpg($args);
$result = $ipg->verifyRequest($_POST['SaleOrderId'], $_POST['SaleOrderId'], $_POST['SaleReferenceId']);

如果我们得到成功状态,我们必须继续并通过settleRequest方法结算交易。

settleRequest方法

参数

  • order_id:支付验证请求ID(没有唯一约束)。我们可以使用相同的值用于order_id和sale_order_id
  • sale_order_id:网关返回的SaleOrderId
  • sale_reference_id:网关返回的SaleReferenceId

返回

一个包含以下属性的对象

  • status:成功错误
  • message:描述状态的消息

代码示例

$args = [
    'terminalId'    => '123',
    'userName'      => '456',
    'userPassword'  => '789'
]; //Replace arguments with your gateway actual values
$ipg = new BehpardakhtIpg($args);
$result = $ipg->settleRequest($_POST['SaleOrderId'], $_POST['SaleOrderId'], $_POST['SaleReferenceId']);

撤销交易

如果我们需要在支付后立即取消客户订单(最多3小时后),我们可以简单地撤销支付交易,这可能导致客户银行账户全额即时退款。对于撤销交易,我们可以调用refundRequest方法。

refundRequest方法

参数

  • order_id:支付验证请求ID(没有唯一约束)。我们可以使用相同的值用于order_id和sale_order_id
  • sale_order_id:网关返回的SaleOrderId
  • sale_reference_id:网关返回的SaleReferenceId

返回

一个包含以下属性的对象

  • status:成功错误
  • message:描述状态的消息

代码示例

$args = [
    'terminalId'    => '123',
    'userName'      => '456',
    'userPassword'  => '789'
]; //Replace arguments with your gateway actual values
$ipg = new BehpardakhtIpg($args);
$result = $ipg->refundRequest($_POST['SaleOrderId'], $_POST['SaleOrderId'], $_POST['SaleReferenceId']);

重要注意事项

  • verifyRequest 方法对于每笔交易只返回一次 success
  • settleRequest 方法可以多次调用任何已验证的交易,并且每次都返回 success。
  • refundRequest 方法只能对已结算的交易进行调用。