贝赫帕尔达赫/ behpardakht_ipg
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
等于0
,RefId
与原始令牌匹配,并且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
方法只能对已结算的交易进行调用。