python实现支付宝当面付(扫码支付)功能


Posted in Python onMay 30, 2018

本文实例为大家分享了python实现支付宝当面付示的具体代码,供大家参考,具体内容如下

一、配置信息准备

登录蚂蚁金服开放平台:https://open.alipay.com/platform/home.htm

开发资料阅读:https://docs.open.alipay.com/194/106078

创建好应用,配置好密钥等信息后,就可以开发了。

 二、开发支付宝支付工具类

1:相关配置信息

# ========支付相关配置信息===========
 ALIPAY_INPUT_CHARSET = 'utf-8'
 # 商户ID,以2088开头的16位纯数字
 ALIPAY_PARTNER = '2088************'
 # 服务商支付宝账号
 ALIPAY_SELLER_EMAIL = ''
 # 支付结果回调地址
 ALIPAY_NOTIFY_URL = "商家后台回调接口地址"
 # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
 ALIPAY_TRANSPORT = 'https'
 #签名加密方式
 SIGN_TYPE = "SHA-1"
 #应用id
 APP_ID = '************'
 #下单api
 precreate_GATEWAY=https://openapi.alipay.com/gateway.do?

2.三个辅助函数:

#1:生成下单请求参数字符串
 def make_payment_request(self,params_dict):
  """
  构造支付请求参数
  :param params_dict:
  :return:
  """
  query_str = self.params_to_query(params_dict,) # 拼接参数字符串
  sign = self.make_sign(query_str) # 生成签名
  sign = urllib.quote(sign, safe='') #解决中文参数编码问题
  res = "%s&sign=%s" % (query_str, sign)
  return res
 def params_to_query(self,params):
  """
  生成需要签名的字符串
  :param params:
  :return:
  """
  """
  :param params:
  :return:
  """
  query = ""
  dict_items = {}
  for key, value in params.items():
   if isinstance(value, dict) == True:
    dict_items[key] = value
    params[key] = "%s"
  all_str = ''
  for key in sorted(params.keys()): #把参数按key值排序:这是支付宝下单请求的参数格式规定
   all_str = all_str + '%s=%s&' % (key, params[key])
  all_str = all_str.rstrip('&')
  biz_content_dict = dict_items['biz_content']
  content_str = ''
  for key in sorted(biz_content_dict.keys()):
   if isinstance(biz_content_dict[key], basestring) == True:
    content_str = content_str + '"%s":"%s",' % (key, biz_content_dict[key])
   else:
    content_str = content_str + '"%s":%s,' % (key, biz_content_dict[key])
  content_str = content_str.rstrip(',')
  content_str = '{' + content_str + '}'
  query = all_str % content_str
  return query
 def make_sign(self,para_str):
  """
  生成签名
  :param message:
  :return:
  """
  private_key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open(
   './路径/private_key.txt').read()) #把私钥存到一个文件里,加载出来【尝试过用rsa模块的方法加载私钥字符串,会报格式错误。查看源码得知,需要从文件流加载】
  import sys
  reload(sys)
  sys.setdefaultencoding('utf-8') #这三句:解决签名方法编码报错
  sign = base64.encodestring(OpenSSL.crypto.sign(private_key, para_str, 'sha256'))
  return sign

3.下单

