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 29 Python
Python matplotlib画图实例之绘制拥有彩条的图表
Dec 28 Python
Python求解任意闭区间的所有素数
Jun 10 Python
详解python 注释、变量、类型
Aug 10 Python
详解Python下Flask-ApScheduler快速指南
Nov 04 Python
详解Python做一个名片管理系统
Mar 14 Python
python jenkins 打包构建代码的示例代码
Nov 29 Python
Python中six模块基础用法
Dec 08 Python
python同义词替换的实现(jieba分词)
Jan 21 Python
Python yield的用法实例分析
Mar 06 Python
详解python程序中的多任务
Sep 16 Python
python 用struct模块解决黏包问题
Nov 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
用 PHP5 轻松解析 XML
2006/12/04 PHP
php中AES加密解密的例子小结
2014/02/18 PHP
ThinkPHP无限级分类原理实现留言与回复功能实例
2014/10/31 PHP
通过jQuery源码学习javascript(三)
2012/12/27 Javascript
gridpanel动态加载数据的实例代码
2013/07/18 Javascript
javascript修改IMG标签的src问题
2014/03/28 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
jQuery实现简单日期格式化功能示例
2017/09/19 jQuery
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
Vue中 v-if/v-show/插值表达式导致闪现的原因及解决办法
2018/10/12 Javascript
Vue 前端实现登陆拦截及axios 拦截器的使用
2019/07/17 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
详解Webpack抽离第三方类库以及common解决方案
2020/03/30 Javascript
JS自定义右键菜单实现代码解析
2020/07/16 Javascript
vue 解决无法对未定义的值,空值或基元值设置反应属性报错问题
2020/07/31 Javascript
javascript实现随机抽奖功能
2020/12/30 Javascript
python内存管理分析
2015/04/08 Python
利用django-suit模板添加自定义的菜单、页面及设置访问权限
2018/07/13 Python
Python打包方法Pyinstaller的使用
2018/10/09 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
pandas的qcut()方法详解
2019/07/06 Python
详解python UDP 编程
2020/08/24 Python
python时间time模块处理大全
2020/10/25 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
IFCHIC台湾:欧美国际设计师品牌
2019/05/18 全球购物
VICHY薇姿俄罗斯官方网上商店:法国护肤品牌,火山温泉水
2019/11/22 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
技术经理的自我评价范文
2013/12/03 职场文书
九年级家长会邀请函
2014/01/15 职场文书
安全检查管理制度
2014/02/02 职场文书
益达广告词
2014/03/14 职场文书
服装采购员岗位职责
2014/03/15 职场文书
终止合同协议书
2014/04/17 职场文书
优秀毕业生求职信
2014/06/05 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书