原文转载自「刘悦的技术博客」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年最新攻略)的更多相关文章

  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. 165. Compare Version Numbers - LeetCode

    Question 165. Compare Version Numbers Solution 题目大意: 比较版本号大小 思路: 根据逗号将版本号字符串转成数组,再比较每个数的大小 Java实现: p ...

  2. mui|mui.plusReady里面的函数不执行??

    无论是在本地的浏览器还是在iPhone上真机运行都出现奇怪的错误,比如说子页面样式成为乱码,无法跳转子页面等等,一开始并没有意识到是mui.plusReady的问题,后来调试时发现是plusReady ...

  3. 基于Python的渗透测试信息收集系统的设计和实现

    信息收集系统的设计和实现 渗透测试是保卫网络安全的一种有效且必要的技术手段,而渗透测试的本质就是信息收集,信息搜集整理可为后续的情报跟进提供强大的保证,目标资产信息搜集的广度,决定渗透过程的复杂程度, ...

  4. SpringSecurity的 loginProcessingUrl为什么不能用

    前情提要: 我在做一个springsecurity动态鉴权的项目时, 据网上说配置了 loginProcessingUrl("/login1"); 以后 就可以自定义login的请 ...

  5. 用t-SNE进行流形学习(digits数据集)

    流行学习算法: 是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化. t-SNE算法是其中一种. PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方 ...

  6. drools动态增加、修改、删除规则

    目录 1.背景 2.前置知识 1.如何动态构建出一个kmodule.xml文件 2.kmodule.xml应该被谁加载 3.我们drl规则内容如何加载 4.动态构建KieContainer 3.需求 ...

  7. conda创建/移除虚拟环境

    conda创建python虚拟环境 前言 conda常用的命令: conda list 查看安装了哪些包. conda env list 或 conda info -e 查看当前存在哪些虚拟环境 co ...

  8. script标签crossorigin属性及同源策略和跨域方法

    首先介绍(同源策略) 同源策略是浏览器最核心且基本的安全约定,要求协议.域名.端口都相同为同源,如果非同源时请求数据浏览器会在控制台抛出跨域异常错误,同源策略是浏览器的行为,即使客户端请求发送了,服务 ...

  9. kafka消费

    消费模型 kafka模型使用了 发布/订阅.点对点模型. 消息发布 在producer端,通过分片策略,找到对应topic下面的Partition leader,把消息发送到当前Partition 消 ...

  10. Pytorch中的Sort的使用

    >>> a = torch.randn(3,3)>>> atensor([[ 0.5805, 0.1940, 1.2591], [-0.0863, 0.5350, ...