用户展示页面模板所在:如ecshop/theme/default/flow.dwt
后台管理展示页面模板所在:如admin/templates/payment_list.htm

ecshop 支付接口函数库:lib_payment.php

支付方式列表展示模板: payment_list.htm

支付方式以ecshop插件存在,目录所在地includes/modules/payment

admin/payment.php调用read_modules函数读取支付插件目录下的文件名进行支付方式页面列表展示,每一个文件表示一个支付模块。
lib_main.php中的read_modules有2个变量,$set_modules起到锁模块作用,保持互斥,$modules在使用include_once包含支付文件时被赋值。
每个支付模块包含在includes/modules/payment。使用通用的模板,我们提取最简单的支付模块货到付款代码cod.php进行展示:

<?php

  1. if (!defined('IN_ECS'))
  2. {
  3.     die('Hacking attempt');
  4. }
  5.  
  6. $payment_lang = ROOT_PATH . 'languages/' .$GLOBALS['_CFG']['lang']. '/payment/cod.php';
  7.  
  8. if (file_exists($payment_lang))
  9. {
  10.     global $_LANG;
  11.  
  12.     include_once($payment_lang);
  13. }
  14.  
  15. /* 模块的基本信息 */
  16. if (isset($set_modules) && $set_modules == TRUE)
  17. {
  18.     $i = isset($modules) ? count($modules) : 0;
  19.  
  20.     /* 代码 */
  21.     $modules[$i]['code']    = basename(__FILE__, '.php');
  22.  
  23.     /* 描述对应的语言项 */
  24.     $modules[$i]['desc']    = 'cod_desc';
  25.  
  26.     /* 是否支持货到付款 */
  27.     $modules[$i]['is_cod']  = '1';
  28.  
  29.     /* 是否支持在线支付 */
  30.     $modules[$i]['is_online']  = '0';
  31.  
  32.     /* 支付费用,由配送决定 */
  33.     $modules[$i]['pay_fee'] = '0';
  34.  
  35.     /* 作者 */
  36.     $modules[$i]['author']  = 'ECSHOP TEAM';
  37.  
  38.     /* 网址 */
  39.     $modules[$i]['website'] = 'http://www.ecshop.com';
  40.  
  41.     /* 版本号 */
  42.     $modules[$i]['version'] = '1.0.0';
  43.  
  44.     /* 配置信息 */
  45.     $modules[$i]['config']  = array();
  46.  
  47.     return;
  48. }
  49.  
  50. /**
  51.  * 类
  52.  */
  53. class cod
  54. {
  55.     /**
  56.      * 构造函数
  57.      *
  58.      * @access  public
  59.      * @param
  60.      *
  61.      * @return void
  62.      */
  63.     function cod()
  64.     {
  65.     }
  66.  
  67.     function __construct()
  68.     {
  69.         $this->cod();
  70.     }
  71.  
  72.     /**
  73.      * 提交函数,生成支付代码
  74.      */
  75.     function get_code()
  76.     {
  77.         return '';
  78.     }
  79.  
  80.     /**
  81.      * 处理函数
  82.      */
  83.     function response()
  84.     {
  85.         return;
  86.     }
  87. }
  88.  
  89. ?>

相对应的支付方式语言所在目录为:ecshop/languages/XXX/payment,主要设置标题名和标题描述 。

payment.php在取得插件文件中的支付方式的同时读取数据库ecs_payment中有没相应数据,有则取数据库中的名称和描述以及相应信息.

payment.php包含下述各种方法和操作:

list :支付方式列表 ?act=list

install:安装支付方式 ?act=install&code=".$code."

get_config:获取配置参数

edit:编辑支付方式 ?act=edit&code={$code}

post:提交支付方式 post

uninstall:卸载支付方式 ?act=uninstall&code={$code}

edit_name:修改支付方式名称

edit_desc:修改支付方式描述

edit_order:修改支付方式排序

edit_pay_fee:修改支付方式费用

同样上门自取可通过参考货到付款方式进行编辑,需另外补充的就是上门自取有提取地址需要设置并保存。 

如:在自定义的selfcollection.php(上门自取支付方式)中添加配置参数以便用户选择到哪个地方提取。如下:

