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之从格式化表达式到方法
Sep 28 Python
Python构造函数及解构函数介绍
Feb 26 Python
详细解读Python中的__init__()方法
May 02 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
May 04 Python
python实现机器学习之元线性回归
Sep 06 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
Python爬虫获取页面所有URL链接过程详解
Jun 04 Python
virtualenv介绍及简明教程
Jun 23 Python
Python数据可视化实现多种图例代码详解
Jul 14 Python
pytorch使用horovod多gpu训练的实现
Sep 09 Python
flask项目集成swagger的方法
Dec 09 Python
用python制作个视频下载器
Feb 01 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
smarty内置函数capture用法分析
2015/01/22 PHP
老版本PHP转义Json里的特殊字符的函数
2015/06/08 PHP
PHP lcfirst()函数定义与用法
2019/03/08 PHP
js实现文章文字大小字号功能完整实例
2014/11/01 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
Bootstrap每天必学之级联下拉菜单
2016/03/27 Javascript
原生js封装的一些jquery方法(详解)
2016/09/20 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
ES6中class类用法实例浅析
2017/04/06 Javascript
React服务端渲染(总结)
2017/07/01 Javascript
详解使用vuex进行菜单管理
2017/12/21 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
vue跳转同一个组件,参数不同,页面接收值只接收一次的解决方法
2019/11/05 Javascript
解决vue安装less报错Failed to compile with 1 errors的问题
2020/10/22 Javascript
[00:12]2018DOTA2亚洲邀请赛 sylar表现SOLO技艺
2018/04/06 DOTA
[50:59]2018DOTA2亚洲邀请赛 4.7 总决赛 LGD vs Mineski第四场
2018/04/10 DOTA
Django自定义用户登录认证示例代码
2019/06/30 Python
python数据库编程 ODBC方式实现通讯录
2020/03/27 Python
Python Django form 组件动态从数据库取choices数据实例
2020/05/19 Python
python爬虫请求头设置代码
2020/07/28 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
35款精致的 CSS3 和 HTML5 网页模板 推荐
2012/08/03 HTML / CSS
CSS3 实现的火焰动画
2020/12/07 HTML / CSS
普天C++笔试题
2016/03/20 面试题
高级工程师岗位职责
2013/12/15 职场文书
幼儿园实习生辞职信
2014/01/20 职场文书
幼儿园老师辞职信
2014/01/20 职场文书
年会搞笑主持词
2014/03/27 职场文书
《大作家的小老师》教学反思
2014/04/16 职场文书
学校法制宣传月活动总结
2014/07/03 职场文书
就业意向书
2014/07/29 职场文书
四风问题查摆材料
2014/08/25 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
nginx结合openssl实现https的方法
2021/07/25 Servers