微信现金红包发送接口,好像没法限制一个用户一个活动只能领取一次红包,在调用红包接口上,自己做了限制

REDPACK_RECORD

建表sql

-- Create table
create table REDPACK_RECORD
(
open_id VARCHAR2(32),
act_id VARCHAR2(32),
send_time TIMESTAMP(6) WITH LOCAL TIME ZONE default sysdate,
mch_billno VARCHAR2(28),
result CHAR(1),
record_id VARCHAR2(36) default sys_guid()
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column REDPACK_RECORD.open_id
is '用户id';
comment on column REDPACK_RECORD.act_id
is '活动id';
comment on column REDPACK_RECORD.send_time
is '发送时间';
comment on column REDPACK_RECORD.mch_billno
is '商户订单号';
comment on column REDPACK_RECORD.result
is '发送结果:0失败 1成功';
comment on column REDPACK_RECORD.record_id
is '记录id';

REDPACK_ACTIVATE

建表sql

-- Create table
create table REDPACK_ACTIVATE
(
act_id VARCHAR2(32) default sys_guid(),
act_name VARCHAR2(30),
total_amount VARCHAR2(10),
wishing VARCHAR2(50),
remark VARCHAR2(100),
secen_id VARCHAR2(32),
state CHAR(1)
)
tablespace SYSTEM
pctfree 10
pctused 40
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Add comments to the columns
comment on column REDPACK_ACTIVATE.act_id
is '活动id';
comment on column REDPACK_ACTIVATE.act_name
is '活动名称';
comment on column REDPACK_ACTIVATE.total_amount
is '付款金额,单位分';
comment on column REDPACK_ACTIVATE.wishing
is '红包祝福语';
comment on column REDPACK_ACTIVATE.remark
is '备注';
comment on column REDPACK_ACTIVATE.secen_id
is '发放红包使用场景,红包金额大于200或者小于1元时必传 PRODUCT_1:商品促销 PRODUCT_2:抽奖 PRODUCT_3:虚拟物品兑奖 PRODUCT_4:企业内部福利 PRODUCT_5:渠道分润 PRODUCT_6:保险回馈 PRODUCT_7:彩票派奖 PRODUCT_8:税务刮奖';
comment on column REDPACK_ACTIVATE.state
is '活动状态: 0未激活 1激活';

getRedpack,传入openId,actId

def getRedpack(openId, actId):
# 查寻actId有效性(现在限制条件为一个活动一个用户只能领一个红包,可能存在改actId突破这一限制)
session = DBSession()
act = session.query(RedpackAct).filter(RedpackAct.state == '').filter(RedpackAct.act_id == actId).one()
if not act:
return redpack['actError'] # 查询是否达到限制
records = session.query(RedpackRecord).filter(RedpackRecord.result == '').filter(
RedpackRecord.act_id == actId).filter(RedpackRecord.open_id == openId).all()
if len(records) != 0:
return redpack['repeat'] # 构造红包数据
mch_id = 'mch_id '
props = {
'nonce_str': getRangeStr(32),
'mch_id': mch_id,
'mch_billno': mch_id + get_time() + getRangeStr(4), # 28=10+14+4
'wxappid': 'wxappid',
're_openid': openId,
'total_amount': act.total_amount,
'total_num': '',
'key': 'key',
'send_name': 'send_name',
'wishing': act.wishing,
'act_name': act.act_name,
'remark': act.remark,
'client_ip': 'act_name'
}
props['sign'] = signFun(props)
data = json_xml(props).encode('utf8') # 发送红包
cert = p12_to_pem('证书名')
res = requests.post('https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack', data=data, cert=cert)
print res.text # 获取发送结果,记录到数据库
result = xml_json(res.text)['xml']
if result['return_code'] == 'SUCCESS':
success = xml_json(res.text)['xml']['result_code'] == 'SUCCESS'
sqltext = "insert into redpack_record(open_id,act_id,mch_billno,result) values('%s','%s','%s','%s')"%(openId, actId, props['mch_billno'], 1 if success else 0)
session.execute(sqltext)
session.commit() return result['return_msg'].encode('utf8')

相关函数

redpack = {
'success': '发放红包成功',
'error': '出现问题,请重试',
'repeat': '你已经领取过该红包,请勿重复领取',
'actError': '活动无效'
}
activate = {
'问卷调查红包': '761E52960C497C77E05012AC8E4E0A32'#数据库活动表的id,输入问卷调查找到此活动
} def m_dict(obj, props=[]):
result = {}
temp = obj.__dict__ if hasattr(obj, '__dict__') else obj
target = temp if len(props)==0 else props
for i in target:
if not i.startswith('_'):
try:
result[i] = getattr(obj, i) if hasattr(obj, i) else obj[i]
except:
pass
return result def getRangeStr(len):
result = ''
chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
for i in range(len):
result += choice(chars)
return result def get_time(formatStr='%Y%m%d%H%M%S'):
return time.strftime(formatStr, time.localtime(time.time())) def formateLen(instr, width):
instr = str(instr)
if len(instr)<width:
return formateLen(''+instr, width)
else:
return instr def MD5(instr):
return hashlib.md5(instr).hexdigest() def signFun(props):
tempStr = ''
key = props.pop('key')
props = sorted(props.items())
for prop in props:
tempStr += (prop[0]+'='+prop[1]+'&')
return MD5(tempStr+'key='+key).upper() def json_xml(jsonstr):
if 'xml' not in jsonstr:
jsonstr = {'xml': jsonstr} jsonstr = json.dumps(jsonstr).decode('utf8')
jsonstr = json.loads(jsonstr)
return xmltodict.unparse(jsonstr) def xml_json(xmlstr):
return xmltodict.parse(xmlstr)
# return json.dumps(xmlparse,indent=1) def p12_to_pem(certname, pwd='商户号'):
pem_name = certname + ".pem"
f_pem = open(pem_name, 'wb')
p12file = certname + ".p12"
p12 = OpenSSL.crypto.load_pkcs12(open(p12file, 'rb').read(), pwd)
f_pem.write(OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()))
f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()))
ca = p12.get_ca_certificates()
if ca is not None:
for cert in ca:
f_pem.write(OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, cert))
f_pem.close()
return pem_name def getUUID(namespace='redpack', name='recode'):
return uuid.uuid5(namespace, name)

