别无分号只此一家,Python3接入支付宝身份认证接口( alipay.user.certify)体系(2023年最新攻略)

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

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

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

随后创建应用

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

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

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

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

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

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

打开支付宝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个月的有效期。

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

相关文章
|
2月前
|
C语言 Python
python 调用c接口
【10月更文挑战第12天】 ctypes是Python的一个外部库,提供和C语言兼容的数据类型,可以很方便地调用C DLL中的函数
56 0
|
14天前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
4月前
|
测试技术 索引 Python
Python接口自动化测试框架(练习篇)-- 数据类型及控制流程(一)
本文提供了Python接口自动化测试中的编程练习,包括计算器、猜数字、猜拳和九九乘法表等经典问题,涵盖了数据类型、运算、循环、条件控制等基础知识的综合应用。
49 1
|
4天前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
15天前
|
JSON 安全 API
Python调用API接口的方法
Python调用API接口的方法
72 5
|
2月前
|
JSON 缓存 API
在 Python 中使用公共类处理接口请求的响应结果
在 Python 中使用公共类处理接口请求的响应结果
36 1
|
3月前
|
安全 API 开发者
Web 开发新风尚!Python RESTful API 设计与实现,让你的接口更懂开发者心!
在当前的Web开发中,Python因能构建高效简洁的RESTful API而备受青睐,大大提升了开发效率和用户体验。本文将介绍RESTful API的基本原则及其在Python中的实现方法。以Flask为例,演示了如何通过不同的HTTP方法(如GET、POST、PUT、DELETE)来创建、读取、更新和删除用户信息。此示例还包括了基本的路由设置及操作,为开发者提供了清晰的API交互指南。
112 6
|
3月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
3月前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
4月前
|
IDE 测试技术 开发工具
Python接口自动化测试框架(基础篇)-- 不只是txt的文件操作
本文介绍了Python中的文件操作方法,包括使用open()打开文件、close()关闭文件、read()读取内容、readline()读取单行、readlines()读取多行、write()写入内容以及writelines()写入多行的方法。同时,探讨了文件操作模式和编码问题,并扩展了上下文管理器with...as的使用,以及对图片和音频文件操作的思考和练习。
35 1
Python接口自动化测试框架(基础篇)-- 不只是txt的文件操作