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删除列表中重复记录的方法
Apr 28 Python
Django实现自定义404,500页面教程
Mar 26 Python
Django实现全文检索的方法(支持中文)
May 14 Python
Python读取excel指定列生成指定sql脚本的方法
Nov 28 Python
使用Python实现微信提醒备忘录功能
Dec 04 Python
对python for 文件指定行读写操作详解
Dec 29 Python
django中瀑布流写法实例代码
Oct 14 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
Dec 30 Python
python如何把字符串类型list转换成list
Feb 18 Python
Python基于Dlib的人脸识别系统的实现
Feb 26 Python
Python drop方法删除列之inplace参数实例
Jun 27 Python
Python利用matplotlib绘制折线图的新手教程
Nov 05 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
PHP中删除变量时unset()和null的区别分析
2011/01/27 PHP
DOM和XMLHttpRequest对象的属性和方法整理
2012/01/04 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
基于JS2Image实现圣诞树代码
2015/12/24 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
基于Vue的文字跑马灯组件(npm 组件包)
2017/05/24 Javascript
javascript  删除select中的所有option的实例
2017/09/17 Javascript
JS中移除非数字最多保留一位小数
2018/05/09 Javascript
解决Vue axios post请求,后台获取不到数据的问题方法
2018/08/11 Javascript
js模拟F11页面全屏显示
2019/09/17 Javascript
vue实现简单图片上传
2020/06/30 Javascript
Python selenium 三种等待方式详解(必会)
2016/09/15 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
python jieba分词并统计词频后输出结果到Excel和txt文档方法
2018/02/11 Python
使用python实现BLAST
2018/02/12 Python
Python实现爬虫抓取与读写、追加到excel文件操作示例
2018/06/27 Python
Python实现繁?转为简体的方法示例
2018/12/18 Python
python 创建一维的0向量实例
2019/12/02 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
HTML5 新旧语法标记对我们有什么好处
2012/12/13 HTML / CSS
美国著名的婴儿学步鞋老品牌:Robeez
2016/08/20 全球购物
SQL Server 2000数据库的文件有哪些,分别进行描述。
2015/11/09 面试题
主管职责范文
2013/11/09 职场文书
体育教师自我鉴定
2014/02/12 职场文书
模特职业生涯规划范文
2014/02/26 职场文书
运动会稿件100字
2014/09/24 职场文书
校长师德表现自我评价
2015/03/04 职场文书
矛盾论读书笔记
2015/06/29 职场文书
董事长开业致辞
2015/07/29 职场文书
人身损害赔偿协议书
2016/03/22 职场文书
导游词之崇武古城
2019/10/07 职场文书
python编程项目中线上问题排查与解决
2021/11/01 Python
SQLServer中exists和except用法介绍
2021/12/04 SQL Server
CSS的calc函数用法小结
2022/06/25 HTML / CSS