通过用户输入消息触发

# -*- coding: utf-8 -*-
# filename: handle.py import reply
import receive
import web
from util import * class Handle(object):
def POST(self):
try:
webData = web.data()
recMsg = receive.parse_xml(webData) if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
toUser = recMsg.FromUserName
fromUser = recMsg.ToUserName
content = recMsg.Content if content in activate:
content = getRedpack(toUser, activate[content])
replyMsg = reply.TextMsg(toUser, fromUser, content)
return replyMsg.send() return "success"
except Exception, Argment:
return Argment

微信现金红包 python的更多相关文章

  1. C#开发微信门户及应用(33)--微信现金红包的封装及使用

    我在上篇随笔<C#开发微信门户及应用(32)--微信支付接入和API封装使用>介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行 ...

  2. Zabbix 微信报警Python版(带监控项波动图片)

    #!/usr/bin/python # -*- coding: UTF- -*- #Function: 微信报警python版(带波动图) #Environment: python import ur ...

  3. 微信开发python+django两个月的成功经历,django是个好框架!

        时间:大三 上学期没有用微信内置浏览器而纯对话开发,坑了自己好一下. 下学期选错bottle框架,以为轻量好,谁知开发中什么都自己来很痛苦. 选对了框架django,终于在大三最后的个把月里写 ...

  4. 微信支付 python版

    需求: 微信打开商品列表页面-> 点击商品后直接显示付款页面-> 点击付款调用微信支付 说明 微信支付需要你申请了公众号(appid, key - 用于签名), 商户号(mch_id, A ...

  5. zabbix之微信告警(python版):微信个人报警,微信企业号告警脚本

    微信个人告警脚本 微信个人告警:使用个人微信,发送到微信群组,微信好友 两个脚本执行: 1)能连接网络2)先执行server.py,扫描登录微信,登录之后没有报错,打开新终端查看端口是否起来了3)在z ...

  6. 搜狗微信采集 —— python爬虫系列一

    前言:一觉睡醒,发现原有的搜狗微信爬虫失效了,网上查找一翻发现10月29日搜狗微信改版了,无法通过搜索公众号名字获取对应文章了,不过通过搜索主题获取对应文章还是可以的,问题不大,开搞! 目的:获取搜狗 ...

  7. 微信公众平台开发(免费云BAE+高效优雅的Python+网站开放的API)

    虽然校园App是个我认为的绝对的好主意,但最近有个也不错的营销+开发的模式出现:微信平台+固定域名服务器. 微信公众平台的运行模式不外两个: 一.机器人模式或称转发模式,将说话内容转发到服务器上完成, ...

  8. 【itchat】用Python玩耍微信

    [itchat] itchat是个基于网页版微信的python微信API.功能目前做到基本可以满足正常的消息收发,信息的获取等等.不过对于红包之类网页版微信不支持的功能,这个模块自然也就无法支持了. ...

  9. python发送微信

    申请企业微信 使用python发送信息到企业微信,同时支持python2与python3环境,需要先申请一个企业微信,然后创建应用,获取以下三个信息 企业IP.Agentid.Secret 网信为创建 ...

