文章目录

  • 一、支付宝支付介绍
  • 二、支付宝支付使用
  • 三、支付宝支付二次封装

一、支付宝支付介绍

线上支付有:

  1. 支付宝支付
  2. 微信支付
  3. 云闪付

支付流程:
1.用户把钱打到第三方平台(支付宝,微信)的商家账户中
2.商家提现提出来(第三方平台收手续费)

注意:必须是商户(企业),有营业执照才能申请支付宝,微信的支付接入


二、支付宝支付使用

第一步:找到支付宝沙箱

第二步:画框处后续需要用到

第三步:创建公钥私钥
安装支付宝开放平台开发助手:点击进入支付宝文档下载

生成公钥私钥

第四步:将生成的公钥配置到支付宝沙箱中


示例:
直接使用python-alipay-sdk调用支付宝
首先安装

pip install python-alipay-sdk
from alipay import AliPayapp_private_key_string = open("./pri").read() #在pri文件下加入私钥
alipay_public_key_string = open("./pub").read() #在pub文件下加入支付宝公钥
alipay = AliPay(appid="xxxxxxxxxxxx", # 此处填写支付宝公开平台的appidapp_notify_url=None,  # 默认回调 urlapp_private_key_string=app_private_key_string,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=alipay_public_key_string,sign_type="RSA2",  # RSA 或者 RSA2debug=True,  # 默认 False
)
# 电脑网站支付,需要跳转到:https://openapi.alipay.com/gateway.do? + order_string
res=alipay.api_alipay_trade_page_pay(out_trade_no='asdsad623232332', # 订单号,自设total_amount=float(999),  # 只有生成支付宝链接时,不能用Decimalsubject='充气球', # 订单内容,自设return_url='http://127.0.0.1:8000', # 回调地址notify_url='http://127.0.0.1:8000',
)gataway = 'https://openapi.alipaydev.com/gateway.do?' # 支付宝网关地址
print(gataway+res) # 此处是生成的支付链接

三、支付宝支付二次封装

创建一个包

ipay  #包名-pem  #存放公钥私钥alipay_public_key.pemapp_private_key.pem__init__.py pay.py   #生成一个对象settings.py #配置文件

公钥私钥必须按照格式来存放
pem文件下的app_private_key.pem存放私钥

-----BEGIN RSA PRIVATE KEY-----
此处为私钥内容
-----END RSA PRIVATE KEY-----

pem文件下的alipay_public_key.pem存放支付宝公钥

-----BEGIN PUBLIC KEY-----
此处为公钥内容
-----END PUBLIC KEY-----

init.py

from .pay import alipay
from .settings import GATEWAY

pay.py

from alipay import AliPayfrom . import settingsalipay = AliPay(appid=settings.APP_ID,app_notify_url=None,  # 默认回调 urlapp_private_key_string=settings.APP_PRIVATE_KEY_STRING,# 支付宝的公钥,验证支付宝回传消息使用,不是你自己的公钥,alipay_public_key_string=settings.ALIPAY_PUBLIC_KEY_STRING,sign_type=settings.SIGN,  # RSA 或者 RSA2debug=settings.DEBUG,  # 默认 False
)

settings.py

import os# 应用私钥
APP_PRIVATE_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'app_private_key.pem')).read()# 支付宝公钥
ALIPAY_PUBLIC_KEY_STRING = open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'pem', 'alipay_public_key.pem')).read()# 应用ID
APP_ID = 'xxxxxxxx'# 加密方式
SIGN = 'RSA2'# 是否是支付宝测试环境(沙箱环境),如果采用真是支付宝环境,配置False
DEBUG = True# 支付网关
GATEWAY = 'https://openapi.alipaydev.com/gateway.do?' if DEBUG else 'https://openapi.alipay.com/gateway.do?'

调用二次封装支付的sdk:

dev.py(开发配置文件相当于setting.py)

# 上线后必须换成公网地址
# 后台基URL
HOST_URL = 'http://127.0.0.1:8000'
# 前台基URL
LUFFY_URL = 'http://127.0.0.1:8080'
# 支付宝同步异步回调接口配置
# 后台异步回调接口--->post回调,调后台
NOTIFY_URL = HOST_URL + "/api/v1/order/success/"  #后台的用来修改订单状态
# 前台同步回调接口,没有 / 结尾  ----》 get回调调前台
RETURN_URL = LUFFY_URL + "/pay/success"   # 前端需要有个页面显示
    def _get_pay_url(self, out_trade_no, total_amount, subject):# 生成pay_url,放入到context中res = alipay.api_alipay_trade_page_pay(out_trade_no=out_trade_no,total_amount=float(total_amount),  # 只有生成支付宝链接时,不能用Decimalsubject=subject, #订单内容return_url=settings.RETURN_URL, #支付宝回调post请求地址,就是用户支付后支付宝调用该结果告知订单已完成notify_url=settings.NOTIFY_URL, # 前端页面get请求地址,就是订单完成后,返回给用户的页面)pay_url = GATEWAY + res #网管拼接api_alipay_trade_page_pay的返回值才是支付链接self.context['pay_url'] = pay_url

