# -*- coding: utf-8 -*-

import tornado.httpserver

import tornado.ioloop

import tornado.options

import tornado.web

import pymysql

import json

import xmltodict

from hashlib import md5

from tornado.options import define, options####################微信支付异步回调消息########################

WEIXIN_KEY = '8mdRLb1yeesYssfasdfsadfassdaV'

def generate_sign(params):

"""

生成md5签名的参数

"""

if 'sign' in params:

params.pop('sign')

src = '&'.join(['%s=%s' % (k, v) for k, v in sorted(params.items())]) + '&key=%s' % WEIXIN_KEY

return md5(src.encode('utf-8')).hexdigest().upper()

def validate_sign(resp_dict):

"""

验证微信返回的签名

"""

if 'sign' not in resp_dict:

return False

wx_sign = resp_dict['sign']

sign = generate_sign(resp_dict)

if sign == wx_sign:

return True

return False

def handle_wx_response_xml(params):

"""

处理微信支付返回的xml格式数据

"""

try:

resp_dict = xmltodict.parse(params)['xml']

if not resp_dict or len(resp_dict) < 1:

print('resp_dict is zero+++++++++')

return None

return_code = resp_dict.get('return_code')

if return_code == 'SUCCESS':  # 仅仅判断通信标识成功,非交易标识成功,交易需判断result_code

if validate_sign(resp_dict):

print('验证成功!!!')

return resp_dict

except Exception as e:

print(e)

return None

return None

def weixinpay_call_back(request):

"""

微信支付回调

:param request: 回调参数

:return:

"""

args = str(request.body,'utf-8')

if args is None:

return None

print(args)

# 验证平台签名

resp_dict = handle_wx_response_xml(args)

if resp_dict is None:

print('签名验证失败!!!')

return None

return resp_dict

def weixinpay_response_xml(params):

"""

生成交易成功返回信息

"""

def generate_response_data(resp_dict):

"""

字典转xml

"""

return xmltodict.unparse({'xml': resp_dict}, pretty=True, full_document=False).encode('utf-8')

return_info = {

'return_code': params,

'return_msg': 'OK'

}

return generate_response_data(return_info)

def weixinpay_sucess_db(dicts):

"""微信支付成功后数据库日志操作"""

if isinstance(dicts,dict):

trade_status = dicts['result_code']  # 业务结果  SUCCESS/FAIL

trade_no = dicts['out_trade_no']  # 商户订单号

if trade_status == "SUCCESS":

appid = dicts['appid']  # 应用ID

bank_type = dicts['bank_type']  # 付款银行

cash_fee = dicts['cash_fee']  # 现金支付金额(分)

device_info = dicts['device_info']  # 微信支付分配的终端设备号

fee_type = dicts['fee_type']  # 货币种类

gmt_create = dicts['time_end']  # 支付完成时间

total_amount = int(dicts['total_fee']) / 100  # 总金额(单位由分转元)

trade_type = dicts['trade_type']  # 交易类型

out_trade_no = dicts['transaction_id']  # 微信支付订单号

seller_id = dicts['mch_id']  # 商户号

openid = dicts['openid']  # 用户标识

update_sql = ''' update weixin_trade set trade_status='{trade_status}', appid='{appid}', ''' + \

'''seller_id='{seller_id}', openid='{openid}', total_amount='{total_amount}',''' +  \

'''out_trade_no='{out_trade_no}', gmt_create='{gmt_create}', '''+ \

'''device_info='{device_info}', trade_type='{trade_type}', bank_type='{bank_type}', ''' + \

'''fee_type='{fee_type}', cash_fee='{cash_fee}' where trade_no='{trade_no}' '''

update_sql = update_sql.format(

trade_status=trade_status,

appid=appid,

seller_id=seller_id,

openid=openid,

total_amount=total_amount,

out_trade_no=out_trade_no,

gmt_create=gmt_create,

device_info=device_info,

trade_type=trade_type,

bank_type=bank_type,

fee_type=fee_type,

cash_fee=cash_fee,

trade_no=trade_no)

print(update_sql)

#写数据库

def weixin_rollback(request):

"""

【API】: 微信宝支付结果回调接口,供微信服务端调用

"""

try:

# 支付异步回调验证

data = weixinpay_call_back(request)

if data:

print('微信支付返回====={0}'.format(data))

res = "success"

trade_status = data['result_code']  # 业务结果  SUCCESS/FAIL

out_trade_no = data['out_trade_no']  # 商户订单号

if trade_status == "SUCCESS":

weixinpay_sucess_db(data)

device_info = data['device_info']  # 微信支付分配的终端设备号

# 如果状态是支付成功则发放物品

hall = KBEngine.globalData["Halls"]

if hall:

player_data = hall.GetPlayerByDbId(int(device_info))

if player_data:

player = player_data.entityCall

if player:

print('微信发放奖品到客户端,订单号======%s' % out_trade_no)

player.GmBkCmd({'cmd':'PayReward','Order_id':out_trade_no})

else:

print('找不到玩家++++++++')

else:

res = "error: pay failed! "

status = 0

err_code = data['err_code']  # 错误代码

err_code_des = data['err_code_des']  # 错误代码描述

else:

res = "error: verify failed! "

except Exception as e:

