Repository navigation
Expand file tree
/
Copy pathcontroller.py
More file actions
71 lines (59 loc) · 3.09 KB
/
Copy pathcontroller.py
File metadata and controls
71 lines (59 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# -*- coding:utf-8 -*-
#Author:叶国坚
import os
import datetime
import time
from cStringIO import StringIO
import base64
import json
from datetime import datetime
from decimal import Decimal
import socket
import qrcode
from io import BytesIO
from PayToolUtil import *
class MainController(Object):
#获取微信二维码
def getWeChatQRCode(self, **kwargs):
order_id = kwargs.get('order_id') #获取客户端生成的订单号
goodsName = kwargs.get('goodsName') #获取商品信息
goodsPrice = int(float(kwargs.get('goodsPrice')) * 100) #获取价格,单位是分,需要是整数
toolUtil = PayToolUtil()
code_url=toolUtil.getPayUrl(order_id,goodsName,goodsPrice) #调用统一下单方法,获得支付订单的url链接
if code_url:
res_info = code_url
# 如果成功获得支付链接,则写入一条订单记录
#todo:自己的后台逻辑
else:
res_info = "二维码失效" #获取url失败,则二维码信息为失效
#根据res_info生成二维码,使用qrcode模块
qr = qrcode.QRCode(
version=1,
error_correction=qrcode.constants.ERROR_CORRECT_H,
box_size=10,
border=1
)
qr.add_data(res_info) #二维码所含信息
img = qr.make_image() #生成二维码图片
byte_io = BytesIO()
img.save(byte_io, 'PNG') #存入字节流
byte_io.seek(0)
return http.send_file(byte_io, mimetype='image/png') #把字节流返回给客户端,解析得到二维码
#微信支付回调
def weChatQRCodeNotify(self, request, *args,**kwargs):
order_result_xml = http.request.httprequest.stream.read() #从请求流提取数据
doc = xmltodict.parse(order_result_xml) #解析得到的xml字符串,转为dict
out_trade_no = doc['xml']['out_trade_no'] #提取返回数据中的订单号
#todo:提取签名、支付金额等,验证签名是否正确、金额是否正确
#思路:在前面获取二维码时,生成了一条订单记录,订单应该保存下订单号、签名、金额等信息。在这里,根据回传的订单号查询数据库,得到对应的签名、金额进行验证即可
#最后,别忘了应答微信支付平台,防止重复发送数据
return '''
<xml>
<return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
</xml>
'''
#支付结果轮询:客户端根据订单号轮询订单模型记录,状态为 支付成功 则返回出货信号,客户端验证信号为出货,则停止轮询,并控制出货
def weChatQRCodeHadPay(self, **kwargs):
order_id = kwargs.get('order_id') #获取订单号
#todo:根据订单号查询对应的订单记录状态,返回支付结果