如何在Python项目中利用Django框架实现一个支付宝付款功能

今天就跟大家聊聊有关如何在Python项目中利用Django框架实现一个支付宝付款功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

建立一个Django项目然后在里面创建一个应用,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

配置并启动

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后我们设置urls文件的内容,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后再在子应用中创建一个urls.py文件,当然你也可以直接将一些视图函数写在项目中的urls.py文件中。最后我们编写视图函数并把视图函数添加到urls.py文件中,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

最后我们需要提交更改,打开该项目manage.py文件所在的目录并打开cmd,输入如下命令:

pythonmanage.pymigrate

现在让我们来本地跑跑这个项目,还是在该目录中,如下:

pythonmanage.pyrunserver

如何在Python项目中利用Django框架实现一个支付宝付款功能

看到输出的结果表明这个子应用已经启动并返回了结果。我们也可以不用经过子应用直接在创建的项目根目录下运行启动Django应用,首先在pay目录下新建一个view.py文件,然后将其添加到该目录下的urls.py文件中,如下:

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

运行下看图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

登录支付宝并生成rsa密钥

首先登录咱们要收款的支付宝,地址:

https://auth.alipay.com/login/ant_sso_index.htm?goto=https%3A%2F%2Fopenhome.alipay.com%2Fplatform%2FappDaily.htm%3Ftab%3Dinfo

然后进行登录,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后点击RSA2(SHA256)后面的设置,点击公钥并下载支付宝密钥生成器或者openssl来生成密钥,这里我选择支付宝密钥生成器,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后点击它之后跳转到下载界面下载,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

下载好后打开该工具,选择好密钥长度和密钥格式并生成密钥,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后进入公私钥的目录,将这个复制到我们的Django项目的子应用目录中,并重命名,等下用的着,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

紧接着我们进入自己的开发者中心控制台,地址:

https://open.alipay.com/platform/developerIndex.htm

然后我们去创建一个应用,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

按照要求如实填写即可。然后我们来设置它的接口加密方式,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

验证好了之后填写刚刚生成的应用公钥,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

此时会出现应用公钥和支付宝公钥,将支付宝公钥保存起来,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

然后我们将产生的额应用公私钥和支付宝公钥保存为下列内容形式的文件,如图:

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能

如何在Python项目中利用Django框架实现一个支付宝付款功能将这三个文件都保存在rsakey这个文件夹中。现在准备工作都做好了,下面开始编写支付宝支付接口。

注:项目审核通过后才可以使用密钥调用支付宝接口噢!

四、PC端支付宝支付接口

这里我们使用一个类将它封装起来,如下:

fromdatetimeimportdatetime
fromCrypto.PublicKeyimportRSA
fromCrypto.SignatureimportPKCS1_v1_5
fromCrypto.HashimportSHA256
fromurllib.parseimportquote_plus
fromurllib.parseimporturlparse,parse_qs
frombase64importdecodebytes,encodebytes
importjson




classAliPay(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
withopen(self.app_private_key_path)asfp:
self.app_private_key=RSA.importKey(fp.read())
self.alipay_public_key_path=alipay_public_key_path
withopen(self.alipay_public_key_path)asfp:
self.alipay_public_key=RSA.importKey(fp.read())


ifdebugisTrue:
self.__gateway="https://openapi.alipaydev.com/gateway.do"
else:
self.__gateway="https://openapi.alipay.com/gateway.do"


defdirect_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)
returnself.sign_data(data)


defbuild_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
}


ifreturn_urlisnotNone:
data["notify_url"]=self.app_notify_url
data["return_url"]=self.return_url


returndata


defsign_data(self,data):
data.pop("sign",None)
#排序后的字符串
unsigned_items=self.ordered_data(data)
unsigned_string="&".join("{0}={1}".format(k,v)fork,vinunsigned_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))fork,vinunsigned_items)


#获得最终的订单信息字符串
signed_string=quoted_string+"&sign="+quote_plus(sign)
returnsigned_string


defordered_data(self,data):
complex_keys=[]
forkey,valueindata.items():
ifisinstance(value,dict):
complex_keys.append(key)


#将字典类型的数据dump出来
forkeyincomplex_keys:
data[key]=json.dumps(data[key],separators=(',',':'))


returnsorted([(k,v)fork,vindata.items()])


defsign(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","")
returnsign


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"))
ifsigner.verify(digest,decodebytes(signature.encode("utf8"))):
returnTrue
returnFalse


defverify(self,data,signature):
if"sign_type"indata:
sign_type=data.pop("sign_type")
#排序后的字符串
unsigned_items=self.ordered_data(data)
message="&".join(u"{}={}".format(k,v)fork,vinunsigned_items)
returnself._verify(message,signature)

为了便于调用,我们将这个Python文件放在子应用的目录中,命名为pay.py。

五、编写前端页面

我们通过前端的商品的名称和价格来生成对应的商品信息并发起付款请求,如下:

index.html(商品主页)

<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Document</title>
<style>
table,tabletrth,tabletrtd{border:1pxsolid#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>
<h2>欢迎来到购物商场</h2>
<tableborder="1">
<thead>商品目录</thead>
<tr>
<td>商品名</td>
<td>商品单价</td>
<td>商品数量</td>
<td>是否购买</td>
</tr>
<tr>
<td>梨子</td>
<td>0.1</td>
<td>1</td>
<td><ahref="{%url'dingdan'%}"rel="externalnofollow">购买</a></td>
</table>
</body>
</html>

show.html(支付结果显示页)

<!DOCTYPEhtml>
<htmllang="en">
<head>
<metacharset="UTF-8">
<title>Document</title>
</head>
<body>
<h2>支付结果:{{msg}}</h2>
</body>
</html>

六、编写视图函数处理渲染

fromdjango.shortcutsimportrender,redirect
fromdjango.httpimportHttpResponse,JsonResponse
from.payimportAliPay
importuuid
fromurllib.parseimportparse_qs
#Createyourviewshere.
defindex(request):
returnrender(request,'index.html')
defdingdan(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)
returnredirect(url)

defshow(request):
ifrequest.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)
ifstatu:
returnrender(request,'show.html',{'msg':'支付成功'})
else:
returnrender(request,'show.html',{'msg':'支付失败'})
else:
returnrender(request,'show.html',{'msg':'只支持GET请求,不支持其它请求'})

defcheck(request):
ifrequest.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={}
fork,vinpost_data.items():
post_dict[k]=v[0]
sign=post_dict.pop('sign',None)
status=alipay.verify(post_dict,sign)
ifstatus:#支付成功
returnHttpResponse('支付成功')
else:
returnHttpResponse('支付失败')
else:
returnHttpResponse('只支持POST请求')

七、添加路由函数到url规则中

fromdjango.urlsimportpath
from.importviews
urlpatterns=[
path('',views.index,name='index'),
path('dingdan/',views.dingdan,name='dingdan'),
path('show/',views.show,name='show'),
path('check/',views.check,name='check'),
]

八、运行项目

所有准备工作都做好了,我们赶紧来试着运行下项目吧,如下:

如何在Python项目中利用Django框架实现一个支付宝付款功能

看完上述内容,你们对如何在Python项目中利用Django框架实现一个支付宝付款功能有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注恰卡编程网行业资讯频道,感谢大家的支持。

发布于 2021-02-24 07:34:48
收藏
分享
海报
0 条评论
161
上一篇:利用C语言编写一个三子棋游戏 下一篇:使用python怎么编写一个扎金花小程序
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码