随机推荐

  1. Oracle10.2.0.1以及其他版本升级Oracle10.2.0.5的简单步骤

    Oracle没有发布 完整版的 Oracle 10.2.0.5 的安装包,只能是通过安装完10.2.0.4 之后再升级10.2.0.5 这一点挺坑的. 建安记录一下步骤. 1. 挂载Oracle10. ...

  2. hive视图

    简化复杂的查询 员工好.姓名.月薪.年薪.在一个emp表中; 部门名称在dept的表中;并未年薪起了一个名字annlsal 查询视图 视图是一个虚表,是不存数据的

  3. 关于python性能相关测试cProfile库

    http://blog.csdn.net/gzlaiyonghao/article/details/1483728 收藏一个大神对这个问题的介绍. 我就不多做污染了.另外还有两个 增强库可以针对cPr ...

  4. Maven Archetype简介以及搭建

    为什么会写这篇文章,因为公司先在构建项目骨架都是用的 maven archetype ,身为一个上进的渣渣猿,自己还是有必要了解下这个东西的. Archetype介绍 Archetype 是一个 Ma ...

  5. MySQL在Read Uncommitted级别下写操作加X锁

    很多文章认为MySQL在读未提交(Read Uncommitted)的隔离级别下,写操作是不加锁的,然而实际上并不是,在RU级别下,写操作加有X锁. 实践出真知 以前,我也认为RU隔离级别下,写操作不 ...

  6. python之工作举例:通过复制NC文件来造数据

    # 通过对NC文件复制来造数据 import os, shutil # 遍历的根目录 root_dir = "D:\\test_data\\DISASTER\\" # 获取NC文件 ...

  7. Scout YYF I POJ - 3744(概率dp + 矩阵快速幂)

    题意: 一条路上有n个地雷,你从1开始走,单位时间内有p的概率走一步,1-p的概率走两步,问安全通过这条路的概率 解析: 很容易想到 dp[i] = p * dp[i-1] + (1 - p) * d ...

  8. 【BZOJ4671】异或图(斯特林反演)

    [BZOJ4671]异或图(斯特林反演) 题面 BZOJ Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出 ...

  9. 自学Aruba3.1-Aruba配置架构-WLAN配置架构

    点击返回:自学Aruba之路 自学Aruba3.1-Aruba配置架构- WLAN配置架构  WLAN配置架构 1. AP group : Aruba无线控制器通过AP Group来构建无线网络配置参 ...

  10. luogu4182 [USACO18JAN] Lifeguards P (单调队列优化dp)

    显然可以先把被覆盖掉的区间去掉,然后排个序,左.右端点就都是单调的 设f[i][j]表示前i个区间中删掉j个,而且钦定i不能删的最大覆盖长度 (如果不钦定,就要有一个删掉的状态,那我无法确定前面的到底 ...