#获取二维码url
 def getAlipayUrl(self,orderid,goodsName,goodsPrice,**kwargs):
  # 构建公共参数
  params = {}
  params['method'] = 'alipay.trade.precreate'
  params['version'] = '1.0'
  params['app_id'] = self.APP_ID
  params['timestamp'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
  params['charset'] = self.ALIPAY_INPUT_CHARSET
  params['notify_url'] = self.ALIPAY_NOTIFY_URL
  params['sign_type'] = 'RSA2'

  # 构建订单参数
  biz_content = {}
  biz_content['out_trade_no'] = orderid # 订单号
  biz_content['subject'] = goodsName #商品名
  biz_content['total_amount'] = goodsPrice # 价格
  params['biz_content'] = biz_content

  #由参数,生成签名,并且拼接得到下单参数字符串
  encode_params = self.make_payment_request(params)
  #下单
  url = self.precreate_GATEWAY + encode_params
  response = requests.get(url)
  #提取下单响应
  body = response.text
  #解析下单响应json字符串
  body_dict = json.loads(body)
  return_msg = body_dict['alipay_trade_precreate_response']['msg']
  if return_msg == "Success":
    code_url = body_dict['alipay_trade_precreate_response']['qr_code']
    return code_url
  else:
   print "fail msg=============" + return_msg

三、在controller端,接收客户端传过来的订单号、商品名、商品价格,调用支付工具类,得到二维码链接,根据链接生成二维码,传给客户端。

(此处同微信扫码支付模式二)

四、在controller端,编写支付结果回调函数

def aliQRCodeNotify(self, request, *args,**kwargs):
  out_trade_no = kwargs.get("out_trade_no")
  trade_status = kwargs.get("trade_status")
  
  #根据trade_status,判断交易结果:交易成功 or 交易关闭
  #根据out_trade_no 更新订单记录信息

五、客户端轮询

同微信扫码支付模式二客户端轮询思路。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python网络编程学习笔记(一)
Jun 09 Python
python 动态加载的实现方法
Dec 22 Python
解决python3爬虫无法显示中文的问题
Apr 12 Python
python 字符串和整数的转换方法
Jun 25 Python
linux环境下Django的安装配置详解
Jul 22 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
Pandas读取csv时如何设置列名
Jun 02 Python
Python实现数字的格式化输出
Aug 01 Python
使用Python解析Chrome浏览器书签的示例
Nov 13 Python
python操作toml文件的示例代码
Nov 27 Python
详解Django关于StreamingHttpResponse与FileResponse文件下载的最优方法
Jan 07 Python
详解Python3.6安装psutil模块和功能简介
May 30 #Python
python3之模块psutil系统性能信息使用
May 30 #Python
python批量导入数据进Elasticsearch的实例
May 30 #Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 #Python
django1.11.1 models 数据库同步方法
May 30 #Python
Python使用tkinter库实现文本显示用户输入功能示例
May 30 #Python
python自动化报告的输出用例详解
May 30 #Python
You might like
咖啡机如何保养和日常清洁?
2021/03/03 冲泡冲煮
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP中把数据库查询结果输出为json格式简单实例
2015/04/09 PHP
深入理解JavaScript定时机制
2010/10/29 Javascript
jquery+php随机生成红包金额数量代码分享
2015/08/27 Javascript
javascript随机抽取0-100之间不重复的10个数
2016/02/25 Javascript
使用jQuery处理AJAX请求的基础学习教程
2016/05/10 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
js实现无缝循环滚动
2020/06/23 Javascript
巧用Vue.js+Vuex制作专门收藏微信公众号的app
2016/11/03 Javascript
js实现文字向上轮播功能
2017/01/13 Javascript
Vue获取DOM元素样式和样式更改示例
2017/03/07 Javascript
nodejs个人博客开发第二步 入口文件
2017/04/12 NodeJs
ES6中字符串string常用的新增方法小结
2017/11/07 Javascript
微信小程序实现传参数的几种方法示例
2018/01/10 Javascript
Vuejs2 + Webpack框架里,模拟下载的实例讲解
2018/09/05 Javascript
Vue实现一个无限加载列表功能
2018/11/13 Javascript
JS实现字体背景跑马灯
2020/01/06 Javascript
vue+iview分页组件的封装
2020/11/17 Vue.js
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
Python使用logging结合decorator模式实现优化日志输出的方法
2016/04/16 Python
python实现excel读写数据
2021/03/02 Python
django一对多模型以及如何在前端实现详解
2019/07/24 Python
Python远程开发环境部署与调试过程图解
2019/12/09 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
美国学校校服,儿童和婴儿服装:Cookie’s Kids
2016/10/14 全球购物
菲律宾酒店预订网站:Hotels.com菲律宾
2017/07/12 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
乌克兰电子产品和家用电器购物网站:TOUCH
2019/08/09 全球购物
MYSQL基础面试题
2012/05/13 面试题
医院护理人员的自我评价分享
2013/10/04 职场文书
2014年元旦活动方案
2014/02/15 职场文书
青年文明号服务承诺
2014/03/31 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
不同品牌、不同型号对讲机如何互相通联
2022/02/18 无线电