别无分号只此一家,Python3接入支付宝身份认证接口( alipay.user.certify)体系(2021年最新攻略)
原文转载自「刘悦的技术博客」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完成刷脸认证。
首先安装对应的库:
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:
import json from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.request.AlipayUserCertifyOpenInitializeRequest import AlipayUserCertifyOpenInitializeRequest, AlipayUserCertifyOpenInitializeModel
from alipay.aop.api.request.AlipayUserCertifyOpenCertifyRequest import AlipayUserCertifyOpenCertifyRequest from alipay.aop.api.request.AlipayUserCertifyOpenQueryRequest import AlipayUserCertifyOpenQueryRequest from alipay.aop.api.response.AlipayUserCertifyOpenCertifyResponse import AlipayUserCertifyOpenCertifyResponse import random
import string import ssl
ssl._create_default_https_context = ssl._create_unverified_context
from MyQR import myqr ali_public_key = ''' -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuv2nESi3dAvGdHcxNs1TjIMxbJt4IrhBjMZcIrBALGGHxuQVCPZjci4lcGt+oBmWGAlt3F
这里是支付宝公钥 -----END PUBLIC KEY----- '''
app_private_key = ''' -----BEGIN RSA PRIVATE KEY----- MIIEogIBAAKCAQEAnpWCj6SVbWuuldIGns4K1PB+Ir17v6BNXRvyYY3jxu2ky这里是应用私钥 -----END RSA PRIVATE KEY----- ''' config = AlipayClientConfig()
config.app_id = '应用id'
config.app_private_key = app_private_key
config.alipay_public_key = ali_public_key
将应用id、支付宝公钥以及应用私钥配置好,这里注意秘钥最好加上开始与结束符。随后编写初始化逻辑:
# 身份初始化
def ali_init(): client = DefaultAlipayClient(config) request = AlipayUserCertifyOpenInitializeRequest() request.biz_content = { 'outer_order_no': ''.join(random.sample(string.ascii_letters, 32)), 'biz_code': 'FACE_ALIPAY_SDK', 'identity_param': { "identity_type": "CERT_INFO", "cert_type": "IDENTITY_CARD", "cert_name": "姓名", "cert_no": "身份证号" }, 'merchant_config': { "return_url": "https://ali.v3u.cn" }, } #print(request.get_params()) response = client.execute(request) #print(response) # 获取参数 certify_id = json.loads(response).get('certify_id') print(certify_id)
这里订单号不能重复,所以使用随机模块进行生成,访问AlipayUserCertifyOpenInitializeRequest接口,测试一下:
liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
ff8182725aae897e262fa6d0fe24692c
可以看到接口返回了一个32位的certify_id。此时,我们可以进行第二步:身份认证开始认证(alipay.user.certify.open.certify),官方文档:https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.certify
# 开始身份认证
def auth_start(client, certify_id): #client = DefaultAlipayClient(config) request = AlipayUserCertifyOpenCertifyRequest() request.biz_content = {'certify_id': str(certify_id)} print(certify_id) #print(request.get_params()) response = client.page_execute(request, http_method="GET") print(response) myqr.run(words=response)
将刚刚返回的certify_id作为参数请求AlipayUserCertifyOpenCertifyRequest接口,注意采用get方式,该接口会返回一个支付宝的链接,测试一下:
def ali_init(): client = DefaultAlipayClient(config) request = AlipayUserCertifyOpenInitializeRequest() request.biz_content = { 'outer_order_no': ''.join(random.sample(string.ascii_letters, 32)), 'biz_code': 'FACE_ALIPAY_SDK', 'identity_param': { "identity_type": "CERT_INFO", "cert_type": "IDENTITY_CARD", "cert_name": "收委", "cert_no": "260104197909275964" }, 'merchant_config': { "return_url": "https://lingxi.zfmix.com/user/user_authentication/" }, } #print(request.get_params()) response = client.execute(request) #print(response) # 获取参数 certify_id = json.loads(response).get('certify_id') print(certify_id) auth_start(client, certify_id)
返回值:
liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
65bf2091bc757d1e7b7dff7f3af619f6
65bf2091bc757d1e7b7dff7f3af619f6
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
line 16: mode: byte
liuyue:mydjango liuyue$
这个链接只要使用支付宝app进行访问,就可以跳转到刷脸认证页面,但是如果让普通用户粘贴链接到支付宝太过于繁琐,所以我们利用myqr模块将该链接制作成二维码,用户只需要用支付宝app对二维码进行扫描即可:
pip3 install myqr
认证接口:
response = client.page_execute(request, http_method="GET")
print(response)
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
# 查询接口
def auth_check(client, certify_id): print(certify_id) request = AlipayUserCertifyOpenQueryRequest() request.biz_content = {'certify_id': str(certify_id)} response = client.execute(request) print(response)
同样传入certify_id,接口为AlipayUserCertifyOpenQueryRequest,测试一下:
liuyue:mydjango liuyue$ python3 "/Users/liuyue/wodfan/work/mydjango/mydjango/tests.py"
f35030276a08b27cdc67c26a18f57650
f35030276a08b27cdc67c26a18f57650
{"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年最新攻略)相关推荐
- Java调用支付宝身份认证接口
支付宝官方文档地址:https://opendocs.alipay.com/apis/api_2/alipay.user.certify.open.initialize <!-- https:/ ...
- Win10环境前后端分离项目基于Vue.js+Django+Python3实现微信(wechat)扫码支付流程(2021年最新攻略)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_182 之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内 ...
- Java支付宝身份验证接口接入指南(人脸验证)
Java支付宝身份验证接口接入指南 最近公司项目有人脸身份核验的需求,首先就想到了支付宝的身份验证接口,于是就需要看支付宝的开放api文档,这里就有些坑,然后就本次接入遇到的坑,做个整理.(基于web ...
- H5网站接入支付宝的支付接口
写本文章的目的是为了记录工作中遇到的问题,方便以后遇到可以迅速解决问题 H5手机网站接入支付宝的支付接口,推荐使用支付宝提供的SDK来快速开发 我使用的是SDK开发 引用命名空间 using Aop. ...
- 【网络安全】接入与身份认证技术概述
1 概述 随着信息化的快速发展,对国家.组织.公司或个人来说至关重要的信息越来越多的通过网络来进行存储.传输和处理,为获取这些关键信息的各种网络犯罪也相应急剧上升.当前,网络安全在某种意义上已经成为一 ...
- 一个php文件实现支付宝身份认证
一个php文件实现支付宝身份认证 1.生成二维码 <?php header('Content-type:text/html; Charset=utf-8'); /*** 请填写以下配置信息 ** ...
- 个人身份认证接口介绍
个人身份认证接口主要是用于互联网核验用户信息的真实性,比如在各类网站发布信息需要实名.注册域名需要实名.办理固定电话入网需要实名.线上购买金融产品需要实名等,总之,在很多业务场景中都会需要用户进行实名 ...
- 支付宝牵头,近30亿红包等你领,攻略全在这里了!
支付宝牵头,近30亿红包等你领,攻略全在这里了! 过了腊八就是年!抢红包也就成了很多小伙伴过年的必备仪式!细数今年的红包战场可为是热闹异常,不仅多了几员实力大将,就连金额也让人瞠目. 支付宝坚持老路子 ...
- Dynamics 365 CRM 接入统一身份认证平台(单点登录集成)
打算将D365 CRM接入公司统一身份认证平台. 前提:D365 已IFD部署,因为要借助ADFS来完成单点登录. 登录ADFS服务器,打开ADFS,本次集成,统一身份认证为上游,ADFS是下游,因为 ...
最新文章
- HTML基础(四):注释、URL参数、访问路径、图片地图
- AIR for IOS开发问题小结
- 老李分享:Web Services 组件 2
- Redis的Expire与Setex
- future.channel().closeFuture().sync()作用 bind(port).sync()作用
- 科技领袖技术大亨们被指是现代强盗:不仅赚钱还想垄断
- jquery设置滚动条距离页面顶部的高度
- 5G NR协议栈----总体架构
- python django mysql_Python之模块、函数和缩进
- 自动化部署关于在ubuntu下的docker容器折腾小记
- 怎么用计算机输出手机的密码,手机连接wifi后怎么看密码?手机连接wifi后看密码的方法-太平洋IT百科...
- android屏幕漂移,手机屏幕不受控制乱跳 触屏“飘逸”的解决方法
- This view is not constrained vertically: at runtime it will jump to the left unless you add a vertic
- Android 获取/设置:窝蜂移动数据网络状态
- 虚拟中的多态与现实中多态
- arduino笔记41:直流电机 + 步进电机参数、原理
- OFDM载波间隔_LTE-子载波间隔与符号持续时长关系
- SAP vf11发票冲销
- Domain or host
- 微信第三方服务平台源码分析——每个Action与模块的对应关系
热门文章
- 音频功放的种类和基本原理
- Unity打包Android项目报错
- 考研计算机专业英语面试自我介绍,2017年计算机专业研究生英语面试自我介绍...
- 解决vue重复点击路由报错问题:Uncaught (in promise) NavigationDuplicated
- QT出现:Error while building/deploying project MyTcpServer (kit: Desktop Qt 5.12.0 MinGW 64-bit)解决办法
- 云笔记有什么功能作用,浏览器如何添加云笔记插件
- AlexNet架构重现与解析
- 微信小程序--超简单贪吃蛇
- 失物招领小程序,失物招领微信小程序,校园失物招领小程序系统毕设作品
- 「1.9W字总结」一份通俗易懂的 TS 教程,入门 + 实战!