在ecshop官方模版收,web端的虚拟商品购买后不能像pc端那般直接在付款后出现虚拟商品的卡号,密码,截止日期
一下为让手机购买也可以在付款后自动显示发货并能显示卡号密码截止日期

先找到pc端的flow.php文件中的$_REQUEST['act'] = 'done' 
这里面是用来处理订单的最后一步,(具体怎么知道的可以看url后的参数列表),对应手机端处理订单的的文件为 mobile/order.php
文件,这里同样有一个$_REQUEST['act'] = 'done',对比里面的代码发现order.php相比flow.php
缺少了一段处理虚拟商品的代码找到ecshop官方的flow.php文件中大约1677行有一个注释
/*/* 如果使用库存,且下订单时减库存,则减少库存 */*/下面的if判断语句还是相同
这句话上面还有一段代码(如下),在手机端不存在,具体功能(追到函数里这段是说:设置红包已经使用,和我们现在需求的功能无关)

  1. if ($order['bonus_id'] > 0 && $temp_amout > 0)
  2. {
  3. use_bonus($order['bonus_id'], $new_order_id);
  4. }

下面还有两端代码是手机端没有的

  1. /* 给商家发邮件 ----- 这段或许可以不要,我没有测试 */
  2. /* 增加是否给客服发送邮件选项 */
  3. if ($_CFG['send_service_email'] && $_CFG['service_email'] != '')
  4. {
  5. $tpl = get_mail_template('remind_of_new_order');
  6. $smarty->assign('order', $order);
  7. $smarty->assign('goods_list', $cart_goods);
  8. $smarty->assign('shop_name', $_CFG['shop_name']);
  9. $smarty->assign('send_date', date($_CFG['time_format']));
  10. $content = $smarty->fetch('str:' . $tpl['template_content']);
  11. send_mail($_CFG['shop_name'], $_CFG['service_email'], $tpl['template_subject'], $content, $tpl['is_html']);
  12. }
  13.  
  14. /* 如果需要,发短信 ----- 这段也是没有的,应该也不需要*/
  15. if ($_CFG['sms_order_placed'] == '1' && $_CFG['sms_shop_mobile'] != '')
  16. {
  17. include_once('includes/cls_sms.php');
  18. $sms = new sms();
  19. $msg = $order['pay_status'] == PS_UNPAYED ?
  20. $_LANG['order_placed_sms'] : $_LANG['order_placed_sms'] . '[' . $_LANG['sms_paid'] . ']';
  21. $sms->send($_CFG['sms_shop_mobile'], sprintf($msg, $order['consignee'], $order['tel']),'', 13,1);
  22. }

下面的关键的代码 ----- 是关系到我们现在的功能是不是能用
virtual_goods_ship($virtual_goods,$msg,
$order['order_sn'],
true)这个函数里面会有一个smarty的assign方法就是这里将虚拟商品的卡号密码等信息发送到页面中,并处理发货状态等,有兴趣的童鞋可以进
去看看,

  1. /* 如果订单金额为0 处理虚拟卡 */
  2. if ($order['order_amount'] <= 0)
  3. {
  4. $sql = "SELECT goods_id, goods_name, goods_number AS num FROM ".
  5. $GLOBALS['ecs']->table('cart') .
  6. " WHERE is_real = 0 AND extension_code = 'virtual_card'".
  7. " AND session_id = '".SESS_ID."' AND rec_type = '$flow_type'";
  8.  
  9. $res = $GLOBALS['db']->getAll($sql);
  10.  
  11. $virtual_goods = array();
  12. foreach ($res AS $row)
  13. {
  14. $virtual_goods['virtual_card'][] = array('goods_id' => $row['goods_id'], 'goods_name' => $row['goods_name'], 'num' => $row['num']);
  15. }
  16.  
  17. if ($virtual_goods AND $flow_type != CART_GROUP_BUY_GOODS)
  18. {
  19. /* 虚拟卡发货 */
  20. if (virtual_goods_ship($virtual_goods,$msg, $order['order_sn'], true))
  21. {
  22. /* 如果没有实体商品,修改发货状态,送积分和红包 */
  23. $sql = "SELECT COUNT(*)" .
  24. " FROM " . $ecs->table('order_goods') .
  25. " WHERE order_id = '$order[order_id]' " .
  26. " AND is_real = 1";
  27. if ($db->getOne($sql) <= 0)
  28. {
  29. /* 修改订单状态 */
  30. update_order($order['order_id'], array('shipping_status' => SS_SHIPPED, 'shipping_time' => gmtime()));
  31.  
  32. /* 如果订单用户不为空,计算积分,并发给用户;发红包 */
  33. if ($order['user_id'] > 0)
  34. {
  35. /* 取得用户信息 */
  36. $user = user_info($order['user_id']);
  37.  
  38. /* 计算并发放积分 */
  39. $integral = integral_to_give($order);
  40. log_account_change($order['user_id'], 0, 0, intval($integral['rank_points']), intval($integral['custom_points']), sprintf($_LANG['order_gift_integral'], $order['order_sn']));
  41.  
  42. /* 发放红包 */
  43. send_order_bonus($order['order_id']);
  44. }
  45. }
  46. }
  47. }
  48. }