前端回调页面是自设的
例如:

<template><div class="pay-success"><!--如果是单独的页面,就没必要展示导航栏(带有登录的用户)--><Header/><div class="main"><div class="title"><div class="success-tips"><p class="tips">您已成功购买 1 门课程!</p></div></div><div class="order-info"><p class="info"><b>订单号:</b><span>{{ result.out_trade_no }}</span></p><p class="info"><b>交易号:</b><span>{{ result.trade_no }}</span></p><p class="info"><b>付款时间:</b><span><span>{{ result.timestamp }}</span></span></p></div><div class="study"><span>立即学习</span></div></div></div>
</template><script>
import Header from "@/components/Header"export default {name: "Success",data() {return {result: {},};},created() {// url后拼接的参数:?及后面的所有参数 => ?a=1&b=2// console.log(location.search);// 解析支付宝回调的url参数console.log(location.search)let params = location.search.substring(1);  // 去除? => a=1&b=2let items = params.length ? params.split('&') : [];  // ['a=1', 'b=2']//逐个将每一项添加到args对象中for (let i = 0; i < items.length; i++) {  // 第一次循环a=1,第二次b=2let k_v = items[i].split('=');  // ['a', '1']//解码操作,因为查询字符串经过编码的if (k_v.length >= 2) {// url编码反解let k = decodeURIComponent(k_v[0]);this.result[k] = decodeURIComponent(k_v[1]);// 没有url编码反解// this.result[k_v[0]] = k_v[1];}}// 解析后的结果console.log(this.result);// 把地址栏上面的支付结果,再get请求转发给后端this.$axios({url: this.$settings.base_url + '/order/success/' + location.search,method: 'get',}).then(response => {console.log(response.data);if (response.data.code != 100) {alert(response.data.msg)}}).catch(() => {console.log('支付结果同步失败');})},components: {Header,}
}
</script><style scoped>
.main {padding: 60px 0;margin: 0 auto;width: 1200px;background: #fff;
}.main .title {display: flex;-ms-flex-align: center;align-items: center;padding: 25px 40px;border-bottom: 1px solid #f2f2f2;
}.main .title .success-tips {box-sizing: border-box;
}.title img {vertical-align: middle;width: 60px;height: 60px;margin-right: 40px;
}.title .success-tips {box-sizing: border-box;
}.title .tips {font-size: 26px;color: #000;
}.info span {color: #ec6730;
}.order-info {padding: 25px 48px;padding-bottom: 15px;border-bottom: 1px solid #f2f2f2;
}.order-info p {display: -ms-flexbox;display: flex;margin-bottom: 10px;font-size: 16px;
}.order-info p b {font-weight: 400;color: #9d9d9d;white-space: nowrap;
}.study {padding: 25px 40px;
}.study span {display: block;width: 140px;height: 42px;text-align: center;line-height: 42px;cursor: pointer;background: #ffc210;border-radius: 6px;font-size: 16px;color: #fff;
}
</style>

支付宝回调函数post和前端的反馈结果get

class PaySuccessView(ViewSet):authentication_classes = []permission_classes = []# 给前端做二次校验用def list(self, resquest):out_trade_no = resquest.query_params.get('out_trade_no')order = Order.objects.filter(out_trade_no=out_trade_no, order_status=1).first()if order:return Luffy_Response(200, '支付成功')else:return Luffy_Response(code=101, msg='暂时还没收到你的付款')# 给支付宝用的--->必须把项目部署在公网上才能回调成功def create(self, request):try:# post提交的数据(支付宝回调格式:urlencoded,QueryDic)## from django.http.request import QueryDict## print(type(request.data))# 把QueryDic对象转成真正的dict对象,就可以修改,popresult_data = request.data.dict()#我们的订单号out_trade_no = result_data.get('out_trade_no')#支付宝的签名signature = result_data.pop('sign')from libs.ipay import alipayresult = alipay.verify(result_data, signature)if result and result_data["trade_status"] in ("TRADE_SUCCESS", "TRADE_FINISHED"):# 完成订单修改:订单状态、流水号、支付时间Order.objects.filter(out_trade_no=out_trade_no).update(order_status=1)# 完成日志记录logger.warning('%s订单支付成功' % out_trade_no)# 支付宝要的格式就这个格式return Response('success')else:logger.error('%s订单支付失败' % out_trade_no)except:passreturn Response('failed')

支付宝sdk——python-alipay-sdk相关推荐

  1. python - alipay sdk 使用 及 注意点

    一. 在 点击跳转 这里拿到自己的 appid  和  支付宝公钥 ,     如果想要得到 支付宝的公钥 就需要获取 应用的公钥,具体获取方式 : 获取应用公钥和私钥 应用私钥和支付宝公钥 获取 和 ...

  2. Xamarin只言片语3——Xamarin.Android下支付宝(Alipay SDK)使用

    开发环境Visual Studio 2015,Xamarin 3.11.1537,Xamarin Android5.1.7.12 下载支付宝移动支付的SDK(http://doc.open.alipa ...

  3. alipay-sdk-python支付宝开放平台官方SDK使用详解

    一.环境搭建 ​​​​​​1. 安装支付宝开放平台官方SDK(最好在python的虚拟环境中安装 pip install alipay-sdk-python 二.功能解析 1.构建支付宝客户端:功能是 ...

  4. 【iOS】程序内跳转到支付宝转账(非SDK实现支付)及相关监听

    转载请注明出处 今天遇到了一个有意思的问题,就是支付调用支付宝,但是后台返的链接类似这种(https://qr.alipay.com/bax05299bjty5xvbkjii8018).这种链接直接打 ...

  5. Spring Boot集成支付宝(最新版SDK)—— 手机支付

    前言 前些日子写了一篇关于H5网页集成支付宝的文章: Spring Boot集成支付宝(最新版SDK)-- H5/网页支付 当时写了好久,往那一坐就是俩小时,写完直接就发布了,发布之后才感觉少点啥-- ...

  6. 支付宝网银直连SDK封装记上|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环

    " Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列" 程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点! 关注公众号,进入学海无涯,高人带路模式!!微 ...

  7. spring boot 微信 支付宝 集成 开源jm-pay sdk

    微信和支付宝集成封装的sdk 需要自己拉代码到本地进行打包 https://github.com/sunuping/jm-pay.git pom.xml <!--支付宝--><dep ...

  8. 支付宝网银直连SDK封装记下|强力去掉支付宝网银直连DEMO中56个坏味道 余下6个坏味道 Sonarqube无视阿里支付宝光环

    " Yuema约吗?一起学技术,一起成长!学海无涯 高人带路系列" 程序的世界,就是有坑的地方!分享踩坑的心得与体验!每天分享一点点! 关注公众号,进入学海无涯,高人带路模式!!支 ...

  9. python的sdk是什么意思_python sdk

    关于 python sdk的搜索结果 问题 命令行工具 CLI:用户指南:阿里云 Python SDK 列表 阿里云各产品对应的 Python SDK 如下所示. 产品Python SDK账号登录al ...

  10. 调用阿里云语音合成Python版SDK

    一.阿里云介绍   阿里云创立于2009年,是全球领先的云计算及人工智能科技公司,致力于以在线公共服务的方式,提供安全.可靠的计算和数据处理能力,让计算和人工智能成为普惠科技.阿里云服务着制造.金融. ...

最新文章

  1. 卡莱特led显示屏调试教程_恒彩光电重庆P3 LED显示屏项目顺利完工
  2. 慎用uniapp开发商业级应用
  3. Java实现算法导论中线性规划单纯形算法
  4. 论面向组合子程序设计方法 之 南无阿弥陀佛
  5. malloc/free和new/delete的区别
  6. Use a layout_width of 0dip instead of fill_parent for better performance
  7. 单例设计模式和多线程
  8. python中print的用法_python中print用法
  9. 二、规则组织数学模型的建立
  10. mysql时间正确时区错误_在app中的日期时间但在mysql [时区]错误
  11. std在汇编语言是什么指令_汇编语言程序指令整理
  12. Akka和Actor一起工作的消息《ten》译
  13. C++二叉链表遍历理论基础
  14. 办公室常用计算机常识,这10个办公必备的电脑小技巧,让你事半功倍
  15. win7 C盘满如何清理
  16. kong_团结的面Kong:国际妇女节
  17. 关于Bootstrap 中使用Tooltips不生效的问题
  18. Android 查看内存使用工具 (procstats)
  19. RestAssured接口测试框架
  20. C++语言程序设计第五版 - 郑莉(第四章课后习题)

热门文章

  1. 2019-1-25 画图:画风玫瑰图
  2. 用python爬虫写一个属于自己的彩虹屁生成器!
  3. 详解线上线下收单业务(1)
  4. 六十秒倒计时android,如何用jquery实现六十秒倒计时
  5. VUE项目配置UEditor集成秀米编辑器
  6. python对数据求均值_利用Python读取json数据并求数据平均值
  7. 弹出启动windows安全中心服务器,win10系统启用windows安全中心服务器提示关闭的操作方法...
  8. php 月份查询生日_PHP判断日期(生日)格式是否正确合法的方法
  9. MySQL-查询本周过生日的人-终极答案
  10. minHJ函数matlab黄金分割法,黄金分割法求极小值