0

我使用加密电子邮件通过邮件向用户发送邀请,以了解哪个用户响应了邀请。就像是:

Hello, click on this link to start learning: https://example.org/start-learning?e=fwTreaN0WybffXdDfZZUNYB3FTFfZObCb7QFF5C4AFJvTjXabIPtRfcoXLkFYMUvD4FIZsmrDdEFN2OPKcTrAOSQLZfuKdfwcic1WtBxWSXWR1GEJD6we213A3BEPBpca0BxaaQ4GGMPFeRyXp6fPrG9WnTgWogwXUcnVtdwSEEdNHGuZsClTxR2AtD2JZN8VAEsRQKpFFShEDR2SET4KxGhLGM3M0FdDelrJtO8KXS2YRaddH==

加密的电子邮件是上面的长字符串。我在Mailable课堂上像这样对邮件进行编码:

$url = 'https://example.org/start-learning?e=' . encrypt($this->to[0]['address']);

然后将$url其添加到这样的邮件模板中:

<a href="{{$url}}>click me<a>

然后,当用户单击链接时,它会路由到控制器,控制器会解密有效负载:

decrypt($request->input('e'));

然后,它适用于大约 99% 的点击链接的人。但是对于大约百分之一,它不起作用,我在解密时出错。我不知道为什么。这是加密和解密的同一个 Laravel 应用程序。这种奇怪的行为有原因吗?

旁注:我知道解密总是有效并且没有随机行为(顺便说一句,我在 10000 个条目上对其进行了测试,没关系)。我不明白的邮件过程肯定有其他问题。

4

1 回答 1

1

我认为您应该urlencode()在创建链接时使用,而不是:

$url = 'https://example.org/start-learning?e=' . encrypt($this->to[0]['address']);

你应该使用:

$url = 'https://example.org/start-learning?e=' . urlencode(encrypt($this->to[0]['address']));

以确保它是有效的。

于 2017-03-29T18:57:45.180 回答