原文转载自「刘悦的技术博客」https://v3u.cn/a_id_184

目前国内身份认证体系做的比较不错的大抵就是支付宝和微信两家了,支付宝的身份验证基于支付宝app的实人认证能力,采用多因子认证技术快速得出认证结果,对于多因子认证技术不太了解的朋友可移步:别让你的服务器(vps)沦为肉鸡(ssh暴力破解),密钥验证、双向因子登录值得拥有进行了解。其作用主要是为了解决线上实人开户、账号实名认证、账号实人登录等场景中个人身份的识别问题,比如你某一天突然心血来潮想当一把韭菜炒炒股,又不想去人多眼杂的营业厅,所以利用app远程开户,开户的过程中,你怎么证明“你是你本人”的问题。

首先,老规矩,做一下前置任务,注册蚂蚁金服开放平台:https://open.alipay.com/

随后创建应用

这里我们创建一个网页应用。

之后就是为应用设置秘钥,点开秘钥管理页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynjndxvT-1609936795248)(https://v3u.cn/v3u/Public/js/editor/attached/20210106190152_42102.png)]

对于没接触过秘钥的朋友,可以参考这篇文章:在Mac系统下生成新版支付宝(2019年4月)支付接口私钥和公钥

将生成好的应用公钥配置到页面上,同时将应用私钥和支付宝公钥分别复制一份,过一会儿会用到。

最后,别忘了记录一下应用的appid,以及确保您的应用已经开通了支付宝身份认证接口:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bbwe0XbM-1609936795251)(https://v3u.cn/v3u/Public/js/editor/attached/20210106190135_95734.png)]

OK,万事俱备只欠代码,下面我们利用支付宝官方的sdk完成刷脸认证。

首先安装对应的库:

  1. pip3 install alipay-sdk-python==3.3.398

一般情况下,我们使用bug相对少的最新版。

支付宝身份认证的流程大体分为三步:身份认证初始化服务(alipay.user.certify.open.initialize)->身份认证开始认证(alipay.user.certify.open.certify)->身份认证记录查询(alipay.user.certify.open.query)

我们首先来开发身份认证初始化服务,参考官方文档:https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.initialize

通过传入订单号、认证人名字、身份证(或者港澳台证件)等参数,接口会返回一个唯一认证号:certify_id,后续通过certify_id就可以进行实体认证或者实体查询,编写test_alipay.py:

  1. import json
  2. from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
  3. from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
  4. from alipay.aop.api.request.AlipayUserCertifyOpenInitializeRequest import AlipayUserCertifyOpenInitializeRequest, AlipayUserCertifyOpenInitializeModel
  5. from alipay.aop.api.request.AlipayUserCertifyOpenCertifyRequest import AlipayUserCertifyOpenCertifyRequest
  6. from alipay.aop.api.request.AlipayUserCertifyOpenQueryRequest import AlipayUserCertifyOpenQueryRequest
  7. from alipay.aop.api.response.AlipayUserCertifyOpenCertifyResponse import AlipayUserCertifyOpenCertifyResponse
  8. import random
  9. import string
  10. import ssl
  11. ssl._create_default_https_context = ssl._create_unverified_context
  12. from MyQR import myqr
  13. ali_public_key = '''
  14. -----BEGIN PUBLIC KEY-----
  15. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuv2nESi3dAvGdHcxNs1TjIMxbJt4IrhBjMZcIrBALGGHxuQVCPZjci4lcGt+oBmWGAlt3F
  16. 这里是支付宝公钥
  17. -----END PUBLIC KEY-----
  18. '''
  19. app_private_key = '''
  20. -----BEGIN RSA PRIVATE KEY-----
  21. MIIEogIBAAKCAQEAnpWCj6SVbWuuldIGns4K1PB+Ir17v6BNXRvyYY3jxu2ky这里是应用私钥
  22. -----END RSA PRIVATE KEY-----
  23. '''
  24. config = AlipayClientConfig()
  25. config.app_id = '应用id'
  26. config.app_private_key = app_private_key
  27. config.alipay_public_key = ali_public_key

将应用id、支付宝公钥以及应用私钥配置好,这里注意秘钥最好加上开始与结束符。随后编写初始化逻辑:

  1. #  身份初始化
  2. def ali_init():
  3. client = DefaultAlipayClient(config)
  4. request = AlipayUserCertifyOpenInitializeRequest()
  5. request.biz_content = {
  6. 'outer_order_no': ''.join(random.sample(string.ascii_letters, 32)),
  7. 'biz_code': 'FACE_ALIPAY_SDK',
  8. 'identity_param': {
  9. "identity_type": "CERT_INFO",
  10. "cert_type": "IDENTITY_CARD",
  11. "cert_name": "姓名",
  12. "cert_no": "身份证号"
  13. },
  14. 'merchant_config': {
  15. "return_url": "https://ali.v3u.cn"
  16. },
  17. }
  18. #print(request.get_params())
  19. response = client.execute(request)
  20. #print(response)
  21. # 获取参数
  22. certify_id = json.loads(response).get('certify_id')
  23. print(certify_id)

这里订单号不能重复,所以使用随机模块进行生成,访问AlipayUserCertifyOpenInitializeRequest接口,测试一下:

  1. liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
  2. ff8182725aae897e262fa6d0fe24692c

可以看到接口返回了一个32位的certify_id。此时,我们可以进行第二步:身份认证开始认证(alipay.user.certify.open.certify),官方文档:https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.certify

  1. # 开始身份认证
  2. def auth_start(client, certify_id):
  3. #client = DefaultAlipayClient(config)
  4. request = AlipayUserCertifyOpenCertifyRequest()
  5. request.biz_content = {'certify_id': str(certify_id)}
  6. print(certify_id)
  7. #print(request.get_params())
  8. response = client.page_execute(request, http_method="GET")
  9. print(response)
  10. myqr.run(words=response)

将刚刚返回的certify_id作为参数请求AlipayUserCertifyOpenCertifyRequest接口,注意采用get方式,该接口会返回一个支付宝的链接,测试一下:

  1. def ali_init():
  2. client = DefaultAlipayClient(config)
  3. request = AlipayUserCertifyOpenInitializeRequest()
  4. request.biz_content = {
  5. 'outer_order_no': ''.join(random.sample(string.ascii_letters, 32)),
  6. 'biz_code': 'FACE_ALIPAY_SDK',
  7. 'identity_param': {
  8. "identity_type": "CERT_INFO",
  9. "cert_type": "IDENTITY_CARD",
  10. "cert_name": "收委",
  11. "cert_no": "260104197909275964"
  12. },
  13. 'merchant_config': {
  14. "return_url": "https://lingxi.zfmix.com/user/user_authentication/"
  15. },
  16. }
  17. #print(request.get_params())
  18. response = client.execute(request)
  19. #print(response)
  20. # 获取参数
  21. certify_id = json.loads(response).get('certify_id')
  22. print(certify_id)
  23. auth_start(client, certify_id)

返回值:

  1. liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
  2. 65bf2091bc757d1e7b7dff7f3af619f6
  3. 65bf2091bc757d1e7b7dff7f3af619f6
  4. https://openapi.alipay.com/gateway.do?timestamp=2021-01-06+20%3A09%3A21&app_id=2021002119690109&method=alipay.user.certify.open.certify&charset=utf-8&format=json&version=1.0&sign_type=RSA2&sign=HYK0RJjbLLFqBplL2av9sqkgykfKV1xUKgw0Fo0oRWXoC9H%2BjTDZZJElmXVi2jbfBzikac%2B5iqETK0i%2Bz9MpBfJUC8eoCjbRyUUNTrxX7003toEKz8utabOALSlwQcutFSbVbTthB5GXzpSzHZChkiZwQVUVCw3oHholUw7%2B2RnLRno%2BmwRyi6mJ2296wQvqE962LpGKV%2FxNF5O6UaKFEyoKceOztxI%2FnXIfcRfH6mgrUTP7NhLSpLvBdIbgcuCNARmS04ZN6BL7UwjkvNglNRgAydhypJqJqv0sBXRJQ8hDfIsLV3jACpgyarJ4tQeEJP4CfTobFhA2nLsYnnEbbw%3D%3D&biz_content=%7B%22certify_id%22%3A%2265bf2091bc757d1e7b7dff7f3af619f6%22%7D
  5. line 16: mode: byte
  6. liuyue:mydjango liuyue$

这个链接只要使用支付宝app进行访问,就可以跳转到刷脸认证页面,但是如果让普通用户粘贴链接到支付宝太过于繁琐,所以我们利用myqr模块将该链接制作成二维码,用户只需要用支付宝app对二维码进行扫描即可:

  1. pip3 install myqr

认证接口:

  1. response = client.page_execute(request, http_method="GET")
  2. print(response)
  3. myqr.run(words=response)

随后项目内会生成一个qrcode.png

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GmMFsjBe-1609936795253)(https://v3u.cn/v3u/Public/js/editor/attached/20210106200148_67633.png)]

打开支付宝app,对其进行扫码操作:

最后,在身份认证完成后,调用身份认证记录查询(alipay.user.certify.open.query)查询认证状态和相关数据。官方文档:https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.query

  1. # 查询接口
  2. def auth_check(client, certify_id):
  3. print(certify_id)
  4. request = AlipayUserCertifyOpenQueryRequest()
  5. request.biz_content = {'certify_id': str(certify_id)}
  6. response = client.execute(request)
  7. print(response)

同样传入certify_id,接口为AlipayUserCertifyOpenQueryRequest,测试一下:

  1. liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
  2. f35030276a08b27cdc67c26a18f57650
  3. f35030276a08b27cdc67c26a18f57650
  4. {"code":"10000","msg":"Success","material_info":"{}","passed":"F"}

如果已经认证成功会返回T,反之则是F。

需要注意的是,在没有刷脸情况下的certify_id 有效期是23个小时,认证成功后,调用查询接口certify_id是3个月的有效期。

结语:总体而言,坑不是很多,主要锻炼的是大家阅读文档的能力,或者说的更准确一点:通过阅读理解将文档转化为代码的能力,有意思的一点是,如果大家通读了支付宝的文档,会发现如果身份认证成功,是不可以取消的,也就是身份认证不可逆,也就是说,支付宝如果想利用你的信息干点什么的话,你没有任何反抗的能力,所以说到底,这是一个用户隐私使用权的问题,大多数情况下,国人愿意容忍国家获取或者使用自己的隐私,是因为他们觉得自己仍有监督与干预政府机构的能力或者渠道,无论是以间接还是比较激进的方式。而人们不愿意像支付宝这种商业寡头获取并运用自己的隐私,也正是因为人们知道自己在面对此类商业机构对自己隐私的利用或者滥用时,自己只能干瞪眼,搏手无策。

原文转载自「刘悦的技术博客」 https://v3u.cn/a_id_184

别无分号只此一家,Python3接入支付宝身份认证接口( alipay.user.certify)体系(2021年最新攻略)的更多相关文章

  1. Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...

  2. H5网站接入支付宝的支付接口

    写本文章的目的是为了记录工作中遇到的问题,方便以后遇到可以迅速解决问题 H5手机网站接入支付宝的支付接口,推荐使用支付宝提供的SDK来快速开发 我使用的是SDK开发 引用命名空间 using Aop. ...

  3. 基础平台为第三方应用接入提供oauth2认证接口

    oauth2开放认证协议原理及案例分析 http://blog.csdn.net/volcan1987/article/details/7287605 谈谈基于OAuth 2.0的第三方认证 [上篇] ...

  4. cocos2dx工程中接入支付宝sdk

    1. 首先去支付宝官网下载开发者文档 2. 然后按着开发者文档将支付宝的sdk导入到你的工程中,并关联到工程中,步骤入下图: (1)将从支付宝官方网站获得的支付宝的sdk的jar包拷贝到工程中的lib ...

  5. 【PHP后台】接入支付宝

     我使用PHP主要是为客户端做后台使用,并不会做前端网页.   这两天因为公司项目需要,必须接入支付功能,而支付宝当然首当其冲,考虑迭代版本的需要,首先接入支付宝功能,其他的支付功能以后迭代版本的时候 ...

  6. Android 接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  7. Android接入支付宝支付实现

    接上篇android接入微信支付文章,这篇我们带你来接入支付宝支付服务 简介 首先要说明的是个人感觉接入支付宝比微信简单多了,很轻松的,所以同学们不要紧张~ 当然还是老规矩啦,上来肯定的贴上官网地址, ...

  8. 微信小程序—支付宝身份验证(支付宝小程序)

    查看应用:https://open.alipay.com/platform/keyManage.htm  这里找到您调用接口的应用 支付宝身份验证快速接入:https://docs.open.alip ...

  9. 接入支付宝出现交易订单处理失败,请稍后再试(ALI64)的错误【转】

    接入第三方平台的时候,有时虽然按照文档来做,但是总是还会有各种各样的问题. 上次在接入支付宝的时候就碰到了交易订单处理失败,请稍后再试(ALI64)这样的错误,后来经过排查和总结,一般来讲这种问题都是 ...

随机推荐

  1. ThreadLocal夺命11连问

    前言 前一段时间,有同事使用ThreadLocal踩坑了,正好引起了我的兴趣. 所以近期,我抽空把ThreadLocal的源码再研究了一下,越看越有意思,发现里面的东西还真不少. 我把精华浓缩了一下, ...

  2. Ajax前后端交互——后端接收前端页面变量

    核心代码: app.py from flask import Flask, render_template, request, jsonify app = Flask(__name__) @app.r ...

  3. ABP框架之——数据访问基础架构

    大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享阅读心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. 几乎所有的业务应用程序都要适用一种数据库基础架构,用来实现数据访问逻辑,以便从数 ...

  4. 第06组 Beta冲刺 (3/5)

    目录 1.1 基本情况 1.2 冲刺概况汇报 1.郝雷明 2. 方梓涵 3.曾丽莉 4.杜筱 5. 董翔云 6.黄少丹 7.鲍凌函 8.詹鑫冰 9.曹兰英 10.吴沅静 1.3 冲刺成果展示 1.1 ...

  5. PostgreSQL 的窗口函数 OVER, WINDOW, PARTITION BY, RANGE

    最近在数据处理中用到了窗函数, 把使用方法记录一下, 暂时只有分组排序和滑动时间窗口的例子, 以后再逐步添加 场景 在SQL查询时, 会遇到有两类需要分组统计的场景, 在之前的SQL语法中是不方便实现 ...

  6. application.properties文件中暗藏玄机

    上次分享了如何一步一步搭建一个springboot的项目,详细参见<5分钟快速搭建一个springboot的项目>,最终的结果是在"8080"端口搭建起了服务,并成功访 ...

  7. 博弈论(nim游戏,SG函数)

    说到自己,就是个笑话.思考问题从不清晰,sg函数的问题证明方法就在眼前可却要弃掉.不过自己理解的也并不透彻,做题也不太行.耳边时不时会想起alf的:"行不行!" 基本的小概念 这里 ...

  8. Go微服务框架go-kratos实战01:quickstart 快速开始

    先来感受下用 kratos 快速创建项目 一.环境准备 1.1 安装依赖软件 protoc protoc-gen-go 建议开启 GO111MODULE 1.2 安装 kratos cli go in ...

  9. python实现对简单的运算型验证码的识别【不使用OpenCV】

    最近在写我们学校的教务系统的手机版,在前端用户执行绑定操作后,服务器将执行登录,但在登录过程中,教务系统中有个运算型的验证码,大致是这个样子的: 下面我们开始实现这个验证码的识别. 1.图片读取 从网 ...

  10. LVGL库入门教程03-布局方式

    LVGL布局方式 LVGL的布局 上一节介绍了如何在 LVGL 中创建控件.如果在创建控件时不给控件安排布局,那么控件默认会被放在父容器的左上角. 可以使用 lv_obj_set_pos(obj, x ...