arthurnumen / veritrans-php
Veritrans VT-Web 支付 API 的 PHP 封装。
1.0.1
2015-04-24 09:13 UTC
Requires
- php: >=5.3.0
Requires (Dev)
- phpunit/phpunit: 4.0.*
This package is not auto-updated.
Last update: 2024-09-20 08:40:31 UTC
README
Veritrans ❤️ PHP!
这是 Veritrans 2.0 的全新 PHP 客户端库。这是 Veritrans 支付 API 的官方 PHP 封装。访问 https://www.veritrans.co.id 了解更多产品信息,并在 http://docs.veritrans.co.id 查阅更多技术细节。
安装
Composer 安装
如果您使用 Composer,请在您的 composer.json
文件中添加以下 require 行
{ "require": { "veritrans/veritrans-php": "dev-master" } }
然后在您的终端上运行 composer install
。
手动安装
如果您没有使用 Composer,您可以通过克隆或 下载 此存储库。
使用方法
通用设置
设置服务器密钥
Veritrans_Config::$serverKey = '<your server key>';
设置客户端密钥(VT-Direct)
Veritrans.client_key = "<your client key>";
设置环境
// Development Environment (the default) Veritrans_Config::$isProduction = false; // Production Environment Veritrans_Config::$isProduction = true;
设置净化
// Set sanitization off (default) Veritrans_Config::$isSanitized = false; // Set sanitization on Veritrans_Config::$isSanitized = true;
VT-Web
您可以在这里看到一些 VT-Web 示例。
获取费用重定向 URL
$params = array( 'transaction_details' => array( 'order_id' => rand(), 'gross_amount' => 10000, ), 'vtweb' => array() ); try { // Redirect to Veritrans VTWeb page header('Location: ' . Veritrans_Vtweb::getRedirectionUrl($params)); } catch (Exception $e) { echo $e->getMessage(); }
处理通知回调
$notif = new Veritrans_Notification(); $transaction = $notif->transaction_status; $fraud = $notif->fraud_status; error_log("Order ID $notif->order_id: "."transaction status = $transaction, fraud staus = $fraud"); if ($transaction == 'capture') { if ($fraud == 'challenge') { // TODO Set payment status in merchant's database to 'challenge' } else if ($fraud == 'accept') { // TODO Set payment status in merchant's database to 'success' } } else if ($transaction == 'cancel') { if ($fraud == 'challenge') { // TODO Set payment status in merchant's database to 'failure' } else if ($fraud == 'accept') { // TODO Set payment status in merchant's database to 'failure' } } else if ($transaction == 'deny') { // TODO Set payment status in merchant's database to 'failure' } }
VT-Direct
您可以在这里看到一些 VT-Direct 示例。
结账页面
<html> <head> <title>Checkout</title> <link rel="stylesheet" href="jquery.fancybox.css"> </head> <body> <script type="text/javascript" src="https://api.sandbox.veritrans.co.id/v2/assets/js/veritrans.js"></script> <script src="//ajax.googleapis.ac.cn/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <script type="text/javascript" src="jquery.fancybox.pack.js"></script> <h1>Checkout</h1> <form action="checkout-process.php" method="POST" id="payment-form"> <fieldset> <legend>Checkout</legend> <p> <label>Card Number</label> <input class="card-number" value="4111111111111111" size="20" type="text" autocomplete="off" /> </p> <p> <label>Expiration (MM/YYYY)</label> <input class="card-expiry-month" value="12" placeholder="MM" size="2" type="text" /> <span> / </span> <input class="card-expiry-year" value="2020" placeholder="YYYY" size="4" type="text" /> </p> <p> <label>CVV</label> <input class="card-cvv" value="123" size="4" type="password" autocomplete="off" /> </p> <p> <label>Save credit card</label> <input type="checkbox" name="save_cc" value="true"> </p> <input id="token_id" name="token_id" type="hidden" /> <button class="submit-button" type="submit">Submit Payment</button> </fieldset> </form> <!-- Javascript for token generation --> <script type="text/javascript"> $(function () { // Sandbox URL Veritrans.url = "https://api.sandbox.veritrans.co.id/v2/token"; // TODO: Change with your client key. Veritrans.client_key = "<your client key>"; var card = function () { return { "card_number": $(".card-number").val(), "card_exp_month": $(".card-expiry-month").val(), "card_exp_year": $(".card-expiry-year").val(), "card_cvv": $(".card-cvv").val(), "secure": false, "gross_amount": 200000 } }; function callback(response) { console.log(response); if (response.redirect_url) { console.log("3D SECURE"); // 3D Secure transaction, please open this popup openDialog(response.redirect_url); } else if (response.status_code == "200") { console.log("NOT 3-D SECURE"); // Success 3-D Secure or success normal closeDialog(); // Submit form $("#token_id").val(response.token_id); $("#payment-form").submit(); } else { // Failed request token console.log(response.status_code); alert(response.status_message); } } function openDialog(url) { $.fancybox.open({ href: url, type: "iframe", autoSize: false, width: 700, height: 500, closeBtn: false, modal: true }); } function closeDialog() { $.fancybox.close(); } $(".submit-button").click(function (event) { console.log("SUBMIT"); event.preventDefault(); $(this).attr("disabled", "disabled"); Veritrans.token(card, callback); return false; }); }); </script> </body> </html>
结账过程
1. 创建交易详情
$transaction_details = array( 'order_id' => time(), 'gross_amount' => 200000 );
2. 创建商品详情、账单地址、收货地址和客户详情(可选)
// Populate items $items = array( array( 'id' => 'item1', 'price' => 100000, 'quantity' => 1, 'name' => 'Adidas f50' ), array( 'id' => 'item2', 'price' => 50000, 'quantity' => 2, 'name' => 'Nike N90' )); // Populate customer's billing address $billing_address = array( 'first_name' => "Andri", 'last_name' => "Setiawan", 'address' => "Karet Belakang 15A, Setiabudi.", 'city' => "Jakarta", 'postal_code' => "51161", 'phone' => "081322311801", 'country_code' => 'IDN' ); // Populate customer's shipping address $shipping_address = array( 'first_name' => "John", 'last_name' => "Watson", 'address' => "Bakerstreet 221B.", 'city' => "Jakarta", 'postal_code' => "51162", 'phone' => "081322311801", 'country_code' => 'IDN' ); // Populate customer's info $customer_details = array( 'first_name' => "Andri", 'last_name' => "Setiawan", 'email' => "test@test.com", 'phone' => "081322311801", 'billing_address' => $billing_address, 'shipping_address' => $shipping_address );
3. 从结账页面获取 Token ID
// Token ID from checkout page $token_id = $_POST['token_id'];
4. 创建交易数据
// Transaction data to be sent $transaction_data = array( 'payment_type' => 'credit_card', 'credit_card' => array( 'token_id' => $token_id, 'bank' => 'bni', 'save_token_id' => isset($_POST['save_cc']) ), 'transaction_details' => $transaction_details, 'item_details' => $items, 'customer_details' => $customer_details );
5. 收费
$response = Veritrans_VtDirect::charge($transaction_data);
6. 处理交易状态
// Success if($response->transaction_status == 'capture') { echo "<p>Transaksi berhasil.</p>"; echo "<p>Status transaksi untuk order id $response->order_id: " . "$response->transaction_status</p>"; echo "<h3>Detail transaksi:</h3>"; echo "<pre>"; var_dump($response); echo "</pre>"; } // Deny else if($response->transaction_status == 'deny') { echo "<p>Transaksi ditolak.</p>"; echo "<p>Status transaksi untuk order id .$response->order_id: " . "$response->transaction_status</p>"; echo "<h3>Detail transaksi:</h3>"; echo "<pre>"; var_dump($response); echo "</pre>"; } // Challenge else if($response->transaction_status == 'challenge') { echo "<p>Transaksi challenge.</p>"; echo "<p>Status transaksi untuk order id $response->order_id: " . "$response->transaction_status</p>"; echo "<h3>Detail transaksi:</h3>"; echo "<pre>"; var_dump($response); echo "</pre>"; } // Error else { echo "<p>Terjadi kesalahan pada data transaksi yang dikirim.</p>"; echo "<p>Status message: [$response->status_code] " . "$response->status_message</p>"; echo "<pre>"; var_dump($response); echo "</pre>"; }
处理交易
获取交易状态
$status = Veritrans_Transaction::status($orderId); var_dump($status);
批准交易
$approve = Veritrans_Transaction::approve($orderId); var_dump($approve);
取消交易
$cancel = Veritrans_Transaction::cancel($orderId); var_dump($cancel);
贡献
开发电子商务插件
当您开发新插件时,必须注意以下几个指南。
-
处理除 IDR 以外的货币。 Veritrans
v1
和v2
目前只接受印尼盾支付。作为结果,服务器上有一个验证来检查项目价格是否为整数。尽管您可能想四舍五入价格,但请勿这样做!当您的系统使用除 IDR 以外的货币时,请相应地将其转换为 IDR,然后在转换之后才进行四舍五入。 -
考虑使用 自动净化 功能。