开源web框架django知识总结(二十二)
开源web框架django知识总结(二十二)
支付
提示:
- 如果用户选择的支付方式是 “支付宝” ,在点击《去支付》时对接支付宝的支付系统。
支付宝介绍
支付宝开放平台入口
- https://open.alipay.com/platform/home.htm
1.使用手机上的支付宝扫码登录
2. 创建应用和沙箱环境
1.创建应用
2.沙箱环境
支付宝提供给开发者的模拟支付的环境。跟真实环境是分开的。
沙箱应用:https://openhome.alipay.com/platform/appDaily.htm?tab=info
配置支付宝“应用公钥”,“支付宝公钥”
沙箱账号:https://openhome.alipay.com/platform/appDaily.htm?tab=account
买家账号sdkywg1362@sandbox.com
登录密码111111
支付密码111111
用户名称沙箱环境
证件类型身份证(IDENTITY_CARD)
证件号码847038195010111148
账户余额
2016215.53充值取现
3. 支付宝开发文档
文档主页:https://openhome.alipay.com/developmentDocument.htm
电脑网站支付产品介绍:https://docs.open.alipay.com/270
电脑网站支付快速接入:https://docs.open.alipay.com/270/105899/
API列表:https://docs.open.alipay.com/270/105900/
SDK文档:https://docs.open.alipay.com/270/106291/
Python支付宝SDK:
https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
- SDK安装:
pip install python-alipay-sdk==2.0.1
- SDK安装:
- 电脑网站支付流程
5.新建apps --> payment,注册,添加主路由,添加子urls.py
6.配置RSA2公/私钥
提示:
- 阿尔法商城私钥加密数据,阿尔法商城公钥解密数据。
- 支付宝私钥加密数据,支付宝公钥解密数据。
1.生成 阿尔法商城公/私钥
========================================================
对接支付宝系统
订单支付功能
提示:
- 订单支付触发页面:《order_success.html》 和 《user_center_order.html》
- 我们实现订单支付功能时,只需要向支付宝获取登录链接即可,进入到支付宝系统后就是用户向支付宝进行支付的行为。
1.请求方式
选项 | 方案 |
---|---|
请求方法 | GET |
请求地址 | /payment/(?P<order_id>\d+)/ |
2.请求参数:路径参数
参数名 | 类型 | 是否必传 | 说明 |
---|---|---|---|
order_id | int | 是 | 订单编号 |
3.响应结果:JSON
字段 | 说明 |
---|---|
code | 状态码 |
errmsg | 错误信息 |
alipay_url | 支付宝登录链接 |
4.后端接口定义和实现
payment.views.py
from django.views import View
from django.http import JsonResponse
from django.conf import settings
from orders.models import OrderInfo
from .models import Payment
from alipay import AliPay
import osclass PaymentView(View):# 接口1、获取支付页面链接def get(self, request, order_id):# 1、提取参数# 2、校验参数try:order = OrderInfo.objects.get(pk=order_id)except OrderInfo.DoesNotExist as e:print(e)return JsonResponse({'code': 400, 'errmsg': '订单不存在!'}, status=404)# 3、获取支付页面链接 默认回调urlalipay_url = Nonewith open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'), "r") as f:app_private_key = f.read()with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_public_key.pem'), "r") as f:alipay_public_key = f.read()# 3.1 构建一个Alipay对象alipay = AliPay(appid=settings.ALIPAY_APPID,# 异步回调,支付成功之后,阿里后台主动请求阿尔法app_notify_url=None,# 阿尔法私钥app_private_key_string=app_private_key,# 阿里公钥alipay_public_key_string=alipay_public_key,sign_type='RSA2',debug=settings.ALIPAY_DEBUG)# 3.2 调用对象的方法# 扫码页面完整的链接是:# https://openapi.alipaydev.com/gateway.do?<查询字符串参数># order_string = alipay.api_alipay_trade_app_pay() # 移动端# 网页端order_string = alipay.api_alipay_trade_page_pay(subject='阿尔法商城%s'%order_id,out_trade_no=order_id,total_amount=float(order.total_amount),# 支付成功之后,用户页面跳转地址return_url=settings.ALIPAY_RETURN_URL)# 4、构建响应返回alipay_url = settings.ALIPAY_URL + '?' + order_stringreturn JsonResponse({'code': 0,'errmsg': 'ok','alipay_url': alipay_url})
5.支付宝SDK配置参数
dev.py
# 阿里支付配置参数
ALIPAY_APPID = '2016102500755751'
ALIPAY_DEBUG = True
ALIPAY_URL = 'https://openapi.alipaydev.com/gateway.do'
ALIPAY_RETURN_URL = "http://127.0.0.1/pay_success.html"
=================================
保存订单支付结果
1. 支付结果数据说明
- 用户订单支付成功后,支付宝会将用户重定向到
http://127.0.0.1:8000/payment/status/
,并携带支付结果数据。 - 参考统一收单下单并支付页面接口:https://opendocs.alipay.com/apis/api_1/alipay.trade.page.pay?scene=API002020081300013629
- 定义支付结果模型类
from django.db import models
from aerf_mall.utils.BaseModel import BaseModel
from orders.models import OrderInfoclass Payment(BaseModel):"""支付信息模型类"""# 交易的订单信息order = models.ForeignKey(OrderInfo,on_delete=models.CASCADE,verbose_name='订单')# 支付的交易号保存字段trade_id = models.CharField(max_length=100,unique=True, # 约束,唯一null=True,blank=True,verbose_name="支付编号")class Meta:db_table = 'tb_payment'verbose_name = '支付信息'verbose_name_plural = verbose_name
3. 保存订单支付结果
1.请求方式
选项 | 方案 |
---|---|
请求方法 | GET |
请求地址 | /payment/status/ |
2.请求参数:路径参数
参考统一收单下单并支付页面接口中的《页面回跳参数》
3.响应结果:HTML
pay_success.html
4.后端接口定义和实现
注意:保存订单支付结果的同时,还需要修改订单的状态为待评价
class PaymentStatusView(View):def put(self, request):# 用户支付成功之后,跳转回阿尔法页面的请求# 校验是否支付成功# 1、提取查询字符串参数data = request.GET # QueryDict类型data = data.dict() # QueryDict.dict()转化成普通字典# 提取签名(token值)sign = data.pop('sign')with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_private_key.pem'), "r") as f:app_private_key = f.read()with open(os.path.join(settings.BASE_DIR, 'apps/payment/keys/app_public_key.pem'), "r") as f:alipay_public_key = f.read()# 2、根据签名验证数据是否完整alipay = AliPay(appid=settings.ALIPAY_APPID,# 异步回调,支付成功之后,阿里后台主动请求阿尔法app_notify_url=None,# 阿尔法私钥app_private_key_string=app_private_key,# 阿里公钥alipay_public_key_string=alipay_public_key,sign_type='RSA2',debug=settings.ALIPAY_DEBUG)if not alipay.verify(data,signature=sign):return JsonResponse({'code': 400, 'errmsg': '支付失败!'}, status=400)# 3、阿尔法订单号和支付宝流水号关联order_id = data.get('out_trade_no')trade_id = data.get('trade_no')try:Payment.objects.create(order_id=order_id,trade_id=trade_id,)except Exception as e:print(e)return JsonResponse({'code': 400,'errmsg': '支付订单保存失败!'})# 修改订单状态OrderInfo.objects.filter(order_id=order_id).update(status=OrderInfo.ORDER_STATUS_ENUM['UNSEND'])return JsonResponse({'code': 0,'errmsg': 'ok','trade_id': trade_id})
payment.urls.py
from django.urls import re_path
from . import viewsurlpatterns = [
# 订单支付re_path(r'^payment/(?P<order_id>\d+)/$', views.PaymentView.as_view()),
# 订单支付状态re_path(r'^payment/status/$', views.PaymentStatusView.as_view()),
]
开源web框架django知识总结(二十二)相关推荐
- python3 web框架_循序渐进Python3(十二) --0-- web之框架
上述通过socket来实现了其本质,而对于真实开发中的python web程序来说,一般会分为两部分:服务器程序和应用程序.服务器程序负责对socket服务器进行封装,并在请求到来时,对请求的各种数据 ...
- Python Web框架Django学习(二)
python web框架Django学习(二) 目录: 三.Django创建APP 四.创建登录页面,实现用户交互,后台管理用户(非数据库方式) ========================= ...
- django 业务逻辑写在view里吗?_Python Web框架Django简介
引言 我们都知道,Django是一种基于Python的Web开发框架. 那么,什么是Web开发?Web开发指的是开发基于B/S架构,通过前后端的配合,将后台服务器的数据在浏览器上展现给前台用户的应用. ...
- JAVA基础知识总结:一到二十二全部总结
>一: 一.软件开发的常识 1.什么是软件? 一系列按照特定顺序组织起来的计算机数据或者指令 常见的软件: 系统软件:Windows\Mac OS \Linux 应用软件:QQ,一系列的播放器( ...
- python搭建django框架,Python之Web框架Django项目搭建全过程
Python之Web框架Django项目搭建全过程 IDE说明: Win7系统 Python:3.5 Django:1.10 Pymysql:0.7.10 Mysql:5.5 注:可通过pip fre ...
- Web框架Django使用概览
Web框架Django使用概览 标签: django python 1 开始一个新项目 django的安装比较简单,在命令行里执行下面的命令. pip install django 为了能使用djan ...
- 最新首途影视视频网站源码/二十二套带后台版全开源无加密源码
源码简介: 最新首途二十二套带后台版全开源无加密源码 菜单填写格式:MyTheme主题,/template/mytheme/admin/默认账号:admin默认密码:admin 下载链接 网盘源码 ...
- 二十二.香港大学火星实验室R3LIVE框架跑官方数据集
专栏系列文章如下: 一:Tixiao Shan最新力作LVI-SAM(Lio-SAM+Vins-Mono),基于视觉-激光-惯导里程计的SLAM框架,环境搭建和跑通过程_goldqiu的博客-CSDN ...
- 开源web框架_带有酷名称的开源JavaScript和Web框架的词汇表
开源web框架 It's getting to the point where there are so many cool open source projects that I can't kee ...
最新文章
- 面向生信分析的高性 RStudio 服务器
- 公司要上监控,选型调研下 Zabbix 和 Prometheus
- 收藏 | 那些机器学习必备知识
- 计算机英语 考研 翻译,研究生英语翻译笔记
- Sublime Text使用正则表达式进行替换
- 2020年NLP算法秋招“神仙打架”,我该如何应对?
- java socket 全双工客户端_Java Websocket实例【服务端与客户端实现全双工通讯】
- linux内核源码下载地址
- 【LaTeX 常用格式设置】 如何给公式、文本添加删除线
- 《2022年 Android 中高级面试题汇总》及答案整理(备战金九银十)
- in作为介词的用法_英语介词丨in、on 、at 的具体用法到底有哪些?
- Windows中使用pip下载任何包都报错
- 达梦数据库(DM)——命令方式开启达梦数据库本地归档的具体方法
- 字符串排序(函数,指针)(C语言实现)
- $.ajax异步请求总结
- 如何有效地召开会议?
- qbo_arduqob command 命令Id约定
- OpenStack Days China:华云数据CTO郑军分享OpenStack创新实践
- php h5 调用摄像头_html5实现调用摄像头并拍照功能
- Oracle项目管理系统之计划编制及进度计算