微信批量发红包需要使用微信支付的接口。根据微信开发文档,只有商户号是企业类型才能调用接口实现发送现金红包(个人微信账号无法使用)。这里提供代码及伪代码示例共参考。
伪代码:
python复制代码# 首先登录自己的公众号或小程序管理平台获取到商户号,还需要在商户平台上进行相关配置和审核,然后才能调用该API# 先从商户平台获取指定数量的收款人的OpenID列表以及随机金额序列# 然后构造XML格式的请求报文,同时需要对报文进行签名# 使用requests库调用微信支付接口提交请求并获取响应结果# 解析响应报文以获得调用状态及错误信息# 对调用结果进行相应处理,如打印日志、发邮件等def send_hongbao(openids, moneys): # TODO: 构造请求报文并签名 request_xml = build_request(openids, moneys) sign = get_sign(request_xml) # TODO: 发送请求并解析响应报文 response_xml = requests.post(url, data=request_xml + "&sign=" + sign).text data = parse_response(response_xml) # TODO: 处理响应数据并返回结果 if data['return_code'] == 'SUCCESS' and data['result_code'] == 'SUCCESS': return True else: return False# 示例调用openids = ["openid1", "openid2", "openid3"]moneys = [100, 200, 300]result = send_hongbao(openids, moneys)print(result)
其示例代码如下:
import random
import time
import hashlib
import requests
import xmltodict
class WechatRedPacket():
def __init__(self, appid, mch_id, wx_key, cert_path):
self.appid = appid
self.mch_id = mch_id
self.wx_key = wx_key
self.cert_path = cert_path
self.url = ".mch.weixin.qq.com//∧∧∧"
def send_packet(self, total_amount, num, wishing, activity_name, openid_list):
nonce_str = str(int(time.time())) + str(random.randint(0, 10000)).zfill(4)
mch_billno = self.mch_id + time.strftime('%Y%m%d', time.localtime()) + str(random.randint(0, 10000)).zfill(4)
data_dict = {
'nonce_str': nonce_str,
'mch_billno': mch_billno,
'mch_id': self.mch_id,
'wxappid': self.appid,
'send_name': 'Test',
'total_amount': int(total_amount * 100),
'total_num': num,
'wishing': wishing,
'client_ip': '127.0.0.1',
'act_name': activity_name,
'remark': '测试备注',
're_openid': None,
'scene_id': None
}
if num != 1:
assert len(openid_list) > 1, "openid列表不能为空"
assert num == len(openid_list), "红包数量必须与openid列表数量相等"
openid_str = '|'.join(openid_list)
data_dict['amt_type'] = 'ALL_RAND'
data_dict['openid'] = None
data_dict['sign_type'] = 'MD5'
data_dict['max_value'] = int(total_amount * 100 / num * 2)
data_dict['min_value'] = int(total_amount * 100 / num / 2)
data_dict['total_amount'] = int(total_amount * 100)
else:
assert len(openid_list) == 1, "红包数量为 1 时,openid列表长度应为"
openid_str = openid_list[0]
data_dict['send_type'] = 'NORMAL'
data_dict['openid'] = openid_str
data_dict['re_openid'] = openid_str
raw = ''
for k in sorted(data_dict):
raw += '{}={}&'.format(k, data_dict[k])
raw += 'key=' + self.wx_key
sign = hashlib.md5(raw.encode('utf-8')).hexdigest().upper()
data_xml = '<xml>{}</xml>'.format(''.join(['<{0}><![CDATA[{1}]]></{0}>'.format(k, v) for k, v in data_dict.items()]))
data_xml = data_xml.replace('<re_openid></re_openid>', '<_openid>{}</re_openid>'.format(openid_str))
headers = {'Content-Type': 'application/xml'}
response = requests.post(self.url, data=data_xml.encode('utf-8'), headers=headers, cert=(self.cert_path + '/apiclient_cert.pem', selflient_key.pem'))
if response.status_code == 200 and '<return_code><![CDATA[SUCCESS]]></return_code>' in response.text:
result_dict = xmltodict.parse(response.content)['xml']
return result_dict
else:
return None
示例代码中 send_packet() 方法接受红包金额、红包数量、红包祝福语、活动名称以及收款人(OpenID列表)等参数,使用 Python 发送微信支付的请求后获取回复结果,最后返回发送结果。只需修改其中的 appid、mch_id、wx_key 及 cert_path 参数为自己的商户号、应用ID、API 密钥和证书路径等即可。