草庐IT

AI技术实践|用腾讯云慧眼微信浮层H5解决黄牛抢票问题

威武得娘娘 2023-09-20 原文

先问个问题,大家旅游出行都遇到过哪些糟心事?大部人或多或少都有经历忘带身份证、飞机晚点、行李遗失、汽车抛锚、天气突变、乃至突发身体不适等等遭遇;然而,还有更糟糕的是到了目的地发现,遇到了“黄牛票”,一路颠沛流离,让人奔溃。

作为游客与景区之间的灰色地带,早期黄牛往往先在景区屯大量门票,然后再以更高的价格转售给游客。现在大多数景区采取身份证实名购票,在一定程度上缓解了黄牛囤票问题。但是在旅游旺季部分景区往往一票难求,黄牛便对有抢票需求的游客通过提前获取游客身份证号和姓名,采用软件脚本进行抢票,然后索要高昂的手续费。这种乱象一方面导致游客花费远超票价的资金参观景区,给游客造成经济损失;另一方面,软件抢票是否成功是一个概率问题,但是需要游客提前告知黄牛身份证号和姓名,暴露了游客隐私信息,存在较大的安全隐患。站在景区的角度来看,游客花费更多的资金购得票价本不高的门票,长此以往也会影响景区形象,不利于景区长远发展。

关注到这个问题后,在腾讯云官网上发现了“微信浮层H5”这一慧眼人脸核身SaaS产品,通过官网了解到它通过活体检测+身份证三要素(人脸、身份证号、姓名)进行用户身份验证。初步设想这一技术能够解决景区黄牛抢票问题:如果购票时需要进行活体人脸核身,那么黄牛即使拿到身份证号码和姓名,也无法购票成功。

于是我通过一个接入demo体验了它的各项功能,在接入过程中我还发现这一技术实现了一系列的安全性措施保障用户的信息安全,下面说说我的接入过程,可供有这方面需求的参考。

一、接入准备

准备工作包括:开通人脸核身服务、业务申请、了解腾讯云慧眼人脸核身配置、获取账号的云API密钥4个步骤,下面一一详细介绍:

第一步:开通人脸核身服务

我们先进入腾讯云慧眼 人脸核身控制台 ,首次使用人脸核身服务的用户,需要先开通人脸核身服务。直接点击提交申请,按照实际情况填写信息,提交申请。
特别提醒:1. 互联网行业和金融行业必须上传业务相关营业资质。

 

因为腾讯云微信浮层H5服务不仅支持权威库比对,还支持客户自传身份证照片,所以需要的功能组合为:活体人脸核身(完成活体检测后照片与权威库比对)、活体人脸对比(完成活体检测后照片与上传照片比对)和身份信息实名验证(二要素)。

 

第二步:业务申请

成功开通人脸核身服务后,进入自助接入页面。,在这里点击创建业务流程就能够为业务创建一个使用场景。

 

第三步:了解微信浮层H5

微信浮层H5作为腾讯云人脸核身团队“增强版人脸核身”这一产品的接入渠道,能够在官网产品介绍中了解到其特性。值得一一提的是,在这个应用场景中,黄牛就相当于系统的攻击者,腾讯云增强版人脸核身提供的设备安全增强、活体安全增强、智能分级认证增强,能够全面升级核身安全能力,据官网介绍,此产品针对摄像头劫持、恶意注入等攻击方式,拦截准确率可达99.9%。

 

第四步:获取账号的云API密钥

使用时需要个人密钥,用于标识接入者身份。在腾讯云访问管理的API密钥管理页面,可以新建一组自己的密钥。
注意:所申请的API密钥需要妥善保管。

 

二、接入人脸核身

第一步:查看接入文档了解接入流程

首先查看微信浮层H5配置流程。在接入微信浮层H5之前,需要完成:1.注册腾讯云账号并实名认证,2,成功申请腾讯云人脸核身。根据如下的接入时序图,整个接入过程只需要调用两个接口:1. DetectAuth获取核身入口URL(人脸核身前端入口)与认证标识BizToken ,2. GetDetectInfo获取核身结果。

微信浮层H5配置流程中详细说明了创建核身业务流程的步骤。

根据demo需求,我嘴周提交的流程如下图所示,待审核通过后,就能够通过个人账户里认证流程的RuleID使用创建的业务流程了。

审核通过后,能够在业务流程界面获取到RuleID。

 

第二步:接入demo流程

demo流程如下:

1. 给游客发放一个二维码,这个二维码指向接入方调用DetectAuth的接口

2.游客使用微信扫描二维码后跳转到核身Url指定的核身H5页面,进行身份证OCR识别以及人脸识别身份核验 ,核身完成后自动调用RedirectUrl指定的获取核验结果的接入方后端接口

3. 由于腾讯云微信浮层H5后端会自动将BizToken作为参数传入RedirectUrl指定的接口,所以接入方获取结果的接口能够拿到BizToken,调用GetDetectInfo接口,获得核验结果

 

第三步:后台快速接入

基于第二步的分析,我们只需要实现两个接入方后端接口即可完成腾讯云微信浮层H5方式的接入,同时为了实现通过扫描二维码启动身份核验,需要实现一个获取指向getToken接口的二维码的接口。

1. 快速接入方法

在接入过程中,我们可以充分利用官方文档的API接口范例,得到对接口的调用框架代码,只需要在里面完成自己的逻辑就行。首先在微信浮层H5配置流程页面中点击“在线调试”,进入API在线调试界面,填入必要参数,选择对应语言,就能够获取核心接入代码,直接复制到本地,适当加入业务流程代码就能直接使用。

 

2.demo代码

主函数中开放出三个http接口,实现如下:

