问题起因

最近在运营独角数卡(Dujiaoka)站点时,留意到一个细节问题:用户购买自动发货商品并支付成功后,系统发送的通知邮件中(邮件模板标识为 card_send_user_email),“创建时间”这一栏竟然是空的

作为一个强迫症,这种显示缺陷肯定不能忍。

排查心路历程

起初我以为是邮件模板的问题,但我检查了手动发货的商品订单,发现手动发货的邮件中,时间显示是完全正常的。

这就排除了邮件模板本身变量缺失的可能性,问题一定出在数据传递的环节。也就是说,在处理自动发货逻辑时,传给邮件模板的变量里,时间数据没有正确赋值。

顺藤摸瓜,我锁定了核心的订单处理服务文件:dujiaoka/app/Service/OrderProcessService.php

定位 Bug

通过对比源码,我在该文件的第 509行 左右找到了自动发货邮件的数据组装逻辑。

错误代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
// 邮件数据
$mailData = [
'created_at' => $order->create_at, // <--- 问题就出在这里
'product_name' => $order->goods->gd_name,
'webname' => dujiaoka_config_get('text_logo', '独角数卡'),
'weburl' => config('app.url') ?? '[http://dujiaoka.com](http://dujiaoka.com)',
'ord_info' => implode('<br/>', $carmisInfo),
'ord_title' => $order->title,
'order_id' => $order->order_sn,
'buy_amount' => $order->buy_amount,
'ord_price' => $order->actual_price,
];

仔细一看,Laravel 模型中标准的创建时间字段通常是 created_at,而这里写成了 $order->create_at

少了一个字母 d

我又去看了下手动发货或者其他发货逻辑的代码(通常在文件的后半部分),发现它们用的都是正确的 $order->created_at。这显然是开发者手滑写错了字段名,导致取不到值,邮件里自然就显示为空了。

解决方案

修复方法非常简单,只需要把那个缺失的 d 补上即可。

修改后的代码:

1
2
3
4
5
6
7
8
9
10
11
12
// 邮件数据
$mailData = [
'created_at' => $order->created_at, // <--- 修正为 created_at
'product_name' => $order->goods->gd_name,
'webname' => dujiaoka_config_get('text_logo', '独角数卡'),
'weburl' => config('app.url') ?? '[http://dujiaoka.com](http://dujiaoka.com)',
'ord_info' => implode('<br/>', $carmisInfo),
'ord_title' => $order->title,
'order_id' => $order->order_sn,
'buy_amount' => $order->buy_amount,
'ord_price' => $order->actual_price,
];

保存文件后,再次测试购买自动发货商品,邮件中的订单创建时间已经可以正常显示了。

总结

虽然只是一个字母的拼写错误,但在开源项目中通过对比正常逻辑(手动发货)和异常逻辑(自动发货)的代码差异,是快速定位 Bug 的有效手段。

希望这篇记录能帮到同样遇到这个显示问题的站长们,也希望独角数卡可以尽快修复。