微信現金紅包 python


微信現金紅包發送接口,好像沒法限制一個用戶一個活動只能領取一次紅包,在調用紅包接口上,自己做了限制

 

 

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';
View Code

 

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激活';
View Code

 

getRedpack,傳入openId,actId

def getRedpack(openId, actId):
    # 查尋actId有效性(現在限制條件為一個活動一個用戶只能領一個紅包,可能存在改actId突破這一限制)
    session = DBSession()
    act = session.query(RedpackAct).filter(RedpackAct.state == '1').filter(RedpackAct.act_id == actId).one()
    if not act:
        return redpack['actError']

    # 查詢是否達到限制
    records = session.query(RedpackRecord).filter(RedpackRecord.result == '1').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': '1',
        '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('0'+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)
View Code

 

通過用戶輸入消息觸發

# -*- 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM