Django——支付宝支付功能

本文最后更新于:2024年4月14日 下午

前期准备

首先我们需要获得支付宝提供的权限与接口,在蚂蚁开放平台进行相关申请:https://openhome.alipay.com/platform/appDaily.htm?tab=info

申请支付宝账户权限

iHMqr4.png

创建应用

iHMIP0.png

沙箱测试环境

iHM45q.png

appID:我的身份

支付宝网关:测试环境

获得相关的测试账号

iHQise.png

商户账号、客户账号后面可以通过这两个账号来进行测试

沙箱钱包(也可以不下载,直接在网页上登陆测试账号进行支付测试)

iHMoGV.png

在安卓手机上进行安装

获得SDK(pay.py)

就是加密算法

SDK(加密算法,阿里没有提供python版本,从github山获得)

官方

GIHUB(请注意浏览源码)——pay.py(依赖:pip install pycryptodome)

公钥私钥

iHM7xU.png

在这里下载
iHMXZ9.png

运行
iHMbMF.png

iHMLqJ.png

生成公钥私钥
iHMjaR.png

完成上传

iHMzPx.png

应用公钥上传后自动生成支付宝公钥

在django文件中进行替换成自己的key

1541664121222

django程序

演示

1.运行

2.访问去支付

iHMhan.png

3.支付页面

iHMT2T.png

4.登陆测试用户,完成支付

iHQpRK.png

iHMvI1.png

最终跳转到

iHQSG6.png

说明功能正常

Django实现

代码结构

iHQ9xO.png

views.py

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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from django.shortcuts import render,redirect,HttpResponse
from django.views.decorators.csrf import csrf_exempt
from utils.pay import AliPay
import time
from django.conf import settings

def aliPay():
obj = AliPay(
appid=settings.APPID,
app_notify_url=settings.NOTIFY_URL, # 如果支付成功,支付宝会向这个地址发送POST请求(校验是否支付已经完成)
return_url=settings.RETURN_URL, # 如果支付成功,重定向回到你的网站的地址。
alipay_public_key_path=settings.PUB_KEY_PATH, # 支付宝公钥
app_private_key_path=settings.PRI_KEY_PATH, # 应用私钥
debug=True, # 默认False,
)
return obj

def index(request):
if request.method == 'GET':
return render(request,'index.html')



alipay = aliPay()

# 对购买的数据进行加密
money = float(request.POST.get('price'))
out_trade_no = "x2" + str(time.time())
# 1. 在数据库创建一条数据:状态(待支付)

query_params = alipay.direct_pay(
subject="充气式韩红", # 商品简单描述
out_trade_no= out_trade_no, # 商户订单号
total_amount=money, # 交易金额(单位: 元 保留俩位小数)
)

pay_url = "https://openapi.alipaydev.com/gateway.do?{}".format(query_params)

return redirect(pay_url)


def pay_result(request):
"""
支付完成后,跳转回的地址
:param request:
:return:
"""
params = request.GET.dict()
sign = params.pop('sign', None)

alipay = aliPay()

status = alipay.verify(params, sign)

if status:
return HttpResponse('支付成功')
return HttpResponse('支付失败')



@csrf_exempt
def update_order(request):
"""
支付成功后,支付宝向该地址发送的POST请求(用于修改订单状态)
:param request:
:return:
"""
if request.method == 'POST':
from urllib.parse import parse_qs

body_str = request.body.decode('utf-8')
post_data = parse_qs(body_str)

post_dict = {}
for k, v in post_data.items():
post_dict[k] = v[0]

alipay = aliPay()

sign = post_dict.pop('sign', None)
status = alipay.verify(post_dict, sign)
if status:
# 修改订单状态
out_trade_no = post_dict.get('out_trade_no')
print(out_trade_no)
# 2. 根据订单号将数据库中的数据进行更新
return HttpResponse('支付成功')
else:
return HttpResponse('支付失败')
return HttpResponse('')

settings.py

1
2
3
4
5
6
# 支付相关配置
APPID = "2016082500309412"
NOTIFY_URL = "http://47.106.237.76:80/update_order/"
RETURN_URL = "http://47.106.237.76:80/pay_result/"
PRI_KEY_PATH = "keys/app_private_2048.txt"
PUB_KEY_PATH = "keys/alipay_public_2048.txt"

Django——支付宝支付功能
https://yance.wiki/前期准备/
作者
Yance Huang
发布于
2018年5月24日
许可协议