func main() {
	 http请求路径和接口名
	http.HandleFunc("/gettoken", getBizToken)
	http.HandleFunc("/redirect", getResult)
	http.HandleFunc("/getqrcode", getQRCode)
	 在IP:Port开启服务
	err := http.ListenAndServe("0.0.0.0:8881", nil)
	if err != nil {
		fmt.Println("ListenAndServe Error:", err.Error())
	}
}

三个http接口的实现如下:

getToken接口: 由游客扫码触发,调用微信浮层H5后端接口DetectAuth,获取到核身Url,供游客进行刷脸认证。传入参数包括用于指定核身流程的RuleID,以及核身结束后跳转到的购票平台前端界面的RedirectUrl(demo中为另一个获取核验结果的接口,输出游客名与核验是否成功),基于Go的实现如下:

func getBizToken(w http.ResponseWriter, req *http.Request) {
	cpf.HttpProfile.Endpoint = "faceid.tencentcloudapi.com"
	client, _ := faceid.NewClient(credential, "", cpf)
	//实例化一个请求对象,每个接口都会对应一个request对象
	request := faceid.NewDetectAuthRequest()

	request.RuleId = common.StringPtr("16")
	request.RedirectUrl = common.StringPtr("http://192.168.43.82:8881/redirect")

	// 返回的resp是一个DetectAuthResponse的实例,与请求对象对应
	response, err := client.DetectAuth(request)
	if _, ok := err.(*errors.TencentCloudSDKError); ok {
		fmt.Printf("An API error has returned: %s", err)
		return
	}
	if err != nil {
		panic(err)
	}
	// 输出json格式的字符串回包
	fmt.Printf("%s", response.ToJsonString())

	token := *response.Response.BizToken
	url := *response.Response.Url
	url = url + "&token=" + token
    // 直接跳转到微信浮层h5前端进行身份认证
	http.Redirect(w, req, url, 302)
}

getResult接口: RedirectUrl指定,游客在H5页面完成核身后自动跳转,传入本次核验的token和RuleID,获取核验结果。给予Go的实现如下:

func getResult(w http.ResponseWriter, req *http.Request) {
	fmt.Println(req)
	cpf.HttpProfile.Endpoint = "faceid.tencentcloudapi.com"
	client, _ := faceid.NewClient(credential, "", cpf)
	// 实例化一个请求对象,每个接口都会对应一个request对象
	request := faceid.NewGetDetectInfoEnhancedRequest()

	err := req.ParseForm()
	if err != nil {
		fmt.Println(err.Error())
	}

	token, found := req.Form["BizToken"]
	if !found {
		fmt.Println("参数解析出错")
	}

	request.BizToken = &token[0]
	request.RuleId = common.StringPtr("16")

	// 返回的resp是一个GetDetectInfoEnhancedResponse的实例,与请求对象对应
	response, err1 := client.GetDetectInfoEnhanced(request)
	if _, ok := err1.(*errors.TencentCloudSDKError); ok {
		fmt.Printf("An API error has returned: %s", err1)
		return
	}
	if err1 != nil {
		panic(err1)
	}
	// 输出json格式的字符串回包
	fmt.Printf("%s", *response.Response.Text)
}

getQRCode接口:获取二维码的接口实现代码如下:

func getQRCode(w http.ResponseWriter, req *http.Request) {
	err1 := req.ParseForm()
	if err1 != nil {
		fmt.Println(err1.Error())
	}
	getTokenUrl, found1 := req.Form["token_url"]
	if !found1 {
		fmt.Println("token_url参数解析错误")
	}
	url := getTokenUrl[0]

	w.Header().Set("content-type", "image/png")
	w.Write(stringToQR(url))
	// 二维码内容示例:http://192.168.43.82:8881/gettoken
}

// 字符串转二维码
func stringToQR(url string) []byte {
	res, err := qrcode.Encode(url, qrcode.Medium, 256)
	if err != nil {
		fmt.Println(err.Error())
	}
	return res
}

三、效果展示

最后在同一网段搭建测试环境,使得手机能够访问pc提供的服务(实际场景中将服务部署在公网即可),最后得到完整测试结果如下视频所示。

前往知乎浏览效果视频:zhuanlan.zhihu.com/p/587932111

四、接入体验

在仔细阅读官网文档后,借助在线API调试工具,可以直接复制核心调用逻辑,相当顺畅地接入到逻辑代码中,整个demo实现下来,体验很好。同时,经过多次测试,都能够准确无误识别,准确率很高,再加上官网文档中所提到的一系列安全方案,可以说腾讯云微信浮层H5人脸核身能够达到景区门票购票时人脸核身的要求。

有关AI技术实践|用腾讯云慧眼微信浮层H5解决黄牛抢票问题的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  4. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  5. 微信小程序通过字典表匹配对应数据 - 2

    前言一般来说,前端根据后台返回code码展示对应内容只需要在前台判断code值展示对应的内容即可,但要是匹配的code码比较多或者多个页面用到时,为了便于后期维护,后台就会使用字典表让前端匹配,下面我将在微信小程序中通过wxs的方法实现这个操作。为什么要使用wxs?{{method(a,b)}}可以看到,上述代码是一个调用方法传值的操作,在vue中很常见,多用于数据之间的转换,但由于微信小程序诸多限制的原因,你并不能优雅的这样操作,可能有人会说,为什么不用if判断实现呢?但是if判断的局限性在于如果存在数据量过大时,大量重复性操作和if判断会让你的代码显得异常冗余。wxswxs相当于是一个独立

  6. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  7. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  8. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  9. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  10. Ruby 最佳实践 : working with classes - 2

    参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin

随机推荐