django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...
一、前言
本文主要针对 Python for Django 在对接支付宝电脑网站、手机网站、App支付过程中具体实现步骤进行详解;
相信大家支付功能也写了不少,但时间一长,再次用到的时候有些细节难免会忘记,此篇文章就为方便后续快速实现支付宝各支付功能集成而作。
二、支付宝开发者相关文档
支付宝开发文档: https://openhome.alipay.com/developmentDocument.htm
支付快速接入文档: https://docs.open.alipay.com/270/105899/
官方SDK地址: https://docs.open.alipay.com/270/106291/
非官方支付宝SDK地址: https://github.com/fzlee/alipay/blob/master/README.zh-hans.md
开发帮助中心: https://opensupport.alipay.com/support/helpcenter/192
对接过程中如果遇到难题,可以在帮助中心寻找答案
三、各支付功能支付流程图
支付流程文字叙述如下,以电脑网站支付为例
用户点击下单,生成订单信息,前端携带后端生成返回的订单id,调取获取支付宝支付链接口,接口返回支付链接(包含订单编号,总金额,return_url,notify_url 等参数);前端获取到支付宝支付链接后,构建form表单,向支付宝服务器发起支付请求;进入支付宝支付页面,登录支付宝,登录成功后输入支付密码,进行支付;支付成功后跳转到支付成功页面,支付宝携带支付结果数据重定向到商户指定的 return_url 页面;前端携带支付成功结果数据,向同步回调通知接口发起请求,后端验签成功后返回支付成功业务逻辑响应;同时支付宝服务器也会根据提供的 notify_url 异步请求异步通知接口,后端验签成功,保存支付结果,并返回 success 字符给支付宝服务器;到此支付流程结束
四、支付宝接入前准备
4.1 创建应用
安装SDK: pip install python-alipay-sdk==1.7.1
创建项目: django-admin startproject alipay_demo
创建应用: python manage.py startapp payment
本Demo目录结构
4.2 配置公私钥
此步主要完成两个配置文件,即:应用私钥:app_private_key.pem,支付宝公钥:alipay_public_key.pem
生成应用的私钥和公钥,Windows用户请下载签名工具# 打开终端,输入openssl回车,一次执行以下命令生成应用公私钥 openssl OpenSSL> genrsa -out app_private_key.pem 2048 # 私钥RSA2 OpenSSL> rsa -in app_private_key.pem -pubout -out app_public_key.pem # 导出公钥 OpenSSL> exit #退出OpenSSL程序
保存应用私钥文件在 payment 应用中新建 keys 目录,用来保存秘钥文件。将应用私钥文件 app_private_key.pem 复制到 payment/keys 目录下, 内容如下。
-----BEGIN RSA PRIVATE KEY-----此处为上面生成的应用私钥-----BEGIN RSA PRIVATE KEY-----
查看公钥
cat app_publict_key.pem
将应用公钥内容复制粘贴到支付宝控制台进行配置,会得到支付宝公钥;如图,第一次应该是设置应用公钥
注意:对应加密方式进行配置,推荐RSA2。
保存支付宝公钥在 payment/keys 目录下新建 alipay_public_key.pem 文件,用于保存支付宝的公钥文件。将上一步生成的支付宝的公钥内容复制到 alipay_public_key.pem 文件中,格式如下:
注意:还需要在公钥文件中补充开始与结束标志,格式如下:
-----BEGIN PUBLIC KEY-----此处是公钥内容-----END PUBLIC KEY-----
五、支付视图接口实现
5.0 封装支付宝支付对象
代码如下: 写到 payment 应用里的 utils.py 工具里
# -*- coding: utf-8 -*-import osfrom alipay import AliPay # python-alipay-sdkfrom django.conf import settingsdef my_ali_pay(notify_url=None): """ 支付宝支付对象 :param notify_url: 支付成功支付宝服务器异步通知默认回调url,会向这个地址发送POST请求,接口实现校验是否支付已经完成,注意:此地址需要能在公网进行访问 :return: 支付对象 """ ali_pay_obj = AliPay( appid=settings.ALI_PAY_APP_ID, app_notify_url=notify_url, # 支付成功支付宝服务器异步通知默认回调url, 即会向这个地址发送POST请求 app_private_key_path=os.path.join(os.path.dirname(__file__), "keys/app_private_key.pem"), # 支付宝的公钥,验证支付宝回传消息使用 alipay_public_key_path=os.path.join(os.path.dirname(__file__), "keys/alipay_public_key.pem"), sign_type="RSA2", # RSA 或者 RSA2 debug=settings.ALI_PAY_DEBUG # 是否是沙箱环境, 默认False ) return ali_pay_obj
5.1 获取支付链接接口实现
代码如下: 以下为视图,写在 payment 应用的 views.py 文件里
import randomfrom urllib import parsefrom django.conf import settingsfrom django.db.transaction import atomicfrom django.http import JsonResponse, HttpResponsefrom django.utils import timezonefrom django.views.decorators.csrf import csrf_exemptfrom apps.payment.utils import my_ali_pay, is_app_payfrom utils.common import get_domain@csrf_exemptdef get_pay_url(request): """ 获取支付宝支付链接 :return: 支付链接ali_pay_url """ if request.method == "GET": order_id = request.GET.get('order_id', 0) # 前端传回的订单id money = request.GET.get('price') # 前端传回的金额数据 if not all([order_id, money]): return JsonResponse(dict(message="参数错误")) # 此处可增加根据订单id查询判断该订单是否存在相关业务逻辑 # 组织订单编号:当前时间字符串 + 6位随机数 ---> 20200808154711123456 out_trade_no = timezone.now().strftime('%Y%m%d%H%M%S') + ''.join(map(str, random.sample(range(0, 9), 6))) # 生成支付宝支付链接地址 domain_name = get_domain(request) notify_url = domain_name + '/payment/update_order/' ali_pay = my_ali_pay(notify_url) order_string = ali_pay.api_alipay_trade_page_pay( out_trade_no=out_trade_no, # 订单编号 total_amount=str(money), # 交易金额(单位: 元 保留俩位小数) 这里一般是从前端传过来的数据 subject=f"产品名称-{out_trade_no}", # 商品名称或产品名称 return_url=domain_name + "/payment/get_result/", # 支付成功后跳转的页面,App支付此参数无效,集成支付宝SDK自带跳转 ) # 拼接支付链接,注意:App支付不需要返回支付宝网关 ali_pay_url = order_string if is_app_pay(order_string) else settings.ALI_PAY_URL + "?" + order_string return JsonResponse(dict(ali_pay_url=ali_pay_url)) return JsonResponse(dict(ali_pay_url=""))
5.2 支付成功同步回调通知接口实现代码如下:
@csrf_exemptdef pay_result(request): """ 前端同步回调通知(支付完成后,前端url会接收支付宝支付完成后回传的form参数,将其全部传给该接口进行验签),参数示例如下: ?charset=utf-8&out_trade_no=20200808154711123456&method=alipay.trade.page.pay.return&total_amount=0.01&sign=FtDkDtsDE9dW3RB18BfiAeFqkSQAK......E1wE9tgsoUi50%2B0IH7w%3D%3D&trade_no=2020080622001460481436975535&auth_app_id=2016101000655892&version=1.0&app_id=2016101000655892&sign_type=RSA2&seller_id=2087811328364696×tamp=2020-08-06+12%3A44%3A44 :return: 根据业务需求自定义返回信息 """ if request.method == "GET": data = request.GET.dict() ali_pay = my_ali_pay() sign = data.pop('sign', None) success = ali_pay.verify(data, sign) print("同步回调验签状态: ", success) if success: # 此处写支付验签成功的相关业务逻辑 return JsonResponse(dict(message="支付成功")) return JsonResponse(dict(message="支付失败")) return JsonResponse(dict(message="支付失败"))
5.3 支付成功异步通知接口实现
代码如下:
@csrf_exempt@atomic()def update_order(request): """ 支付成功后,支付宝服务器异步通知回调(用于修改订单状态) :return: success or fail """ if request.method == "POST": body_str = request.body.decode('utf-8') data = parse.parse_qs(body_str) # data = parse.parse_qs(parse.unquote(body)) # 前端回传的url如果被编码,这里需要用unquote解码再转换成字典 data = {k: v[0] for k, v in data.items()} ali_pay = my_ali_pay() sign = data.pop('sign', None) success = ali_pay.verify(data, sign) # 返回验签结果, True/False print("异步通知验证状态: ", success) if success: # 此处写支付验签成功修改订单状态相关业务逻辑 return HttpResponse('success') # 返回success给支付宝服务器, 若支付宝收不到success字符会重复发送通知 return HttpResponse('fail') return HttpResponse('fail')
六、区别总结
是不是非常强大,需要项目源码获取加群“1136192749”
转载于网络,如有侵权联系删除
django手机访问_Django对接支付宝电脑网站、App支付步骤详解!这个框架是真强!...相关推荐
- 支付宝电脑网站版支付
电脑网站支付封装.以下是alipay.php的内容 <?php /** * @user : wy * @date : 2018年7月23日 * @desc : 支付宝支付对接 **/ names ...
- django手机访问_Django从入门到大作业:2-见网页
如果想了解django的基本安装,欢迎移步我的上一篇文章 koko可可:Django从入门到大作业:1-安装zhuanlan.zhihu.com 我入门django最头秃的地方,就是那一坨坨教程,始 ...
- django手机访问_Django管理系统后端开发1
后端开发准备工作 配置数据库 更改模板文件路径 配置静态文件路径 配置时区及其相关 配置static过滤器 模板标记 关于用户系统: 自定义User模型: 继承自django内置user系统 使用sh ...
- 锁定计算机在哪里设置方法,怎样锁定电脑?如何设置电脑锁屏【步骤详解】
我们在日常使用电脑的时候,特别是自己的私人电脑时,难免会遇到上个厕所接个水之类的杂事需要离开位置的,也许可能就一两分钟不到的时间,这么点的时间如果关机的话又觉得实在是太麻烦了,但是又不想让其它的人知道 ...
- 计算机性能检查方法,测试电脑性能的方法步骤详解
想知道自己电脑的运行性能吗?下面就让学习啦小编教大家如何测试电脑的性能吧. 测试电脑性能的方法 1.使用系统功能进行评测电脑的运行性能 这种方法就是通过windows自带的评测功能进行测试. 打开资源 ...
- uniapp引入支付宝原生扫码插件步骤详解
1.插件市场导入插件 支付宝原生扫码插件地址 点击购买(0元)云打包 选择需要导入的项目 选择安卓版本默认以uni-app应用标识 生成的包名 2.阿里云操作 开通阿里云 mPaaS 地址 创建一个应 ...
- Vivo手机实现录音转文字的方法,图文步骤详解,特别简单
最近学校举办了个文化节,新开了不少讲座,吸引同学们去听.但是老师说的太快,即使手上的笔不停歇,记下来的东西也不完整.这可让我头痛不已,最后在网上发现了这个方法特地来分享给大家. 手持vivo手机的小伙 ...
- 安全模式怎么更改计算机用户,电脑怎么关闭安全模式步骤详解
在安全模式下用户可以轻松地修复系统的一些错误,但是有时候不需要,反而会影响正常使用,怎么关闭呢,下面就由学习啦小编来给大家说说电脑怎么关闭安全模式的吧,欢迎大家前来阅读! 什么是安全模式 安全模式是W ...
- 怎么锁定电脑屏幕_怎么录制视频?在电脑上录制视频的步骤详解
原标题:怎么录制视频?在电脑上录制视频的步骤详解 作为重要的办公工具之一,电脑可不只是用来发发文件.看看文档,有时候我们还会对它进行录屏.特别是在短视频自媒体行业中,学会.掌握电脑录屏是基础技能,很多 ...
最新文章
- [云炬创业基础笔记] 第四章测试5
- amd linux 性能,10年内AMD处理器有多大改进?Linux下皓龙和霄龙每瓦性能对决
- [Gradle] 在 Eclipse 下利用 gradle 构建系统
- AT:AT命令控制上网 PDP
- ajax:dataType
- java attributes用法_C#中的Attributes的用法
- 微波烹调,营养损失多or少?
- 斗鱼直播实时数据爬取
- R:应用时间序列分析--基于R(1)第一章 时间序列分析简介
- Google Code checkout v8 方法
- 前端之图形学-1 数据可视化
- 为什么Java编程语言用一种咖啡名做名字
- 3d胆码计算机方法,3D选胆码方法公式汇总(近88期数据)
- BUUCTF--[GUET-CTF2019]number_game
- Jmeter java取样器实现
- python3输出中文乱码_解决Python3用PIL的ImageFont输出中文乱码的问题
- IMF Fintech负责人:金融科技监管体制设计的五原则
- 什么是核心文件,它们什么时候有用
- ⑤CSS浮动学成在线网实例
- ChatGPT 辅助专利写作