小程序下发二维码,然后扫码验证入场券功能,怎么设计是安全的?

小程序下发二维码,然后扫码验证入场券功能,怎么设计是安全的? 有什么好的思路吗?

Page({
  data: {
    ticketValid: false, // 用于表示入场券是否有效
    ticketInfo: null,   // 用于存储入场券的信息
  },

  // 扫码函数
  scanTicket: function() {
    wx.scanCode({
      onlyFromCamera: true, // 只允许从相机扫码,不允许从相册选取
      success: (res) => {
        if (res.scanType === 'qrCode') { // 确保扫描的是二维码
          const ticketData = res.result; // 获取扫码结果,通常是二维码中的数据
          this.verifyTicket(ticketData);
        } else {
          wx.showToast({
            title: '请扫描正确的二维码',
            icon: 'none'
          });
        }
      },
      fail: (err) => {
        console.error('扫码失败:', err);
      }
    });
  },

  // 验证入场券
  verifyTicket: function(ticketData) {
    // 这里应该调用后端API来验证ticketData
    wx.request({
      url: '/api/verify-ticket',
      method: 'POST',
      data: {
        ticketData: ticketData
      },
      success: (res) => {
        if (res.statusCode === 200 && res.data.success) {
          this.setData({
            ticketValid: true,
            ticketInfo: res.data.ticketInfo
          });
          wx.showToast({
            title: '入场券有效',
            icon: 'success'
          });
        } else {
          this.setData({
            ticketValid: false,
            ticketInfo: null
          });
          wx.showToast({
            title: '入场券无效',
            icon: 'none'
          });
        }
      },
      fail: (err) => {
        console.error('验证入场券失败:', err);
      }
    });
  }
});
阅读 1k
3 个回答

1、支持扫二维码核销。二维码可以动态生成,并且60秒的有效期,过期后老二维码失效。
2、固定的券码核销(通常由纯数字或者数字+字母),券码一直是固定的,需要妥善保管。
查验都是通过后端接口去校验,保证安全。

使用非对称加密实现数字签名:

  • 生成一对密钥,包括一个私钥和一个公钥,私钥用于签名,公钥用于验证签名
  • 对原始二维码内容(随机数字 + 时间戳 + 手机 + 票据编号 + 其他)进行哈希运算,生成固定长度的消息摘要
  • 使用私钥对消息摘要进行加密,生成数字签名
  • 随机数字 + 时间戳 + 手机 + 票据编号 + 其他 和签名放在二维码中
  • 验票的时候使用公钥对签名进行解密,然后与接收到的二维码内容的消息摘要进行比较,如果匹配,则说明签名有效,数据未被篡改

其中时间戳等信息可以有效防止二维码被重复使用,和微信支付的签名方式相似

新手上路,请多包涵

场景不是特别明确,但是从代码里面理解到 是需要 用户 主扫(用户调起摄像头) 小程序给个一个“入场券”验证功能的“二维码”;
这个流程就很奇怪,扫了 之后 用户进入到一个什么样的界面? 怎么调取入场券?

正确的流程 建议 应该 大概 是这样会更合理一点:
1.小程序给有资质的用户下发 入场券 ,以二维码的显示方式;
2.现场有个扫码盒 或 枪 ;
3.用户调出二维码 被扫 ;
4.这个时候才有“防伪”(安全机制存在的必要性)验证的存在意义;

防伪验证 用这个id 找后端要状态(不要前端处理就行了) 是否用过 是否有效(时间、次数等) ,只要数据库没被拉过,一般都不会有什么问题;
如果有多个通道,稍微注意处理一下并发就行,最简单粗暴的就是 加锁了(当然锁也有缺点,那是另外个话题)

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