情人节那天早上, 突然看到一个论坛开了一个新功能——“我暗恋你”。如果暗恋某人的话,可以对TA点“我暗恋你”,但是此时只有他自己和系统知道,对方以及其他人是不知道的,如果对方也对TA点了“我暗恋你”的话,那么系统自动给两人发消息,然后。。。祝福他们吧。。。
我觉得这个功能不错,就想着能不能在我的微信平台上也弄一个这个功能。
首先,在微信里无法像论坛上能够看到彼此,所以我首先想到的是输入对方的学号,因为这是每个人唯一的标识,如果你暗恋TA的话,我想搞到TA的学号应该不是什么难事。
而对于保密性,我想到的是先输入自己学号,再输入对方学号,然后把两个学号连在一起,然后排序,接着使用一种不可逆加密算法进行加密,然后在数据库中保存这个加密后的密文,除此之后不保存任何信息。如果对方也在微信里说暗恋TA的话,那么就把祝福的消息给两人发过去。
但是又考虑到,用学号的方式可能会造成冒名顶替的情况,即在该输入自己学号的时候输入的是别人的学号。例如,甲暗恋乙,但是乙喜欢甲,这时如果有人冒用乙的名义的话,可能就会造成一些很麻烦的事。。。所以决定使用QQ号,在输入自己QQ号之后,系统自动生成一个验证码,并把验证码发到QQ邮箱,以验证真实身份。同时用QQ也解决了订阅号不支持主动发消息的接口的问题,祝福消息可以通过给双方发送电子邮件的方式送出。
因为数据库里只存储密文,不存储任何信息,所以即使是拥有超级管理员权限的我,也看不到任何隐私,我不会知道谁选了谁,不会知道谁选了多少人。。。即使是他本人,也查不到他都选了谁,除非他再输入一遍(那样祝福邮件就自动发出去了,那跟直接表白有什么区别?),或者他选择取消,然后输入两人QQ。。。
下午回家后,开始查找Java发邮件的方式,然后查找不可逆加密算法的资料,选用了MD5。
情人节当天半夜十点左右开始写,十二点左右写完,然后简单测试了一下。。。发验证邮件速度较慢,导致邮件发完之后已经过了5秒时间限制了,服务超时,自动断开连接。。。不管了,睡觉,第二天起来再说。
第二天,也就是今天,将发邮件的步骤改为调用新线程的方式,这样新线程开启后马上就会执行下面的操作,至于邮件什么时候发出去,看网速了。。。
然后调试其他部分,包括对常见错误进行检查增加程序健壮性。
流程图如下:
这个Session还是用的我之前那篇《微信平台无法使用Session解决方案(Java)》里的。
2015-02-17更新
关于排序:
之前我把两个QQ号放在一起排序时,代码如下:
//“qq”为两人QQ号用“+”号连在一起后
String qq = yourqq + taqq;
SessionList.getData("taqq", openid);
char[] q = qq.toCharArray();
Arrays.sort(q);
qq = String.valueOf(q);
今天突然想起这个地方,很纳闷当时自己怎么就脑抽想了这么个方法,这种排序方式有一定几率“牵错线”,
假设甲(qq为123456)暗恋乙(qq为234567),同时丙(134567)暗恋丁(223456),那么按照这种方法排序后,两组结果都是122334455667,那就乱套了,所以,改为如下代码:
int[] q = { Integer.parseInt(yourqq), Integer.parseInt(taqq) };
Arrays.sort(q);
String qq = "" + q[0] + q[1];
报bug了。。。
把排序那地方再改一下。。。
String q = { yourqq, taqq };
Arrays.sort(q);
String qq = "" + q[0] + q[1];