/* 配置信息 */

  1.     $modules[$i]['config']  = array(
  2.         array('name' => 'address', 'type' => 'textarea', 'value' => '北京,北京西单北大街131号
  3. 上海,浦东新区陆家嘴西路168号(近东方名珠)
  4. 广州,天河区天河路2号
  5. 南京,南京市汉中路89号金鹰国际商城1-6楼
  6. 杭州,杭州市钱江城富春路701号'),
  7.     );

采用多文本区域输入, 每一行分别表示地区及店面地址,在用户页面展示过程中需处理成多行。

在获取支付方式的过程中判断支付方式如果为上门自取时,处理代码如下:

  1. else if($payment['pay_code'] == 'selfcollection')
  2.             {
  3.                 $payment = payment_info($payment['pay_id']);
  4.                 if(!empty($payment))
  5.                 {
  6.                     $pay_config = unserialize_config($payment['pay_config']);
  7.  
  8.                     $pay_config['address'] = str_replace("<br />","\r\n",$pay_config['address']);
  9.                     $pay_config_array = explode("\r\n", $pay_config['address']);
  10.  
  11.                     $pay_array = array();
  12.                     for($index=0;$index<count($pay_config_array);$index++)
  13.                     {
  14.                         $delimiter = explode(',', $pay_config_array[$index]);
  15.                         $pay_array[$index]['id'] = $index;
  16.                         $pay_array[$index]['name'] = $delimiter[0];
  17.                         $pay_array[$index]['addr'] = $delimiter[1];
  18.                     }
  19.                     $smarty->assign('pay_array', $pay_array);
  20.                     $smarty->assign('pay_count',  count($pay_config_array));
  21.                 }
  22.             }           

同样的在模板展示flow.dwt中的代码如下:

  1. <!--{if $pay_count neq 0}-->
  2.     <div class="flowBox">
  3.     <h6><span>{$lang.selfcollection}</span></h6>
  4.     <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
  5.     
  6.             <tr>
  7.               <th width="5%" bgcolor="#ffffff">&nbsp;</th>
  8.               <th width="20%" bgcolor="#ffffff">{$lang.name}</th>
  9.               <th bgcolor="#ffffff">{$lang.describe}</th>
  10.             </tr>
  11.             <!-- {foreach from=$pay_array item=pay_cod} -->
  12.             <!-- 循环上门自取方式 -->
  13.             <tr>
  14.               <td valign="top" bgcolor="#ffffff"><input type="radio" name="selfcollection" value="{$pay_cod.id}" /></td>
  15.               <td valign="top" bgcolor="#ffffff"><strong>{$pay_cod.name}</strong></td>
  16.               <td valign="top" bgcolor="#ffffff">{$pay_cod.addr}</td>
  17.             </tr>
  18.             <!-- {/foreach} 循环上门自取方式 -->
  19.           </table>
  20.     </div>
  21.     <!--{else}-->
  22.         <input name = "payment" type="radio" value = "-1" checked="checked"  style="display:none"/>
  23.     <!--{/if}-->

另外在选择支付方式过程中,使用JS实现上门自取地址动态显示和隐藏:

  1. /* *
  2.  * 改变支付方式
  3.  */
  4. function selectPayment(obj)
  5. {
  6.   if (selectedPayment == obj)
  7.   {
  8.     return;
  9.   }
  10.   else
  11.   {
  12.     selectedPayment = obj;
  13.   }
  14.   
  15.   var payCode = obj.attributes['payCode'].value;
  16.   var theForm = obj.form;
  17.   for (= 0; i < theForm.elements.length; i ++ )
  18.   {
  19.       if(payCode == "selfcollection")
  20.       {
  21.           if (theForm.elements[i].name == 'selfcollection')
  22.           {
  23.                 theForm.elements[i].checked = true;
  24.                 theForm.elements[i].disabled = false;
  25.                 document.getElementById("payArray").style.display = "table";
  26.                 //document.getElementById("payArray").style.visibility = "visible";
  27.           }
  28.       }
  29.       else
  30.       {
  31.           if (theForm.elements[i].name == 'selfcollection')
  32.           {
  33.                 theForm.elements[i].checked = false;
  34.                 theForm.elements[i].disabled = true;
  35.                 document.getElementById("payArray").style.display = "none";
  36.                 //document.getElementById("payArray").style.visibility = "hidden";
  37.           }
  38.       }
  39.     
  40.   }
  41.  
  42.   Ajax.call('flow.php?step=select_payment', 'payment=' + obj.value, orderSelectedResponse, 'GET', 'JSON');
  43. }

通过查看购物车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字段名,如下:

  1. ALTER TABLE `ecs_order_info` add column `selfcol_id` TINYINT(3) NOT NULL DEFAULT '0';
  2.  
  3. ALTER TABLE `ecs_order_info` add column `selfcol_name` VARCHAR(120) COLLATE utf8_general_ci NOT NULL DEFAULT '';

然后在执行提交表单操作done过程中,通过判断支付方式为上门自取的时候,提取相应的ID和name保存到$order字段中即可。

  1. /* 支付方式 */
  2.     if ($order['pay_id'] > 0)
  3.     {
  4.         $payment = payment_info($order['pay_id']);
  5.         
  6.         if($payment['pay_code'] == 'selfcollection')
  7.         {
  8.             $order['selfcol_id'] = intval($_POST['selfcollection']);
  9.             
  10.             $pay_config = unserialize_config($payment['pay_config']);
  11.             $pay_config['address'] = str_replace("<br />","\r\n",$pay_config['address']);
  12.             $pay_config_array = explode("\r\n", $pay_config['address']);
  13.  
  14.             $pay_array = array();
  15.             for($index=0;$index<count($pay_config_array);$index++)
  16.             {
  17.                 $delimiter = explode(',', $pay_config_array[$index]);
  18.                 $pay_array[$index]['id'] = $index;
  19.                 $pay_array[$index]['name'] = $delimiter[0];
  20.                 $pay_array[$index]['addr'] = $delimiter[1];
  21.             }
  22.             $order['selfcol_name'] = addslashes($pay_array[$order['selfcol_id']]['addr']);
  23.         }
  24.         
  25.         $order['pay_name'] = addslashes($payment['pay_name']); 
  26.     }

实际演示过程就可以看到ecs_order_goods数据已保存成功。

ecshop支付方式含线下自提的更多相关文章

  1. IT帮2019年2月线下活动【定义工作,解读自我】之站桩练习

    2019年2月IT帮线下活动[定义工作,解读自我] 昨天的活动收获很大,全面的总结周老师会另写一篇来帮助大家回顾.我想说一下其中最打动我的一句话:“只有你能决定你有多优秀!” “工作中把自己当成企业家 ...

  2. BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)

    BAT线下战争:巨额投资或培养出自己最大对手 2015年10月12日09:49   <财经>杂志    我有话说(18人参与) 收藏本文        BAT大举投资线下公司,看似咄咄逼人 ...

  3. 线下市场,选择微信小程序从未显得如此重要

    2017 年 1 月 9 日,小程序正式上线,到今日,3 月 8 号,这个新产品面世刚好满两个月.小程序刚推出便受到全球关注,腾讯股价当天即创逾一个月高位,但关注度先是急速上涨,不久便迅速降温,甚至在 ...

  4. CTF线下防御战 — 让你的靶机变成“铜墙铁壁”

    本文首发安全客,未经允许禁止转载.原文链接 一. 前言 随着CTF的普及,比赛的形式也有了越来越多的花样,对于线下赛来说,开始出现了安全加固或者防御战之类的环节,亦或者因为拿下靶机后不希望其他攻击者进 ...

  5. 【科创人·独家】MegaEase左耳朵耗子陈皓复盘创业:第一年盈利被当骗子,线下广阔天地大有可为

    [科创人·独家]MegaEase左耳朵耗子陈皓复盘创业:第一年盈利被当骗子,线下广阔天地大有可为 原创: babayage CTO科创圈  与上百位科技创业者共同关注科创人的成长心路. 文末有彩蛋:& ...

  6. 域渗透复盘(安洵CTF线下)

    复盘线下域渗透环境Write Up 0x01 外网web到DMZ进域 外网web入口 joomla应用   192.168.0.5 反序列化打下来 GET /index.php HTTP/1.1 Ho ...

  7. YY一下微信线下支付的场景

    在上一篇文章里面提到了 <跨行清算的实现原理>,这次来分析一下线下支付的场景和流程. 今天看到一篇文章:http://www.huxiu.com/article/23248/1.html? ...

  8. ABP(现代ASP.NET样板开发框架)主题线下交流会(上海)开始报名了!

    点这里进入ABP系列文章总目录 ABP主题线下交流会(上海)开始报名了 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称.它是采用最佳实践和流行技术 ...

  9. 微信公众平台"微信连Wi-Fi"功能来了 线下微信增粉利器

    微信连Wi-Fi功能在第三方开发者和服务商已经有出现了,但有些成本相对会高些.近日微信公众平台新添了一个功能插件“微信连Wi-Fi”,已有微信认证过的公众号即可申请开通.赶紧去布局这个线下微信增粉利器 ...

