fadion/raiffeisen

用于阿尔巴尼亚瑞菲森银行电子商务的辅助工具

1.3.0 2020-11-01 11:17 UTC

This package is auto-updated.

Last update: 2024-08-29 03:31:23 UTC


README

这是一个PHP的简单类,用于简化使用阿尔巴尼亚瑞菲森银行电子商务服务支付网关进行授权和支付处理。请注意,证书(用于授权)的生成、数据发送到网关以及订单的存储策略不在这些类的范围或目标之内,这些仍由您负责。

那么为什么要这样做呢?

如果没有了解其工作原理,实施支付过程可能有些复杂,而且不幸的是,相关的手册也没有提供足够的帮助。签名生成格式、发送的数据以及网关服务器发送和接收请求的方式可能会让初级开发者感到困扰。

这些类正是为了解决程序员不需要做的事情:生成所需的签名格式、从网关读取请求并发送成功或失败的信号。其他一切仍由您负责。

除了代码,您还将阅读一些关于实施瑞菲森系统的建议或最佳实践。

依赖项

PHP版本需高于5.4.0,并且需要使用OpenSSL进行编译。后者用于证书签名。

类加载

这取决于您使用的应用程序或框架。下面是可用的方法

手动加载

<?php
require_once('src/Authenticate.php');
require_once('src/Notify.php');
?>

自动加载

可以是您自己的spl_autoload_register()实现,或者是像ClassLoader这样的Symfony自动加载器。目录结构、命名空间和类名遵循psr-4标准。

Composer

Composer实际上是管理库的最简单和推荐的方式。实际上,几乎所有的现代PHP框架(如Zend Framework、Symfony、Laravel等)都使用Composer来管理包。

首先,在composer.json中包含包

"require": { "fadion/raiffeisen": "~1.0" }

安装包

$ composer install

开始使用

<?php
require 'vendor/autoload.php';

$auth = new Fadion\Raiffeisen\Authenticate(...);
$notify = new Fadion\Raiffeisen\Notify(...);
?>

授权

第一部分是通过生成基于一些变量和证书的数据格式来执行授权。您将根据瑞菲森提供的说明生成证书,并将其保存在服务器上的某个位置。

通过传递一些参数启动授权类。MerchantID和TerminalID将由瑞菲森提供。

<?php
use Fadion\Raiffeisen\Authenticate;

$merchant_id = '111';
$terminal_id = '222';
$total = 3500;

$auth = new Authenticate($merchant_id, $terminal_id, $total);
$data = $auth->generate();
?>

如果您想覆盖默认参数,也可以传递一些可选参数。

<?php
$options = [
	'purchase_time' => date('ymdHis', strtotime('-1 hour')), // koha kur eshte kryer porosia
	'order_id' => '11EE5D', // ID e porosise
	'currency_id' => 'usd', // Valuta (all, usd, eur)
	'session_data' => 'abc', // Sesioni
	'cert_dir' => 'cert/dir' // Direktoria ku ndodhet certifikata
];

$auth = new Authenticate('111', '222', 3500, $options);
?>

订单ID除了作为字符串传递外,还可以作为匿名函数传递,以执行那里的逻辑

<?php
$user_id = 10;
$auth = new Authenticate('111', '222', 3500, [
		'order_id' => function() use($user_id) {
			return uniqid().$user_id;
		}]);
?>

generate()方法返回的是一个包含所有您需要构建表单并将其发送到网关的参数的数组。下面是一个示例,它构建数据并通过表单传递。

<?php
$auth = new Authenticate('111', '222', 3500);
$data = $auth->generate();
?>
<form method="post" action="https://url/e/gateway">
	<input type="hidden" name="Version" value="1">
	<input type="hidden" name="MerchantID" value="<?php echo $data['merchant_id']; ?>">
	<input type="hidden" name="TerminalID" value="<?php echo $data['terminal_id']; ?>">
	<input type="hidden" name="TotalAmount" value="<?php echo $data['total']; ?>">
	<input type="hidden" name="Currency" value="<?php echo $data['currency_id']; ?>">
	<input type="hidden" name="locale" value="sq">
	<input type="hidden" name="PurchaseTime" value="<?php echo $data['purchase_time']; ?>">
	<input type="hidden" name="OrderID" value="<?php echo $data['order_id']; ?>">
	<input type="hidden" name="SD" value="<?php echo $data['session_data']; ?>">
	<input type="hidden" name="Signature" value="<?php echo $data['signature']; ?>">
	<button type="submit">Paguaj</button>
</form>

支付处理

在授权和数据发送后,买家可以输入信用卡。如果卡有效且有余额,网关将向您的服务器发送一个请求以授权支付。有两种方式可以等待该请求

  1. 通过买家浏览器购买,浏览器会将包含一些POST数据的页面返回给你。除了买家参与了过程但没有问题之外,最负面的地方是没有任何方式来验证订单,也无法在服务器出现问题时取消订单。

  2. 通过直接在网关服务器和你的服务器之间进行通信,发送一个包含你页面POST数据的请求(使用cURL或其他方式)。在这里,你可以验证订单,将其保存到数据库中,执行所需的任何操作,并在最后给出正面的或负面的信号。只有在你返回了积极的响应时,银行才会处理交易。

我们将采用第二种方法,任何缺乏逻辑感的人都应该遵循相同的步骤。瑞银银行的文档将解释这两种方法的实现。

由于网关服务器的请求是以POST的形式发送的,因此类也通过它接收一些数据。类的启动需要传递3个参数:成功地址(绝对地址)、失败地址(绝对地址)和超级全局变量$_POST。成功地址和失败地址是买家在处理完支付后将被重定向到的URL。

<?php
use Fadion\Raiffeisen\Notify;

$notify = new Notify('http://adresa/suksesit', 'http://adresa/deshtimit', $_POST);
?>

提供了一些方法来简化响应。

<?php
$notify = new Notify('http://adresa/suksesit', 'http://adresa/deshtimit', $_POST);

// Kontrollon nese kerkesa vjen nga serveri
// i Gateway dhe transaksioni eshte i vlefshem.
$notify->isValid('1.1.1.1');

// Kthen pergjigje pozitive. Transaksioni kryhet.
$notify->success();

// Kthen pergjigje negative. Transaksioni nuk kryhet.
// Mund te kalohet edhe nje arsye opsionale.
$notify->error('Nuk arritem ta ruajme porosine. Provojeni serish.');
?>

当然,当返回积极的或消极的响应时,这不属于类的责任。你需要实施一个策略来控制购买尝试时产品的库存、价格变动等。更重要的是,如果订单无法保存,则应取消购买尝试。

一个典型的作业流程如下

<?php
$notify = new Notify('http://adresa/suksesit', 'http://adresa/deshtimit', $_POST);

if ($notify->isValid('1.1.1.1')) {
	// valido porosine, stokun, etj.

	if (/* porosia eshte ne rregull */) {
		echo $notify->success();
	}
	else {
		echo $notify->error();
	}
}
?>

责任

我和这个包与瑞银银行没有任何关系。这个包的目的是帮助你集成银行的eCommerce系统,但作为其作者,我对其可能引起的问题不承担任何责任。你可以自由地使用和修改,使其更适合你的需要。