面包含了unionid,这个unionid和通过APP内部绑定时获得unionid相同的时候就可以把APP用户和微信公众号的openid对应起来,之后我们就可以在APP申请提现,公众号发红包实现提现。
这部分的部分代码如下
class EventNotify(GreenResource):
isLeaf = True
def green_render_GET(self, request):
return arg_named(request, 'echostr')
def green_render_POST(self, request):
data = request.content.read()
root = ElementTree.fromstring(data)
response = {child.tag: child.text for child in root.getchildren()}
ret_xml = ''
event_type = response.get('Event')
openid = response.get('FromUserName')
if event_type == 'subscribe':
wx_user = WXClient.get_fuwuhao_user_info(opened) #获取用户信息
if not wx_user or wx_user.get('errcode'):
logging.info(wx_user)
return
unionid = wx_user.get('unionid')
nickname = wx_user.get('nickname')
fwh = PWWeixinFuwuhao.find_or_new(openid)
fwh.unionid = unionid
fwh.nickname = nickname
fwh.save()
bind_query = WeixinBind.query(master=True, fetchone=False, unionid=unionid) #使用psql获取app用户
bind_all = [WeixinBind(**each) for each in bind_query]
for bind_one in bind_all:
bind_one.openid = openid
bind_one.save()
ret_fmt = '''
%s
0
'''
ret_parm = (
response.get('FromUserName'),
response.get('ToUserName'),
int(time.time()),
config.WX_FWH_AUTO_MSG,
)
ret_xml = ret_fmt % ret_parm
elif event_type == 'unsubscribe':
result = WeixinFuwuhao.delete(openid=openid)
if not result:logging.info('fuwuhao unsubscribe is not exist %s' % (openid, ))
elif response.get('MsgId'):
ret_fmt = '''
%s
0
'''
ret_parm = (
response.get('FromUserName'),
response.get('ToUserName'),
int(time.time()),
config.WX_FWH_AUTO_MSG_2,
)
ret_xml = ret_fmt % ret_parm
return ret_xml
每个红包是 SENDING:发放中 SENT:已发放待领取 FAILED:发放失败 RECEIVED:已领取 REFUND:已退款 中的任何一种状态,只有 为FAILED RECEIVED REFUND状态的时候表示这个红包的生命周期已经结束
部分代码如下
class WeixinWithdrawOrder(object):
def __init__(self, withhdraw_id, openid, mch_billno, total_amount):
self.wid = withhdraw_id
self.pw_tid = 0
self.nonce_str = hashlib.md5('%s-%s' % (self.wid, time.time())).hexdigest()
self.mch_id = config.WX_FWH_MCH_ID
self.mch_billno = mch_billno
self.wxappid = config.WX_FWH_APPID
self.send_name = config.WX_WITHDRAW_SEND_NAME
self.re_openid = openid
self.total_amount = 100 if config.ENV_TEST else total_amount
self.total_num = 1
self.act_name = config.WX_WITHDRAW_ACT_NAME
self.wishing = config.WX_WITHDRAW_WISHING
self.client_ip = config.WX_PAY_IP_ADDR
self.remark = config.WX_WITHDRAW_REMARK
@classmethod
def sign(cls, data):
weixin_params = []
for key, value in data.iteritems():
if key not in ('wid', 'sign', 'pw_tid', ):
weixin_params.append([str(key), str(value)])
weixin_params.sort(key=lambda x:x[0])
sign_src = '%s&key=%s' % ('&'.join(['%s=%s'%(x[0], x[1]) for x in weixin_params]), config.WX_FWH_MCH_KEY)
logging.info(sign_src)
return hashlib.md5(sign_src).hexdigest().upper()
def order(self):
return '''
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
%s
''' % (
self.nonce_str, WeixinWithdrawOrder.sign(self.__dict__), self.mch_billno,
self.mch_id, self.wxappid, self.send_name,
self.re_openid.encode('utf8'), self.total_amount, self.total_num, self.wishing,
self.act_name, self.client_ip, self.remark,
)
def run_withdraw(self):
try:
order = self.order()
logging.info(order)
url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack'
cert = ('data/weixin/apiclient_cert.pem', 'data/weixin/apiclient_key.pem') #微信商户号的key,通过商户平台下载
data = requests.post(url, data=order, cert=cert).text #使用第三方库request
root = ElementTree.fromstring(data)
response = {child.tag : child.text for child in root.getchildren()}
logging.info(response)
if response.get('return_code') == 'SUCCESS':
if response.get('result_code') == 'SUCCESS':
return True, response.get('mch_billno'), response.get('err_code'), response.get('return_msg')
else:
logging.error(data)
return False, self.mch_billno, response.get('err_code'), response.get('return_msg')
else:
logging.error(data)
return False, self.mch_billno, response.get('err_code'), response.get('return_msg')
except:
traceback.print_exc()
return False, self.mch_billno, 'url not connect', 'url not connect'