随机推荐

  1. NodeJS 阻塞/非阻塞

    阻塞实例 var fs = require('fs'); var data = fs.readFileSync('test.txt') console.log(data.toString()); co ...

  2. Python数据结构与循环语句

    # Python数据结构与循环语句:   首先编程是一项技能,类似跑步,期初不必在意细节,能使用起来就行,等学的游刃有余了再回过头来关注细节问题也不迟.  关于买书: 学会python之后,才需要买书 ...

  3. 蓝桥杯-循环节长度-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  4. CKEditor不借助CKFinder实现图片上传(.net版 ashx实现)

    参考博客:http://blog.csdn.net/mydwr/article/details/8669594 本人版本:4.4.6 打开文件:ckeditor/plugins/image/dialo ...

  5. unity游戏设计之背包系统

    这次任务是模仿上图的样子,制作一个类似的背包系统. 上面的链接为:http://www.tasharen.com/ngui/exampleX.html 我们的目标是: 1.实现背包系统的UI界面 2. ...

  6. JS中作用域

    var scope = 'global'; var f = function() { console.log(scope); // 输出 undefined var scope = 'f'; } f( ...

  7. mysql5.6源码自动安装脚本

    将脚本与源码安装包放在同一目录下,执行脚本即可(执行脚本会使用yum安装依赖包) 安装完成之后,既可以使用mysql -uroot -p登录   脚本内容如下: [root@mysql src]# c ...

  8. zoj1654 Place the Robots 二分图最大匹配

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=654 将每一行的包含空地的区域编号 再将每一列的包含空地的区域编号 然 ...

  9. hdu 1254 推箱子(搜索)

    我写的第一道感觉比较难的搜索 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先要推箱子的话要满足人能够在箱子旁边,而且人的对面也是可通的. ...

  10. 关于JS面向对象中原型和原型链以及他们之间的关系及this的详解

    一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__ ...