这里的代码添加上以后变量已经发送到页面中了,在手机模版收是order_done.dwt文件来显示最后一步的,这里和pc端的flow.dwt里全是判断的思路不太一样,找到flow.dwt文件中显示虚拟商品信息的那段代码如下(其实可以自己找找)

  1. <!--{if $virtual_card}-->
  2. <div style="text-align:center;overflow:hidden;border:1px solid #E2C822;background:#FFF9D7;margin:10px;padding:10px 50px 30px;">
  3. <!--{foreach from=$virtual_card item=vgoods}-->
  4. <h3 style="color:#2359B1; font-size:12px;">{$vgoods.goods_name}</h3>
  5. <!--{foreach from=$vgoods.info item=card}-->
  6. <ul style="list-style:none;padding:0;margin:0;clear:both">
  7. <!--{if $card.card_sn}-->
  8. <li style="margin-right:50px;float:left;"> <strong>卡号:</strong><span style="color:red;">{$card.card_sn}</span> </li>
  9. <!--{/if}-->
  10. <!--{if $card.card_password}-->
  11. <li style="margin-right:50px;float:left;"> <strong>密码:</strong><span style="color:red;">{$card.card_password}</span> </li>
  12. <!--{/if}-->
  13. <!--{if $card.end_date}-->
  14. <li style="float:left;"> <strong>截止日期:</strong>{$card.end_date} </li>
  15. <!--{/if}-->
  16. </ul>
  17. <!--{/foreach}-->
  18. <!--{/foreach}-->
  19. </div>
  20. <!--{/if}-->

放到order_done.dwt里一个合适的位置,到此这个功能大概就完成了
但是我目前为止没有的是支付宝付款是不是能自动的返回这些卡号密码,我都是用余额支付的,如有不正确的地方,请不吝指正

