ecshop支付方式含线下自提
ecshop 支付接口函数库:lib_payment.php
支付方式列表展示模板: payment_list.htm
支付方式以ecshop插件存在,目录所在地includes/modules/payment
<?php
if (!defined('IN_ECS'))
{
die('Hacking attempt');
}
$payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/cod.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'] = 'cod_desc';
/* 是否支持货到付款 */
$modules[$i]['is_cod'] = '1';
/* 是否支持在线支付 */
$modules[$i]['is_online'] = '0';
/* 支付费用,由配送决定 */
$modules[$i]['pay_fee'] = '0';
/* 作者 */
$modules[$i]['author'] = 'ECSHOP TEAM';
/* 网址 */
$modules[$i]['website'] = 'http://www.ecshop.com';
/* 版本号 */
$modules[$i]['version'] = '1.0.0';
/* 配置信息 */
$modules[$i]['config'] = array();
return;
}
/**
* 类
*/
class cod
{
/**
* 构造函数
*
* @access public
* @param
*
* @return void
*/
function cod()
{
}
function __construct()
{
$this->cod();
}
/**
* 提交函数,生成支付代码
*/
function get_code()
{
return '';
}
/**
* 处理函数
*/
function response()
{
return;
}
}
?>
相对应的支付方式语言所在目录为:ecshop/languages/XXX/payment,主要设置标题名和标题描述 。
payment.php在取得插件文件中的支付方式的同时读取数据库ecs_payment中有没相应数据,有则取数据库中的名称和描述以及相应信息.
payment.php包含下述各种方法和操作:
list :支付方式列表 ?act=list
install:安装支付方式 ?act=install&code=".$code."
edit:编辑支付方式 ?act=edit&code={$code}
post:提交支付方式 post
uninstall:卸载支付方式 ?act=uninstall&code={$code}
edit_name:修改支付方式名称
edit_desc:修改支付方式描述
edit_order:修改支付方式排序
edit_pay_fee:修改支付方式费用
同样上门自取可通过参考货到付款方式进行编辑,需另外补充的就是上门自取有提取地址需要设置并保存。
如:在自定义的selfcollection.php(上门自取支付方式)中添加配置参数以便用户选择到哪个地方提取。如下:
/* 配置信息 */
$modules[$i]['config'] = array(
array('name' => 'address', 'type' => 'textarea', 'value' => '北京,北京西单北大街131号
上海,浦东新区陆家嘴西路168号(近东方名珠)
广州,天河区天河路2号
南京,南京市汉中路89号金鹰国际商城1-6楼
杭州,杭州市钱江城富春路701号'),
);
采用多文本区域输入, 每一行分别表示地区及店面地址,在用户页面展示过程中需处理成多行。
在获取支付方式的过程中判断支付方式如果为上门自取时,处理代码如下:
else if($payment['pay_code'] == 'selfcollection')
{
$payment = payment_info($payment['pay_id']);
if(!empty($payment))
{
$pay_config = unserialize_config($payment['pay_config']); $pay_config['address'] = str_replace("<br />","\r\n",$pay_config['address']);
$pay_config_array = explode("\r\n", $pay_config['address']); $pay_array = array();
for($index=0;$index<count($pay_config_array);$index++)
{
$delimiter = explode(',', $pay_config_array[$index]);
$pay_array[$index]['id'] = $index;
$pay_array[$index]['name'] = $delimiter[0];
$pay_array[$index]['addr'] = $delimiter[1];
}
$smarty->assign('pay_array', $pay_array);
$smarty->assign('pay_count', count($pay_config_array));
}
}
同样的在模板展示flow.dwt中的代码如下:
<!--{if $pay_count neq 0}-->
<div class="flowBox">
<h6><span>{$lang.selfcollection}</span></h6>
<table width="99%" align="center" border="0" cellpadding="5" cellspacing="1" bgcolor="#dddddd" id="payArray" {if $order.pay_id neq "4"}style="display:none"{/if}> //order.pay_id 等于4表示上门自取的支付方式,在实际测试建议判断唯一标示pay_code为selfcollection
<tr>
<th width="5%" bgcolor="#ffffff"> </th>
<th width="20%" bgcolor="#ffffff">{$lang.name}</th>
<th bgcolor="#ffffff">{$lang.describe}</th>
</tr>
<!-- {foreach from=$pay_array item=pay_cod} -->
<!-- 循环上门自取方式 -->
<tr>
<td valign="top" bgcolor="#ffffff"><input type="radio" name="selfcollection" value="{$pay_cod.id}" /></td>
<td valign="top" bgcolor="#ffffff"><strong>{$pay_cod.name}</strong></td>
<td valign="top" bgcolor="#ffffff">{$pay_cod.addr}</td>
</tr>
<!-- {/foreach} 循环上门自取方式 -->
</table>
</div>
<!--{else}-->
<input name = "payment" type="radio" value = "-1" checked="checked" style="display:none"/>
<!--{/if}-->
另外在选择支付方式过程中,使用JS实现上门自取地址动态显示和隐藏:
/* *
* 改变支付方式
*/
function selectPayment(obj)
{
if (selectedPayment == obj)
{
return;
}
else
{
selectedPayment = obj;
}
var payCode = obj.attributes['payCode'].value;
var theForm = obj.form;
for (i = 0; i < theForm.elements.length; i ++ )
{
if(payCode == "selfcollection")
{
if (theForm.elements[i].name == 'selfcollection')
{
theForm.elements[i].checked = true;
theForm.elements[i].disabled = false;
document.getElementById("payArray").style.display = "table";
//document.getElementById("payArray").style.visibility = "visible";
}
}
else
{
if (theForm.elements[i].name == 'selfcollection')
{
theForm.elements[i].checked = false;
theForm.elements[i].disabled = true;
document.getElementById("payArray").style.display = "none";
//document.getElementById("payArray").style.visibility = "hidden";
}
}
} Ajax.call('flow.php?step=select_payment', 'payment=' + obj.value, orderSelectedResponse, 'GET', 'JSON');
}
通过查看购物车flow.php中的提交表单流程done,我们可以看到在提交表单之后ecshop分别把$order相应的数据插入到ecs_order_info订单信息表,同时把ecs_cart购物车的物品的部分信息插入到ecs_order_goods商品信息表中 。这边要注意的一个函数调用 $GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('order_info'), $order, 'INSERT');相应的函数声明在cls_mysql609行,主要参数名分别为表单名,数据,以及数据库操作方法,通过读取数据中的字段如果匹配到数据表中的字段名,则执行相应的数据库操作(如insert,update)。
同样的我们要把上门自取的地址和ID在提交表单过程中写入到数据表单中, 首先要做的是在ecs_order_goodes中插入2个上门自取的ID和地址name字段名,如下:
ALTER TABLE `ecs_order_info` add column `selfcol_id` TINYINT(3) NOT NULL DEFAULT '0'; ALTER TABLE `ecs_order_info` add column `selfcol_name` VARCHAR(120) COLLATE utf8_general_ci NOT NULL DEFAULT '';
然后在执行提交表单操作done过程中,通过判断支付方式为上门自取的时候,提取相应的ID和name保存到$order字段中即可。
/* 支付方式 */
if ($order['pay_id'] > 0)
{
$payment = payment_info($order['pay_id']);
if($payment['pay_code'] == 'selfcollection')
{
$order['selfcol_id'] = intval($_POST['selfcollection']);
$pay_config = unserialize_config($payment['pay_config']);
$pay_config['address'] = str_replace("<br />","\r\n",$pay_config['address']);
$pay_config_array = explode("\r\n", $pay_config['address']); $pay_array = array();
for($index=0;$index<count($pay_config_array);$index++)
{
$delimiter = explode(',', $pay_config_array[$index]);
$pay_array[$index]['id'] = $index;
$pay_array[$index]['name'] = $delimiter[0];
$pay_array[$index]['addr'] = $delimiter[1];
}
$order['selfcol_name'] = addslashes($pay_array[$order['selfcol_id']]['addr']);
}
$order['pay_name'] = addslashes($payment['pay_name']);
}
实际演示过程就可以看到ecs_order_goods数据已保存成功。
ecshop支付方式含线下自提的更多相关文章
- IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习
2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...
- BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)
BAT线下战争:巨额投资或培养出自己最大对手 2015年10月12日09:49 <财经>杂志 我有话说(18人参与) 收藏本文 BAT大举投资线下公司,看似咄咄逼人 ...
- 线下市场,选择微信小程序从未显得如此重要
2017 年 1 月 9 日,小程序正式上线,到今日,3 月 8 号,这个新产品面世刚好满两个月.小程序刚推出便受到全球关注,腾讯股价当天即创逾一个月高位,但关注度先是急速上涨,不久便迅速降温,甚至在 ...
- CTF线下防御战 — 让你的靶机变成“铜墙铁壁”
本文首发安全客,未经允许禁止转载.原文链接 一. 前言 随着CTF的普及,比赛的形式也有了越来越多的花样,对于线下赛来说,开始出现了安全加固或者防御战之类的环节,亦或者因为拿下靶机后不希望其他攻击者进 ...
- 【科创人·独家】MegaEase左耳朵耗子陈皓复盘创业:第一年盈利被当骗子,线下广阔天地大有可为
[科创人·独家]MegaEase左耳朵耗子陈皓复盘创业:第一年盈利被当骗子,线下广阔天地大有可为 原创: babayage CTO科创圈 与上百位科技创业者共同关注科创人的成长心路. 文末有彩蛋:& ...
- 域渗透复盘(安洵CTF线下)
复盘线下域渗透环境Write Up 0x01 外网web到DMZ进域 外网web入口 joomla应用 192.168.0.5 反序列化打下来 GET /index.php HTTP/1.1 Ho ...
- YY一下微信线下支付的场景
在上一篇文章里面提到了 <跨行清算的实现原理>,这次来分析一下线下支付的场景和流程. 今天看到一篇文章:http://www.huxiu.com/article/23248/1.html? ...
- ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!
点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...
- 微信公众平台"微信连Wi-Fi"功能来了 线下微信增粉利器
微信连Wi-Fi功能在第三方开发者和服务商已经有出现了,但有些成本相对会高些.近日微信公众平台新添了一个功能插件“微信连Wi-Fi”,已有微信认证过的公众号即可申请开通.赶紧去布局这个线下微信增粉利器 ...
随机推荐
- 关于System.Windows.Forms.DateTimePicker的一个Bug
几天接到客户的反馈,说系统无法查询2017年2月份的账单,原因是没办法选择2017年2月份,没办法选择2月份???,马上开启vs,运行系统,应为市去年的系统,测试数据也是去年的,就查询了2016年2月 ...
- oracle中varchar、varchar2、char和nvarchar的区别
1.char char的长度是固定的,比如说,你定义了char(20),即使你你插入abc,不足二十个字节,数据库也会在abc后面自动加上17个空格,以补足二十个字节: char是区分中英文的,中文在 ...
- python3.x中如何实现print不换行
大家应该知道python中print之后是默认换行的, 那如何我们不想换行,且不想讲输出内容用一个print函数输出时,就需要改变print默认换行的属性, 方法如下: print('contents ...
- 蓝桥杯-兰顿蚂蚁-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- Codeforces Round #410 (Div. 2)C题
C. Mike and gcd problem time limit per test 2 seconds memory limit per test 256 megabytes input stan ...
- MongoDB副本集的搭建
副本集是mongodb提供的一种高可用解决方案.相对于原来的主从复制,副本集能自动感知primary节点的下线,并提升其中一个Secondary作为Primary. 整个过程对业务透明,同时也大大降低 ...
- 基于三层交换机和基于路由子接口的vlan间路由
1:通过三层交换机实现vlan间的通信:为三层交换机创建vlan,设置交换机的两个SVI,并配置IP地址. (在二层交换机上只能配置一个SVI端口,用来实现交换机交换机远程管理,在三层交换机上可以配置 ...
- Struts2之2.5.10.1HelloWorld
Struts2.5.10.1是目前为止最新的版本,struts2建议持续跟进,理由大家都懂.好了,下面步入正题. 基于struts2.5.10.1建立一个HelloWorld,基于注解的哈! 工具:e ...
- redis之sentinel概述
一.配置sentinel 修改的是这条: 对应: 上面那条配置需要注意:<master-name>:监控主节点的名称 <ip>:监控主节点的ip <redis-por ...
- Linux-vim学习入门
1.前言 vi/vim是linux中很重要的文本编辑器.我第一次使用这个编辑器时,很不习惯,甚至都不知道如何移动光标和插入字符.慢慢地经过学习,才知道如何使用vi/vim. vi/vi ...