In Tornado, you can either create a new AsyncWeChatPay instance per request using async with or manage a global instance. The following example demonstrates the per-request pattern.
import tornado.web
import tornado.ioloop
import json
from wechatpayv3.async_ import AsyncWeChatPay, WeChatPayType
# Configuration (simplified for example)
WECHATPAY_CONFIG = {
'wechatpay_type': WeChatPayType.NATIVE,
'mchid': '1230000109',
'private_key': '...',
'cert_serial_no': '...',
'apiv3_key': '...',
'appid': '...',
'notify_url': '...',
'cert_dir': './cert'
}
class PaymentHandler(tornado.web.RequestHandler):
async def post(self):
async with AsyncWeChatPay(**WECHATPAY_CONFIG) as wxpay:
data = json.loads(self.request.body)
code, message = await wxpay.pay(
description=data['description'],
out_trade_no=data['out_trade_no'],
amount={'total': data['total']},
pay_type=WeChatPayType.NATIVE
)
self.write({"code": code, "message": message})
class QueryHandler(tornado.web.RequestHandler):
async def get(self, out_trade_no):
async with AsyncWeChatPay(**WECHATPAY_CONFIG) as wxpay:
code, message = await wxpay.query(out_trade_no=out_trade_no)
self.write({"code": code, "message": message})
def make_app():
return tornado.web.Application([
(r"/pay", PaymentHandler),
(r"/query/([^/]+)", QueryHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()