如何在网站中接入支付宝支付服务?

本文最后更新于 2024年6月23日 下午

需求分析

最终目标:在网站中接入支付宝支付功能 预期实现功能,使用户可以在网站的指定页面(商品列表橱窗)选定商品并下单,通过第三方支付手段(支付宝)完成支付,解锁商品资源的下载权限,完成交易。

前端、后端任务分解:
1. 后端(交易与登记过程):给定交易相关信息(主体:卖家信息,客体:商品信息,过程:订单信息),在后端程序(python)中接入支付宝支付功能,实现用户通过支付宝付款给商家;在完成交易后,需要存储用户(买家)的购买状况,解锁用户对已购买商品的下载权限。
2. 前端(选择商品过程):展示商品信息并提供下载链接,在用户(买家)点击下载链接时判断购买状况,若购买则跳转至下载页面,否则调起后端程序接入支付宝支付功能进入支付页面。

这个过程涉及到前端、后端的各类相关操作,我们可以尝试对不同模块的功能进行分解并逐一解决。需要实现的功能大致为:

  1. 支付功能:后端程序接入支付宝支付功能,实现在给定所需的交易信息的前提下提供支付宝支付的功能;
  2. 存储功能:后端程序建立数据库,并在用户完成支付(交易活动成功)后存储订单信息的功能;
  3. 查询与解锁功能:用户在点击商品链接时,前端程序调起后端程序查询数据库信息,如果用户已经购买商品,则解锁下载权限(直接跳转至下载地址),否则调起支付流程的功能;
  4. 商品选择功能:前端建立商品列表橱窗,在同一指定页面展示多个商品卡片(卡片内需呈现商品的信息)。用户在点击商品卡片后,启动查询与解锁功能部分的程序;

独立模块功能实现

支付功能

为了便于操作,支付功能的实现大致可以分为三步:支付前准备、支付过程、支付后反馈。

支付前准备
①确定商家(支付宝客户端对象):初始化支付宝客户端对象,确定商家、提供密钥以检验商家身份。
②确定支付模板:初始化支付模板,确定支付方式、确定商品信息。
支付过程
①构造请求支付信号:将支付模板作为参数传入构造函数,得到可提交的请求支付信号。
②提交请求支付信号:利用支付宝客户端对象(上面已经完成初始化和配置)将请求支付信号上传至支付宝支付平台。
③得到支付链接:支付宝客户端对象提交请求支付信号后,支付宝支付平台会返回一个链接给商家应用。
④展示支付链接:商家应用将接收到的支付链接展示给用户。
⑤用户进行支付:用户点击链接后即可跳转到支付页面,而后用户可选择支付宝扫描二维码或在网页端登陆支付宝平台后进行支付。这个过程我们只需要将支付宝返回的链接提供给用户即可,剩余的步骤发生在用户与支付宝之间。
支付后反馈
①设置支付后跳转url:设置一个url,作为用户完成支付后跳转的页面链接。支付宝在跳转过程中采用 GET 方法,会传入订单的相关信息
②设置支付宝反馈消息url:设置一个url,作为支付宝传输回调消息(也就是支付宝平台反馈支付状况)的地址,支付宝会在支付结束后将支付状况的信息传输到这个url,以便接入平台根据用户支付完成情况作进行下一步活动。

通过下面这张时序图,我们可以更加清晰地看出整个支付过程中的“信息流”与“资金流”。其中,“信息流”只发生在商家应用与支付宝之间(商家应用对支付宝主要进行调用,支付宝对商家应用主要进行消息传递);“资金流”只发生在用户与支付宝之间,资金并不经过商家应用,不过支付宝会直接将用户支付的钱直接转入商家在支付宝绑定的账号。

sequenceDiagram
    actor 用户
    participant 商家应用
    participant 支付宝
    商家应用 ->> 支付宝:提交支付请求
    支付宝 -->> 商家应用:返回支付链接
    商家应用 -->> 用户:展示支付链接
    用户 ->> 支付宝:进入链接进行支付
    支付宝 -->> 商家应用:反馈支付情况
    商家应用 -->> 用户:根据支付情况进行下一步

需要明确的是,在上图中支付宝向商家应用传回信息的过程发生了两次,一次是“返回支付链接”,一次是“反馈支付情况”,这两次传回信息的方式大不相同,后者要更为复杂。这是因为,返回支付链接实际上就是调用函数的返回值(可以理解为一个同步消息,输入参数后得到参数,再进行下一步操作),而反馈支付情况则是支付宝在支付活动完成后向商家应用设置的反馈消息url发送信息(这是一个异步消息,商家应用在展示支付链接给用户后,可以先进行别的操作,等支付宝将消息反馈给商家应用后再进行相应的下一步活动)。后者需要设置好合适的端口号,使用 flask 库的 request 进行消息的接收。

我们首先不对支付宝反馈的支付情况的消息进行处理(因为实现这个功能需要额外引入 flask 库,我们可以稍后再研究),做个甩手掌柜,只要能让用户付钱就行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51

# (必需模块)导入alipay相关功能函数 用于接入支付宝支付功能
## 初始化
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
## 使用页面支付方式所需要用到的函数
from alipay.aop.api.request.AlipayTradePagePayRequest import AlipayTradePagePayRequest
from alipay.aop.api.domain.AlipayTradePagePayModel import AlipayTradePagePayModel

# 初始化支付宝客户端配置
# 支付宝客户端在本代码中即为 alipay_client
## 配置信息模板
alipay_client_config = AlipayClientConfig()
## 支付宝支付平台链接(这里是沙盒)
alipay_client_config.server_url = 'https://openapi-sandbox.dl.alipaydev.com/gateway.do'
## 应用 ID
alipay_client_config.app_id = ''
## 应用私钥
alipay_client_config.app_private_key = ''
## 支付宝公钥
alipay_client_config.alipay_public_key = ''
## 传入配置信息 初始化支付宝客户端 alipay_client
alipay_client = DefaultAlipayClient(alipay_client_config)

# 支付功能函数
def pay():
# 初始化model 设置订单信息
## 支付功能模板
model = AlipayTradePagePayModel()
## 设置订单编号
model.out_trade_no = "pay201805020000227"
## 设置支付金额
model.total_amount = 50
## 设置支付主题名称
model.subject = "测试"
## 设置支付信息
model.body = "支付宝测试"
## 设置支付的目标商品信息代码
model.product_code = "FAST_INSTANT_TRADE_PAY"
## 传入支付模板 构造请求支付信息 request
request = AlipayTradePagePayRequest(biz_model = model)
## 利用 alipay_client 向支付宝提交请求支付信息 request
## page_execute 函数在提交请求后会返回支付链接 url
## 利用response 存储支付链接,并展示给用户,这里直接用 print 进行打印
response = alipay_client.page_execute(request, http_method="GET")
print("alipay.trade.page.pay response:" + response)


if __name__ == '__main__':
transaction()


如何在网站中接入支付宝支付服务?
http://knnow.top/post/如何在网站中接入支付宝支付服务?.html
作者
氮氮NNU
发布于
2024年6月18日
更新于
2024年6月23日
许可协议