ecshop开发日志之手机端虚拟商品自动发货的更多相关文章

  1. ecshop开发日志之虚拟商品发送邮件通知

    购买虚拟商品,系统会在支付后自动发送邮件到用户填写的邮件地址中,追踪过程如下首先在订单列表中可以获得到处理订单的php文件为flow.php,之后在最后一步url地址显示为http://localho ...

  2. ECSHOP农行支付接口开发(含手机端)

    对于ECSHOP来说,支付是以接口的形式存在的.于是: 1:首先添加接口文件 includes\modules\payment下,增加abcbank.php,代码如下: <?php /** * ...

  3. delphi xe5 android 开发数据访问手机端(一)

    上几片文章我们把供手机端调用的web服务完成,接下来实现手机端调用webservices获取数据 1.新建firemonkey mobile application 2.选择blank applica ...

  4. ecshop开发日志之支付插件开发

    ecshop开发一个支付插件的方法(例如要新建一个为paytest-----支付测试)1.languages/zh_cn/payment/目录下新建一个paytest.php文件  内容如下: < ...

  5. XE5 Android 开发数据访问手机端[转]

    把供手机端调用的web服务完成,接下来实现手机端调用webservices获取数据 1.新建firemonkey mobile application 2.选择blank application 3. ...

  6. XE5 Android 开发数据访问手机端 解决乱码的办法

    经过测试,将sqlserver里的字段由varchar 或者char  改为  nvarchar 或者nchar 然后在手机端的clientdataset 增加字段的时候数据类型选择widestrin ...

  7. delphi xe5 android 开发数据访问手机端 解决乱码的办法

    经过测试,将sqlserver里的字段由varchar 或者char  改为  nvarchar 或者nchar 然后在手机端的clientdataset 增加字段的时候数据类型选择widestrin ...

  8. XE5 Android 开发数据访问手机端 解决乱码的办法 [转]

    经过测试,将sqlserver里的字段由varchar 或者char  改为  nvarchar 或者nchar 然后在手机端的clientdataset 增加字段的时候数据类型选择widestrin ...

  9. delphi xe5 android 开发数据访问手机端(二)

    界面就这样吧,继续...,先启动咱们上几片文章建立的手机服务端 导入webservices单元,file->new->other->webservices->选择 wsdlim ...

随机推荐

  1. asp.net页面与页面之间参数传递

    传值asp文件send.aspx 代码如下 复制代码 <form id="form1" runat="server" action="recei ...

  2. class如何命名更规范

    相信写css的人都会遇到下面的问题: 糟糕,怎么命名这个class,好像不太贴切,要是冲突了怎么办,要不要设计成通用一点... 而改别人css代码的时候则会一直有个疑问:这个class到底是只在这个地 ...

  3. hibernate初体验

    简介: Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate可以应用在任何使 ...

  4. HTML4如何让一个DIV居中对齐?float输入日志标题

    float:left,right clear:both 如何让一个DIV居中对齐? 第一步:设置外层的DIV的text-align:center; 第二步:设置里层的DIV的margin:auto 以 ...

  5. 矩阵乘法的MPI并行计算

    1.问题描述 矩阵乘法问题描述如下: 给定矩阵A和B,其中A是m*p大小矩阵,B是p*n大小的矩阵.求C = A*B. 求解这个问题最简单的算法是遍历A的行和B的列,求得C的相应元素,时间复杂度O(m ...

  6. sql中Statement与PreparedStatement的区别

    1.Statement用于执行静态sql语句,在执行时,必须指定一个事先准备好的sql语句,也就是说sql语句是静态的. 2.PrepareStatement是预编译的sql语句对象,sql语句被预编 ...

  7. 一分钟了解PHP

    PHP5编辑 PHP5在长时间的开发及多个预发布版本后,2004年7月13日,PHP5.0发布.该版本以Zend引擎Ⅱ为引擎,并且加入了新功能如PHP Data Objects(PDO).PHP5.0 ...

  8. 安装 Archlinux 小记

    故事的背景 开始的时候装的 win8 + ubuntu 双系统,但是慢慢感觉只要有 windows 存在,在 Linux 上遇到问题了就想逃回去. 在一次 GDG 的演讲中听到的: 趁现在还年轻,还有 ...

  9. Delphi检测网络连接状态

    有时候,我们做一些小软件就需要检测网络连接状态,比如想给你的软件加上类似QQ那样的系统消息,可是像我这样的穷人肯定是买不起服务器了,那我们只好另想办法,可以读取网页然后用浏览器显示,这个时候就需要判断 ...

  10. linux 进程(二) --- 进程的创建及相关api

    一.进程的创建fork()函数  由fork创建的新进程被称为子进程(child process).该函数被调用一次,但返回两次.两次返回的区别是子进程的返回值是0,而父进程的返回值则是 新子进程的进 ...