一、前言

本文主要针对 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&timestamp=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支付步骤详解!这个框架是真强!...相关推荐

  1. 支付宝电脑网站版支付

    电脑网站支付封装.以下是alipay.php的内容 <?php /** * @user : wy * @date : 2018年7月23日 * @desc : 支付宝支付对接 **/ names ...

  2. django手机访问_Django从入门到大作业:2-见网页

    如果想了解django的基本安装,欢迎移步我的上一篇文章 koko可可:Django从入门到大作业:1-安装​zhuanlan.zhihu.com 我入门django最头秃的地方,就是那一坨坨教程,始 ...

  3. django手机访问_Django管理系统后端开发1

    后端开发准备工作 配置数据库 更改模板文件路径 配置静态文件路径 配置时区及其相关 配置static过滤器 模板标记 关于用户系统: 自定义User模型: 继承自django内置user系统 使用sh ...

  4. 锁定计算机在哪里设置方法,怎样锁定电脑?如何设置电脑锁屏【步骤详解】

    我们在日常使用电脑的时候,特别是自己的私人电脑时,难免会遇到上个厕所接个水之类的杂事需要离开位置的,也许可能就一两分钟不到的时间,这么点的时间如果关机的话又觉得实在是太麻烦了,但是又不想让其它的人知道 ...

  5. 计算机性能检查方法,测试电脑性能的方法步骤详解

    想知道自己电脑的运行性能吗?下面就让学习啦小编教大家如何测试电脑的性能吧. 测试电脑性能的方法 1.使用系统功能进行评测电脑的运行性能 这种方法就是通过windows自带的评测功能进行测试. 打开资源 ...

  6. uniapp引入支付宝原生扫码插件步骤详解

    1.插件市场导入插件 支付宝原生扫码插件地址 点击购买(0元)云打包 选择需要导入的项目 选择安卓版本默认以uni-app应用标识 生成的包名 2.阿里云操作 开通阿里云 mPaaS 地址 创建一个应 ...

  7. Vivo手机实现录音转文字的方法,图文步骤详解,特别简单

    最近学校举办了个文化节,新开了不少讲座,吸引同学们去听.但是老师说的太快,即使手上的笔不停歇,记下来的东西也不完整.这可让我头痛不已,最后在网上发现了这个方法特地来分享给大家. 手持vivo手机的小伙 ...

  8. 安全模式怎么更改计算机用户,电脑怎么关闭安全模式步骤详解

    在安全模式下用户可以轻松地修复系统的一些错误,但是有时候不需要,反而会影响正常使用,怎么关闭呢,下面就由学习啦小编来给大家说说电脑怎么关闭安全模式的吧,欢迎大家前来阅读! 什么是安全模式 安全模式是W ...

  9. 怎么锁定电脑屏幕_怎么录制视频?在电脑上录制视频的步骤详解

    原标题:怎么录制视频?在电脑上录制视频的步骤详解 作为重要的办公工具之一,电脑可不只是用来发发文件.看看文档,有时候我们还会对它进行录屏.特别是在短视频自媒体行业中,学会.掌握电脑录屏是基础技能,很多 ...

最新文章

  1. [云炬创业基础笔记] 第四章测试5
  2. amd linux 性能,10年内AMD处理器有多大改进?Linux下皓龙和霄龙每瓦性能对决
  3. [Gradle] 在 Eclipse 下利用 gradle 构建系统
  4. AT:AT命令控制上网 PDP
  5. ajax:dataType
  6. java attributes用法_C#中的Attributes的用法
  7. 微波烹调,营养损失多or少?
  8. 斗鱼直播实时数据爬取
  9. R:应用时间序列分析--基于R(1)第一章 时间序列分析简介
  10. Google Code checkout v8 方法
  11. 前端之图形学-1 数据可视化
  12. 为什么Java编程语言用一种咖啡名做名字
  13. 3d胆码计算机方法,3D选胆码方法公式汇总(近88期数据)
  14. BUUCTF--[GUET-CTF2019]number_game
  15. Jmeter java取样器实现
  16. python3输出中文乱码_解决Python3用PIL的ImageFont输出中文乱码的问题
  17. IMF Fintech负责人:金融科技监管体制设计的五原则
  18. 什么是核心文件,它们什么时候有用
  19. ⑤CSS浮动学成在线网实例
  20. ChatGPT 辅助专利写作

热门文章

  1. linux centos7 安装最新版git 教程
  2. Silverlight C# 游戏开发:游戏循环体的五种设计方式
  3. 使用YCSB检测MongoDB
  4. 3大常见光伏加盟骗局大起底
  5. ADVA收购Overture 扩张NFV产品线
  6. SQL   PL/SQL   SQL*PLUS三者的区别
  7. Linux流量监控工具 (实时)-适用于centos 当然也兼容RHEL
  8. shell脚本调试中打开set选项
  9. SQL查询效率:100w数据查询只需要1秒钟
  10. 网站down掉后,自动发信的shell