1. CRMEB送礼收礼模块核心设计解析
在电商系统中,送礼功能一直是个高频需求场景。CRMEB标准版通过独立的送礼收礼模块,实现了"先支付后填写地址"的创新流程设计。这套方案的核心价值在于解决了传统送礼场景中的三个痛点:
- 隐私保护:送礼方无需提前获取收礼人地址信息,避免社交尴尬
- 灵活性:收礼人可自主决定收货时间和地址,特别适合异地送礼
- 成本可控:通过礼品附加费机制,商家可灵活覆盖包装和物流成本
从技术架构看,该模块主要包含三个关键子系统:
- 送礼订单处理系统(特殊订单标记+支付流程)
- 礼物卡生成系统(海报/链接的动态生成)
- 收礼订单转换系统(虚拟订单转实体订单)
提示:礼品附加费建议设置为商品价格的5-15%,需综合考虑包装成本和物流成本。例如单价100元的商品,附加费设为10元较为合理。
2. 送礼功能全流程开发详解
2.1 商品层配置实现
在CRMEB后台的商品编辑界面,营销设置区域新增了送礼功能开关。技术实现上,这需要在product表添加is_gift字段(tinyint类型),并在商品SKU表中添加gift_fee字段(decimal类型)。
关键SQL示例:
ALTER TABLE `crmeb_product` ADD `is_gift` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '是否开启送礼'; ALTER TABLE `crmeb_product_attr_value` ADD `gift_fee` DECIMAL(10,2) NOT NULL DEFAULT '0.00' COMMENT '礼品附加费';前端配置界面需注意:
- 开启送礼功能时强制校验商品库存状态
- 礼品附加费输入框需有最小值校验(≥0)
- 建议添加"推荐附加费"计算器,自动建议合理费用
2.2 送礼订单创建流程
当用户选择"送礼物"时,系统会创建特殊状态的订单:
- 订单类型标记为
gift_order(普通订单为normal_order) - 收货地址字段留空
- 自动免除运费(
shipping_fee=0) - 将礼品附加费计入订单总额
核心代码逻辑(PHP示例):
// 创建送礼订单 public function createGiftOrder($uid, $productInfo) { $order = [ 'order_type' => 'gift_order', 'gift_fee' => $productInfo['gift_fee'], 'total_amount' => $productInfo['price'] + $productInfo['gift_fee'], 'shipping_fee' => 0, 'address_id' => 0 // 无收货地址 ]; // ...其他订单字段 return Db::name('order')->insertGetId($order); }3. 礼物卡生成与分享技术方案
3.1 动态礼物卡生成
支付成功后,系统需要生成可分享的礼物卡。CRMEB提供了两种形式:
- 海报图片:使用GD库或Imagick动态生成
- H5页面链接:带加密参数的专属URL
海报生成的关键参数包括:
- 商品主图(缩放至500×500px)
- 祝福语文本框(用户自定义内容)
- 二维码(包含领取链接)
- 品牌LOGO(从系统配置读取)
建议使用缓存机制避免重复生成:
$cacheKey = 'gift_card_'.md5($orderId); if(!$card = Cache::get($cacheKey)){ $card = $this->generateGiftCard($orderId); Cache::set($cacheKey, $card, 86400); }3.2 分享链路安全设计
礼物卡链接需要包含以下加密参数:
- order_id(订单ID)
- gift_token(HMAC-SHA256加密字符串)
- expire_time(有效期,默认7天)
验证逻辑示例:
public function verifyGiftLink($orderId, $token) { $secretKey = config('gift.secret_key'); $expectToken = hash_hmac('sha256', $orderId, $secretKey); return hash_equals($expectToken, $token); }重要:务必使用时间戳校验链接有效期,防止过期链接被恶意利用
4. 收礼流程开发与订单转换
4.1 收礼地址填写设计
当收礼人访问礼物链接时,系统需要:
- 验证链接有效性(token+有效期)
- 展示商品信息和祝福语
- 提供地址表单(仅需收货人、电话、详细地址)
前端需特别注意:
- 实现地址自动补全(对接地图API)
- 手机号格式实时校验
- 提交按钮防重复点击
4.2 虚拟订单转换实现
收礼人提交地址后,系统需要将送礼订单转换为普通订单:
- 更新订单类型为
normal_order - 填充收货地址信息
- 触发发货流程(可对接物流接口)
- 发送订单状态通知
关键数据库操作:
UPDATE crmeb_order SET order_type = 'normal_order', address_id = [新地址ID], shipping_status = 1 WHERE order_id = [订单ID] AND order_type = 'gift_order';5. 消息通知系统设计
5.1 关键节点通知
整个流程涉及多个消息触发点:
- 送礼成功通知(给送礼人)
- 礼物送达通知(给收礼人)
- 地址填写提醒(3天内未填写时触发)
- 订单发货通知
建议采用事件驱动架构:
// 事件定义 Event::listen('gift.order.paid', function($orderId){ // 1. 记录消息到数据库 // 2. 推送微信模板消息 // 3. 可选短信通知 });5.2 模板消息配置
微信模板消息示例配置:
{ "template_id": "TM12345", "data": { "first": { "value": "您收到一份礼物!", "color": "#173177" }, "keyword1": { "value": "{{product_name}}", "color": "#173177" }, "remark": { "value": "点击填写收货地址", "color": "#FF0000" } } }6. 异常处理与常见问题
6.1 典型问题排查
礼物卡无法生成
- 检查GD库/Imagick扩展
- 验证图片存储目录权限(755)
- 查看字体文件路径是否正确
订单状态转换失败
- 检查order_type字段是否被误修改
- 验证事务处理是否完整
- 查看数据库触发器是否冲突
消息通知未送达
- 检查微信模板消息配额
- 验证用户是否订阅服务通知
- 查看短信接口返回状态
6.2 性能优化建议
- 礼物卡图片采用CDN缓存
- 订单查询添加
order_type索引 - 高频访问接口添加Redis缓存
- 消息队列处理异步任务
索引优化示例:
ALTER TABLE `crmeb_order` ADD INDEX `idx_order_type` (`order_type`), ADD INDEX `idx_gift_status` (`is_gift`,`gift_status`);7. 扩展功能开发思路
7.1 礼物祝福语模板
可增加预设祝福语选项:
- 生日祝福
- 节日问候
- 商务赠礼
- 自定义输入
数据库设计建议:
CREATE TABLE `gift_greetings` ( `id` int(11) NOT NULL AUTO_INCREMENT, `title` varchar(50) NOT NULL COMMENT '模板标题', `content` text NOT NULL COMMENT '模板内容', `scene` varchar(20) NOT NULL COMMENT '使用场景', `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;7.2 礼物包装选项
扩展商品表结构:
ALTER TABLE `crmeb_product` ADD `gift_wrap_options` TEXT NULL COMMENT '包装选项JSON配置'; -- 示例数据 { "wrap_style": [ {"id":1,"name":"经典红盒","fee":5.00}, {"id":2,"name":"丝带礼盒","fee":8.00} ] }在CRMEB标准版基础上开发送礼功能时,我建议采用分阶段实施方案:先确保核心流程跑通,再逐步添加祝福语、包装等增值功能。对于高并发场景,要特别注意礼物卡生成环节的性能优化,必要时可以引入队列处理机制。