print(e)

res='err:exception==='

finally:

return weixinpay_response_xml(res)

class WeChatPayNotify(tornado.web.RequestHandler):

"""微信支付回调"""

def post(self):

"""

【API】: 微信宝支付结果回调接口,供微信服务端调用

"""

self.write(weixin_rollback(self.request))

class WeChatPay(tornado.web.RequestHandler):

def post(self):

to_client={}

for k,v in self.request.arguments.items():

to_client[k] = str(v[0],encoding='utf-8')

pid = to_client.pop('pid')

if isinstance(pid,str):

pid = int(pid)

self.write('')

python wechatpay微信支付回调_python服务器 实现app微信支付:支付异步通知相关推荐

  1. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  2. ios浏览器微信支付回调页面_iOS集成H5微信支付实现跳转与回调的解决方案

    前言 最近有个需求,不能在iOS客户端内集成支付宝和微信的App支付SDK(为了防苹果审核检测SDK),因此使用H5支付,虽然微信和支付宝的H5支付文档都说不要在App内使用H5支付而是使用App支付 ...

  3. python post方法登录微信公众号_python实现简单的微信公众号后台编写

    利用python的werobot库实现对微信公众号后台的开发: 实现的简单功能: 1.订阅后的回复 2.机器人聊天回复 3.指定关键字回复音乐,文字,链接 3.图片返回原图 注意点: 1.该后台基于微 ...

  4. python公众号文章爬虫_Python爬虫爬取微信公众号历史文章全部链接

    因为朋友问我能不能找一下一个微信公众号的全部历史文章的链接,我就帮他弄了一下,通过百度和谷歌发现现在大家爬微信公众号的思路基本都是下面两种: 通过搜狗搜索微信公众号然后拿到链接 通过fiddler检测 ...

  5. python通过微信聊天记录分析_Python利用itchat对微信中好友数据实现简单分析的方法...

    前言 最近在一个微信公众号上看到一个调用微信 API 可以对微信好友进行简单数据分析的一个包 itchat 感觉挺好用的,就简单尝试了一下. 库文档说明链接在这: itchat 安装 在终端中输入以下 ...

  6. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  7. 微信群的深度服务器,深度工作|微信群运营过程中常见的细节问题及解决方案...

    文/曲娅菲 据统计94%的手机都有微信应用,微信的用户数量已突破8亿.我们每个人的手机基本都有百八十个好友,那么微信群最少也有几个,移动互联时代,我们可以足不出户的通过一部手机就把生意做到国外.那么掌 ...

  8. 我的微信怎么没有定位服务器,我的微信不见了怎么办?微信不见了的解决方法...

    一位网友在网上发帖求助:我的微信不见了怎么办?不少网友都给该网友出谋划策.不过,网友并没有详细描述微信不见了,是微信图标在手机不显示,还是微信图标在QQ上不显示,所以,小编只能按照这2个情况来给她提供 ...

  9. 支付宝接口(扫码支付的原理)使用文档说明 支付宝异步通知(notify_url)与return_url.

    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类.  A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式  B页面跳 ...

最新文章

  1. 1.NET 4.6.1向.NET core 2.0项目迁移(HelloWorld篇)
  2. 查看操作系统版本linux_查看电脑操作系统版本(适用于Mac OS)
  3. Scrapy框架的学习(11.scrapy框架中的下载中间件的使用(DownloaderMiddlewares))
  4. cmd上写的java简单代码_用cmd编辑一个超级简单的小游戏,求代码
  5. 国内是否可以安装alexa_Alexa可以听到您无法听到的命令,哪些黑客可以利用
  6. linux 虚拟机挂载本地,CentOS 在VMWare中挂载本地yum源
  7. Jquery的ajax提交成功后刷新页面
  8. mysqlbackup 重建带有gtid特性的slave
  9. XML (4) XSL教程
  10. 瑞芯微(RKDocs)平台技术开发资料汇总(rk3188,rk3066,RK3128,rk3288)
  11. 使用Ghidra对WhatsApp VOIP Stack 溢出漏洞的补丁对比分析
  12. 人人都是产品经理(善用用户反馈——浅谈用户反馈数据的处理)
  13. 手机浏览器简单搜索ua标识
  14. Fans没信心,回家继续修行
  15. linux下mtr命令,linux-常用命令-mtr(示例代码)
  16. 为什么需要TCP加速?TCP怎么加速呢?
  17. java 根据用户名生成头像。
  18. 黑马程序员——阿龙的学习历程——Java初见
  19. JAVA常用关键字和英文缩写
  20. 灰色的心情,贴几首我们一起唱的歌吧

热门文章

  1. c primer plus--运算符、表达式和语句(第5章)--习题
  2. 【紫书】(UVa12096) The SetStack Computer
  3. 【DevOps】做个愉快的DevOps之XenServer自动化管理(1)
  4. livevent的几个问题
  5. 2009年4月21日 博客更新公告,敬请关注!
  6. DELL服务器常见报错信息
  7. Linux性能调优集合
  8. Excel比较工具SpreadSheet
  9. java 匿名类实现6_java匿名内部类,以及实现Comparato和Comparable接口实现对对象的排序...
  10. Ubuntu14.04安装中文输入法以及解决Gedit中文乱码问题