- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python项目实战之使用Django框架实现支付宝付款功能由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
春节即将来临,大家肯定各种掏腰包花花花,小编相信大家在支付时候,微信、支付宝支付肯定是优先选择。今天小编心血来潮,为大家带来一个很有趣的项目,那就是使用python web框架django来实现支付宝支付,废话不多说,一起来看看如何实现吧.
我们来建立一个django项目然后在里面创建一个应用,如图:
然后我们设置urls文件的内容,如图:
然后再在子应用中创建一个urls.py文件,当然你也可以直接将一些视图函数写在项目中的urls.py文件中。最后我们编写视图函数并把视图函数添加到urls.py文件中,如图:
最后我们需要提交更改,打开该项目manage.py文件所在的目录并打开cmd,输入如下命令:
1
|
python manage.py migrate
|
现在让我们来本地跑跑这个项目,还是在该目录中,如下:
1
|
python manage.py runserver
|
看到输出的结果表明这个子应用已经启动并返回了结果。我们也可以不用经过子应用直接在创建的项目根目录下运行启动django应用,首先在pay目录下新建一个view.py文件,然后将其添加到该目录下的urls.py文件中,如下:
运行下看图:
首先登录咱们要收款的支付宝,地址:
https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3a%2f%2fopenhome.alipay.com%2fplatform%2fappdaily.htm%3ftab%3dinfo 。
然后进行登录,如图:
然后点击rsa2(sha256)后面的设置,点击公钥并下载支付宝密钥生成器或者openssl来生成密钥,这里我选择支付宝密钥生成器,如图:
然后点击它之后跳转到下载界面下载,如图:
下载好后打开该工具,选择好密钥长度和密钥格式并生成密钥,如图:
然后进入公私钥的目录,将这个复制到我们的django项目的子应用目录中,并重命名,等下用的着,如图:
紧接着我们进入自己的开发者中心控制台,地址:
1
|
https:
/
/
open
.alipay.com
/
platform
/
developerindex.htm
|
然后我们去创建一个应用,如图:
按照要求如实填写即可。然后我们来设置它的接口加密方式,如图:
验证好了之后填写刚刚生成的应用公钥,如图:
此时会出现应用公钥和支付宝公钥,将支付宝公钥保存起来,如图:
然后我们将产生的额应用公私钥和支付宝公钥保存为下列内容形式的文件,如图:
将这三个文件都保存在rsakey这个文件夹中。现在准备工作都做好了,下面开始编写支付宝支付接口.
注:项目审核通过后才可以使用密钥调用支付宝接口噢! 。
4、pc端支付宝支付接口 。
这里我们使用一个类将它封装起来,如下:
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
from
datetime
import
datetime
from
crypto.publickey
import
rsa
from
crypto.signature
import
pkcs1_v1_5
from
crypto.
hash
import
sha256
from
urllib.parse
import
quote_plus
from
urllib.parse
import
urlparse, parse_qs
from
base64
import
decodebytes, encodebytes
import
json
class
alipay(
object
):
"""
支付宝支付接口(pc端支付接口)
"""
def
__init__(
self
, appid, app_notify_url, app_private_key_path,
alipay_public_key_path, return_url, debug
=
false):
self
.appid
=
appid
self
.app_notify_url
=
app_notify_url
self
.app_private_key_path
=
app_private_key_path
self
.app_private_key
=
none
self
.return_url
=
return_url
with
open
(
self
.app_private_key_path) as fp:
self
.app_private_key
=
rsa.importkey(fp.read())
self
.alipay_public_key_path
=
alipay_public_key_path
with
open
(
self
.alipay_public_key_path) as fp:
self
.alipay_public_key
=
rsa.importkey(fp.read())
if
debug
is
true:
self
.__gateway
=
"https://openapi.alipaydev.com/gateway.do"
else
:
self
.__gateway
=
"https://openapi.alipay.com/gateway.do"
def
direct_pay(
self
, subject, out_trade_no, total_amount, return_url
=
none,
*
*
kwargs):
biz_content
=
{
"subject"
: subject,
"out_trade_no"
: out_trade_no,
"total_amount"
: total_amount,
"product_code"
:
"fast_instant_trade_pay"
,
# "qr_pay_mode":4
}
biz_content.update(kwargs)
data
=
self
.build_body(
"alipay.trade.page.pay"
, biz_content,
self
.return_url)
return
self
.sign_data(data)
def
build_body(
self
, method, biz_content, return_url
=
none):
data
=
{
"app_id"
:
self
.appid,
"method"
: method,
"charset"
:
"utf-8"
,
"sign_type"
:
"rsa2"
,
"timestamp"
: datetime.now().strftime(
"%y-%m-%d %h:%m:%s"
),
"version"
:
"1.0"
,
"biz_content"
: biz_content
}
if
return_url
is
not
none:
data[
"notify_url"
]
=
self
.app_notify_url
data[
"return_url"
]
=
self
.return_url
return
data
def
sign_data(
self
, data):
data.pop(
"sign"
, none)
# 排序后的字符串
unsigned_items
=
self
.ordered_data(data)
unsigned_string
=
"&"
.join(
"{0}={1}"
.
format
(k, v)
for
k, v
in
unsigned_items)
sign
=
self
.sign(unsigned_string.encode(
"utf-8"
))
# ordered_items = self.ordered_data(data)
quoted_string
=
"&"
.join(
"{0}={1}"
.
format
(k, quote_plus(v))
for
k, v
in
unsigned_items)
# 获得最终的订单信息字符串
signed_string
=
quoted_string
+
"&sign="
+
quote_plus(sign)
return
signed_string
def
ordered_data(
self
, data):
complex_keys
=
[]
for
key, value
in
data.items():
if
isinstance
(value,
dict
):
complex_keys.append(key)
# 将字典类型的数据dump出来
for
key
in
complex_keys:
data[key]
=
json.dumps(data[key], separators
=
(
','
,
':'
))
return
sorted
([(k, v)
for
k, v
in
data.items()])
def
sign(
self
, unsigned_string):
# 开始计算签名
key
=
self
.app_private_key
signer
=
pkcs1_v1_5.new(key)
signature
=
signer.sign(sha256.new(unsigned_string))
# base64 编码,转换为unicode表示并移除回车
sign
=
encodebytes(signature).decode(
"utf8"
).replace(
"\n"
, "")
return
sign
def
_verify(
self
, raw_content, signature):
# 开始计算签名
key
=
self
.alipay_public_key
signer
=
pkcs1_v1_5.new(key)
digest
=
sha256.new()
digest.update(raw_content.encode(
"utf8"
))
if
signer.verify(digest, decodebytes(signature.encode(
"utf8"
))):
return
true
return
false
def
verify(
self
, data, signature):
if
"sign_type"
in
data:
sign_type
=
data.pop(
"sign_type"
)
# 排序后的字符串
unsigned_items
=
self
.ordered_data(data)
message
=
"&"
.join(u
"{}={}"
.
format
(k, v)
for
k, v
in
unsigned_items)
return
self
._verify(message, signature)
|
为了便于调用,我们将这个python文件放在子应用的目录中,命名为pay.py.
我们通过前端的商品的名称和价格来生成对应的商品信息并发起付款请求,如下:
index.html(商品主页) 。
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
|
<!doctype html>
<html lang
=
"en"
>
<head>
<meta charset
=
"utf-8"
>
<title>document<
/
title>
<style>
table,table tr th, table tr td { border:
1px
solid
#0094ff; }
table { width:
300px
;
min
-
height:
25px
; line
-
height:
25px
; text
-
align: center; border
-
collapse: collapse; padding:
2px
;}
a{
text
-
decoration: none;
}
<
/
style>
<
/
head>
<body>
<h1>欢迎来到购物商场<
/
h1>
<table border
=
"1"
>
<thead>商品目录<
/
thead>
<tr>
<td>商品名<
/
td>
<td>商品单价<
/
td>
<td>商品数量<
/
td>
<td>是否购买<
/
td>
<
/
tr>
<tr>
<td>梨子<
/
td>
<td>
0.1
<
/
td>
<td>
1
<
/
td>
<td><a href
=
"{% url 'dingdan' %}"
rel
=
"external nofollow"
>购买<
/
a><
/
td>
<
/
table>
<
/
body>
<
/
html>
|
show.html(支付结果显示页) 。
1
2
3
4
5
6
7
8
9
10
|
<!doctype html>
<html lang
=
"en"
>
<head>
<meta charset
=
"utf-8"
>
<title>document<
/
title>
<
/
head>
<body>
<h1>支付结果:{{msg}}<
/
h1>
<
/
body>
<
/
html>
|
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
|
from
django.shortcuts
import
render,redirect
from
django.http
import
httpresponse,jsonresponse
from
.pay
import
alipay
import
uuid
from
urllib.parse
import
parse_qs
# create your views here.
def
index(request):
return
render(request,
'index.html'
)
def
dingdan(request):
# 实例化alipay
alipay
=
alipay(
appid
=
"自己的appid"
,
app_notify_url
=
'http://127.0.0.1:8000/paypay/check/'
,
#支付宝会向这个地址发送post请求
return_url
=
'http://127.0.0.1:8000/paypay/show/'
,
#支付宝会向这个地址发送get请求
app_private_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\private2048.txt'
,
# 应用私钥
alipay_public_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\paypublic.txt'
,
# 支付宝公钥
debug
=
true,
# 默认是false
)
# 定义请求地址传入的参数
res
=
alipay.direct_pay(
subject
=
'梨子'
,
# 商品描述
out_trade_no
=
str
(uuid.uuid4()),
# 订单号
total_amount
=
'0.1'
,
# 交易金额(单位是元,保留两位小数)
)
#生成跳转到支付宝支付页面的url
url
=
'https://openapi.alipaydev.com/gateway.do?{0}'
.
format
(res)
return
redirect(url)
def
show(request):
if
request.method
=
=
'get'
:
alipay
=
alipay(
appid
=
"自己的appid"
,
app_notify_url
=
'http://127.0.0.1:8000/paypay/check/'
,
return_url
=
'http://127.0.0.1:8000/paypay/show/'
,
app_private_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\private2048.txt'
,
# 应用私钥
alipay_public_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\paypublic.txt'
,
# 支付宝公钥
debug
=
true,
# 默认是false
)
param
=
request.get.
dict
()
# 获取请求携带的参数并转换成字典类型
sign
=
param.pop(
'sign'
, none)
# 获取sign的值
# 对sign参数进行验证
statu
=
alipay.verify(param,sign)
if
statu:
return
render(request,
'show.html'
, {
'msg'
:
'支付成功'
})
else
:
return
render(request,
'show.html'
, {
'msg'
:
'支付失败'
})
else
:
return
render(request,
'show.html'
, {
'msg'
:
'只支持get请求,不支持其它请求'
})
def
check(request):
if
request.method
=
=
'post'
:
alipay
=
alipay(appid
=
"自己的appid"
,
app_notify_url
=
'http://127.0.0.1:8000/paypay/check/'
,
# 支付宝会向这个地址发送post请求
return_url
=
'http://127.0.0.1:8000/show_msg/'
,
# 支付宝会向这个地址发送get请求
app_private_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\private2048.txt'
,
# 应用私钥
alipay_public_key_path
=
r
'c:\users\administrator\desktop\pay\paypay\rsakey\paypublic.txt'
,
# 支付宝公钥
debug
=
true,
)
body
=
request.body.decode(
'utf-8'
)
# 转成字符串
post_data
=
parse_qs(body)
# 根据&符号分割
post_dict
=
{}
for
k, v
in
post_data.items():
post_dict[k]
=
v[
0
]
sign
=
post_dict.pop(
'sign'
, none)
status
=
alipay.verify(post_dict, sign)
if
status:
# 支付成功
return
httpresponse(
'支付成功'
)
else
:
return
httpresponse(
'支付失败'
)
else
:
return
httpresponse(
'只支持post请求'
)
|
1
2
3
4
5
6
7
8
|
from
django.urls
import
path
from
.
import
views
urlpatterns
=
[
path('
',views.index,name='
index'),
path(
'dingdan/'
,views.dingdan,name
=
'dingdan'
),
path(
'show/'
,views.show,name
=
'show'
),
path(
'check/'
,views.check,name
=
'check'
),
]
|
所有准备工作都做好了,我们赶紧来试着运行下项目吧,如下:
可以看到我们购买商品后链接成功跳转到支付界面.
该支付宝支付环境在沙箱中实现,因此安全性毋庸置疑,代码小编已经打包好了,不过里面的appid还有公私钥需要大家自行填写噢.
原生sql代码链接:https://github.com/cassieeric/python_crawler/tree/master/zhifubao 。
到此这篇关于python项目实战之使用django框架实现支付宝付款功能的文章就介绍到这了,更多相关django框架支付宝付款内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/pdcfighting/article/details/113764680 。
最后此篇关于Python项目实战之使用Django框架实现支付宝付款功能的文章就讲到这里了,如果你想了解更多关于Python项目实战之使用Django框架实现支付宝付款功能的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我对 Python-Django 和 web 开发还很陌生,我被困在这个使用 POST 创建新资源的特殊问题上。 我正在为 REST API 使用 Django REST 框架,我正在尝试创建一个新资
我已经使用 Django-storages 成功地将 Word 文档存储到 S3。 class Document(TitleSlugDescriptionModel, TimeStampedModel
我有 2 个关于模型代理的问题, 如何从模型对象创建代理对象? 如何从模型查询集创建代理查询集? 例如,假设我们定义了: from django.contrib.auth.models import
我想编写一个直接执行 HTTP 请求的单元测试(而不是使用 django.test.client.Client)。 如果您好奇为什么 - 那是因为我想测试我从 Django 应用程序公开的 Thrif
我为我的个人网站启动了一个 django 项目来学习 django。到目前为止,我已经将我的开发环境设置为我需要的一切,并遵循 this很棒的教程来创建一些基本的数据结构和模板。现在我想开始使用我之前
我已经阅读了很多关于如何在使用 Django 注册时添加额外字段的信息,例如 here 、 here 和 here 。代码片段是: forms.py(来自注册应用程序) class Registrat
我正在编写小型社交应用程序。功能之一是在网站标题中写入用户名。因此,例如,如果我登录并且我的名字是Oleg(用户名),那么我应该看到: Hello, Oleg | Click to edit prof
我有一个使用 Django 和 Django Rest 框架开发的应用程序。我想将 django-reversion 功能添加到我的应用程序中。 我已经尝试过http://django-reversi
我有一个简单的 HTML 表单,我没有使用 Django 表单,但现在我想添加一个选择。 选择最容易创建为 Django ChoiceField (与通过循环等手动创建选择相反),但是,如果没有在 D
我不明白为什么人们以两种方式编写外键,这样做的目的是什么?它们是相同还是不同? 我注意到有些人这样写: author = models.ForeignKey(Author, on_delete=mod
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
这对于 Django 1.2 仍然有效吗? Custom Filter in Django Admin on Django 1.3 or below 我已经尝试过,但管理类中的 list_filter
问题在于,当 django-compressor 编译为 .js 文件的 CoffeeScript 文件中引用 {{ STATIC_URL }} 时,它无法正确加载。 在我的 django 模板中,我
我正在尝试将一些字段从一个 django 模型移动到一个新模型。假设我有一个书籍模型: class Book(models.Model): title = models.CharField(max
我想在我的 Django 应用程序中获取评论最多的十个帖子,但我做不到,因为我想不出合适的方法。 我目前正在使用 django 评论框架,并且我已经看到使用 aggregate or annotate
目前我正在寻找在 Django 中实现访问控制。我已经阅读了有关内置权限的内容,但它并不关心每个对象的基础。例如,我想要“只有创建者可以删除自己的项目”之类的权限。所以我读到了 django-guar
嗨,我正在将我的 Django 模型的一个字段的值设置为其他模型的另一个字段的值。这个值应该是动态变化的。 这是我的第一个模型 class MainModel(AbstractBaseUser, Pe
我正在尝试为我的模型创建一个编辑表单。我没有使用模型表单,因为根据模型类型,用户可以使用不同的表单。 (例如,其中一个表单有 Tinymce 小部件,而另一个没有。) 有没有什么方法可以使用模型设置表
Django 模板中的搜索字段 如何在类似于此图像的 Django 模板中创建搜索字段 http://asciicasts.com/system/photos/1204/original/E354I0
根据 Django documentation ,如果 Django 安装激活了 AuthenticationMiddleware,HttpRequest 对象有一个“user”属性代表当前登录的用户
我是一名优秀的程序员,十分优秀!