通过微信小程序来实现 “钉钉打卡”

6,519 阅读3分钟

历史总结

需求背景

产品希望统计我们公司线下人员的考勤情况,钉钉的功能目前不能满足一天多次外勤打卡的需求,于是我们打算自己开发一套打卡系统。我们的线下工作人员日常使用的是我们内部的一个微信小程序,产品希望将外勤打卡的功能在小程序上实现。方便线下人员在同一个平台上操作。

微信小程序外勤打卡

我们线下工作人员遍布全国各地,每个人的工作地点可能各不一样,怎样让线下工作人员在指定的地方打卡呢?

1.如何确定打卡的对象和范围

为了方便统一打卡管理,添加一个模块给志愿者管理人员,由管理者添加外勤对象,线下工作者根据当前的定位,选择匹配到方圆1公里的外勤对象,选择对应要打卡的对象进行打卡。

外勤对象: 线下工作者打卡的目标地

2.如何保证一天多次打卡

外勤打卡呢,一个线下工作一天要跑多个工作地点,每个地点都要进行打卡,如何保证一天多次打卡呢?产品希望他们每次出勤都有对应的签到和签退,没完成签退,不可以新建一次外勤,每次签到成功就创建了一次外勤,签退不限制地点,可以进行随时签退,这样就保证了每次出勤都是成对的。

一次外勤:一对签到和签退,要先完成签退,才能到下个地点进行签退。

3.打卡定位

针对打卡功能,我们选用微信小程序开发里面的位置api:定位、和选点定位。

位置所有api

位置api调用前需要 先 用户授权 scope.userLocation。

这次主要使用的两个位置api:

  • wx.chooseLocation 打开地图选择位置;
  • wx.getLocation 获取当前的地理位置。

对经纬度进行逆解析需要申请腾讯地图的 key申请开发者密钥(Key)

来来来,签到了:

外勤签到

4.如何防止通过刷接口打卡?

  • MD5加密

考虑到有可能通过抓包提交经纬度来进行打卡,我们前后端统一指定了一套打卡加密机制。我们采用的 MD5加密,对经纬度、时间戳、小程序密钥等组合加密,前端每次打卡,都要加密后32密钥传给后端,后端校验通过后,才可以打卡。这样就可以阻止部分通过接口打卡的骚操作了。

  • 打卡自拍

我们要求每次签到签退都要进行自拍,虽然不能完全杜绝刷打卡,但却可以 避免一部分作弊。

最终我们的打卡:

打卡啦

小结

最后对于开发团队的总结, 前端主动驱动,需求评估后,提前想好解决方案,尽量减少非预知问题,需求评估后可以提前做个demo,对技术选型、功能的实现程度,以及需求的开发周期的有个大致预期。

参考