印尼本地第三方支付Veritrans的ecshop插件
来源:互联网 发布:网络直播底线失守图片 编辑:程序博客网 时间:2024/04/28 16:18
做一个印尼的ecshop二次开发,需要开发一个印尼本地的第三方支付的插件。印尼本地最大的线上支付是日本公司开发的Veritrans,Veritrans网址为:https://www.veritrans.co.id
以下是ecshop的完整代码:
第一步:在includes/modules/payment下,新建一个veritrans.php
<?php/** * veritrans 支付插件 * @author yuanjiang 04.29.2015 * @932625974#qq.com*/if (!defined('IN_ECS')){ die('Hacking attempt');}$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/veritrans.php';if (file_exists($payment_lang)){ global $_LANG; include_once($payment_lang);}/* 模块的基本信息 */if (isset($set_modules) && $set_modules == TRUE){ $i = isset($modules) ? count($modules) : 0; /* 代码 */ $modules[$i]['code'] = basename(__FILE__, '.php'); /* 描述对应的语言项 */ $modules[$i]['desc'] = 'veritrans_desc'; /* 是否支持货到付款 */ $modules[$i]['is_cod'] = '0'; /* 是否支持在线支付 */ $modules[$i]['is_online'] = '1'; /* 作者 */ $modules[$i]['author'] = 'Yuan Jiang'; /* 网址 */ $modules[$i]['website'] = 'http://www.veritrans.co.id'; /* 版本号 */ $modules[$i]['version'] = '1.0.0'; /* 配置信息 */ $modules[$i]['config'] = array( array('name' => 'veritrans_client_key', 'type' => 'text', 'value' => ''), array('name' => 'veritrans_server_key', 'type' => 'text', 'value' => ''), ); return;}/* config */class Veritrans_Config { public static $serverKey = 'your serverKey'; public static $clientKey; public static $apiVersion = 2; public static $isProduction = false; public static $is3ds = false; public static $isSanitized = false; const SANDBOX_BASE_URL = 'https://api.sandbox.veritrans.co.id/v2'; const PRODUCTION_BASE_URL = 'https://api.veritrans.co.id/v2'; public static function getBaseUrl() { return Veritrans_Config::$isProduction ? Veritrans_Config::PRODUCTION_BASE_URL : Veritrans_Config::SANDBOX_BASE_URL; }}/* verify */class Veritrans_Sanitizer { public static function jsonRequest(&$json) { $keys = array('item_details', 'customer_details'); foreach ($keys as $key) { if (!array_key_exists($key, $json)) continue; $camel = self::upperCamelize($key); $function = "field$camel"; self::$function($json[$key]); } } private static function upperCamelize($string) { return str_replace(' ', '', ucwords(str_replace('_', ' ', $string))); }}/* tool */class Veritrans_ApiRequestor { public static function get($url, $server_key, $data_hash) { return self::remoteCall($url, $server_key, $data_hash, false); } public static function post($url, $server_key, $data_hash) { return self::remoteCall($url, $server_key, $data_hash, true); } public static function remoteCall($url, $server_key, $data_hash, $post = true) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Accept: application/json', 'Authorization: Basic ' . base64_encode($server_key . ':') )); if ($post) { curl_setopt($ch, CURLOPT_POST, 1); if ($data_hash) { $body = json_encode($data_hash); curl_setopt($ch, CURLOPT_POSTFIELDS, $body); } else { curl_setopt($ch, CURLOPT_POSTFIELDS, ''); } } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CAINFO, dirname(__FILE__) . "/../../../cert/veritrans.pem"); $result = curl_exec($ch); // curl_close($ch); if ($result === FALSE) { throw new Exception('CURL Error: ' . curl_error($ch), curl_errno($ch)); } else { $result_array = json_decode($result); if (!in_array($result_array->status_code, array(200, 201, 202, 407))) { $message = 'Veritrans Error (' . $result_array->status_code . '): ' . $result_array->status_message; throw new Exception($message, $result_array->status_code); } else { return $result_array; } } }} class Veritrans_Notification { private $response; public function __construct($input_source = "php://input") { $this->response = json_decode(file_get_contents($input_source), true); } public function __get($name) { if (array_key_exists($name, $this->response)) { return $this->response[$name]; } }}/* transaction: confirm the status, approve or cancel the payment */class Veritrans_Transaction { public static function status($id) { return Veritrans_ApiRequestor::get( Veritrans_Config::getBaseUrl() . '/' . $id . '/status', Veritrans_Config::$serverKey, false); } public static function approve($id) { return Veritrans_ApiRequestor::post( Veritrans_Config::getBaseUrl() . '/' . $id . '/approve', Veritrans_Config::$serverKey, false)->status_code; } public static function cancel($id) { return Veritrans_ApiRequestor::post( Veritrans_Config::getBaseUrl() . '/' . $id . '/cancel', Veritrans_Config::$serverKey, false)->status_code; }}/* main */class veritrans { /* pay code */ public function get_code($order, $payment) { $params = array( 'transaction_details' => array('order_id' => $order['order_sn'], 'gross_amount' => $order['order_amount']), 'custom_field1' => $order['log_id'], //支付记录id,支付完成后Veritrans返回此参数,用于更新 ); $payloads = array( 'payment_type' => 'vtweb', 'vtweb' => array( // 'enabled_payments' => array('credit_card'), 'credit_card_3d_secure' => Veritrans_Config::$is3ds ) ); if (array_key_exists('item_details', $params)) { $gross_amount = 0; foreach ($params['item_details'] as $item) { $gross_amount += $item['quantity'] * $item['price']; } $payloads['transaction_details']['gross_amount'] = $gross_amount; } $payloads = array_replace_recursive($payloads, $params); if (Veritrans_Config::$isSanitized) { Veritrans_Sanitizer::jsonRequest($payloads); } $result = Veritrans_ApiRequestor::post( Veritrans_Config::getBaseUrl() . '/charge', $payment['veritrans_server_key'], $payloads); if($result){ $button = '<div class="tc"><input type="button" onclick="window.open(\''.$result->redirect_url.'\')" value="' .$GLOBALS['_LANG']['pay_button']. '" /></div>'; }else{ $button = '<div class="tc"><input type="button" onclick="window.location.reload();" value="' .$GLOBALS['_LANG']['pay_button']. '" /></div>';}return $button; } /* respond */ public function respond(){ $action = $_REQUEST['action']; //notification if($action=='notification'){ $notif = new Veritrans_Notification();$order_id = $notif->order_id; } //finish else{ $order_id = $_REQUEST['order_id']; } $status = Veritrans_Transaction::status($order_id); $transaction = $status->transaction_status; $fraud = $status->fraud_status; 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' /* 检查支付的金额是否相符 */ if (!check_money($status->custom_field1, $status->gross_amount)){ return false; } else{ /* 改变订单状态 */ order_paid($status->custom_field1, PS_PAYED, $action_note = 'paid by veritrans at '.$status->transaction_time); return true; } } } 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' } return false; }}?>
第二步:为veritrans.php新建语言文件,在languages/en_us/payment下,新建veritrans.php
<?php/** * ECSHOP Veritrans language file * ============================================================================ * All right reserved (C) 2005-2011 Beijing Yi Shang Interactive Technology * Development Ltd. * Web site: http://www.ecshop.com * ---------------------------------------------------------------------------- * This is a free/open source software;it means that you can modify, use and * republish the program code, on the premise of that your behavior is not for * commercial purposes. * ============================================================================ * $Author: yuanjiang $ * $Id: veritrans.php 17217 2011-01-19 06:29:08Z yuanjiang $ */global $_LANG;$_LANG['veritrans'] = 'Veritrans';$_LANG['veritrans_desc'] = 'veritrans is the online payment for Indonesia eCommerce';$_LANG['veritrans_client_key'] = 'client key';$_LANG['veritrans_server_key'] = 'server key';$_LANG['pay_button'] = 'Pay in Veritrans immediately';?>
第三步:将veritrans的demo中的证书cacert.pem上传到ecshop的cert下,并改名为veritrans.pem
以上三步就完成了veritrans支付的全过程。
0 0
- 印尼本地第三方支付Veritrans的ecshop插件
- 常用的第三方支付
- ecshop支付插件开发
- 实用的第三方插件
- 第三方插件-微信支付接入注意问题
- 第三方支付潜在的洗钱风险
- 第三方支付平台的状态表
- 第三方支付宝的集成
- 开源的第三方支付系统
- 第三方支付遇到的问题
- 第三方支付异步通知的陷阱
- ECSHOP整合第三方登录,QQ登录、新浪微博登录、支付宝登
- 第三方支付,在线支付
- 第三方支付宝支付
- 第三方支付宝支付
- ECSHOP中国工商银行(ICBC)支付插件
- ecshop 微信支付插件
- 第三方支付
- github提交空文件夹方法
- OC编程题1
- openstack的虚拟机网卡、网桥等(tap、qbr、qvb、qvo)mtu设置
- URDF教程
- java.io.InvalidClassException:local class incompatible: stream classdesc serialV
- 印尼本地第三方支付Veritrans的ecshop插件
- Android-实现ListView左右滑动删除和编辑(仿微信电话本)
- RabbitMQ基本安装与配置管理
- Linux查看CPU信息、机器型号等硬件信息
- 大型网站架构演化
- Detected both log4j-over-slf4j.jar AND slf4j-log4j12.jar
- jsp页面中Url转码
- RHEL 光盘镜像做本地源
- BZOJ1095【动态点分治】【优先队列】