redpack.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. import random
  4. import datetime
  5. from library.wechatpy.pay.utils import get_external_ip
  6. from library.wechatpy.pay.base import BaseWeChatPayAPI
  7. class WeChatRedpack(BaseWeChatPayAPI):
  8. def send(self, user_id, total_amount, send_name, act_name,
  9. wishing, remark, total_num=1, client_ip=None,
  10. out_trade_no=None, scene_id=None, consume_mch_id=None):
  11. """
  12. 发送现金红包
  13. :param user_id: 接收红包的用户在公众号下的 openid
  14. :param total_amount: 红包金额,单位分
  15. :param send_name: 商户名称
  16. :param act_name: 活动名称
  17. :param wishing: 红包祝福语
  18. :param remark: 备注
  19. :param client_ip: 可选,调用接口的机器 IP 地址
  20. :param total_num: 可选,红包发放总人数,默认为 1
  21. :param out_trade_no: 可选,商户订单号,默认会自动生成
  22. :param scene_id: 可选,发放红包使用场景,红包金额大于200时必传
  23. :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
  24. :return: 返回的结果数据字典
  25. """
  26. if not out_trade_no:
  27. now = datetime.datetime.now()
  28. out_trade_no = '{0}{1}{2}'.format(
  29. self.mch_id,
  30. now.strftime('%Y%m%d%H%M%S'),
  31. random.randint(1000, 10000)
  32. )
  33. data = {
  34. 'wxappid': self.appid,
  35. 're_openid': user_id,
  36. 'total_amount': total_amount,
  37. 'send_name': send_name,
  38. 'act_name': act_name,
  39. 'wishing': wishing,
  40. 'remark': remark,
  41. 'client_ip': client_ip or get_external_ip(),
  42. 'total_num': total_num,
  43. 'mch_billno': out_trade_no,
  44. 'scene_id': scene_id,
  45. 'risk_info': None,
  46. 'consume_mch_id': consume_mch_id
  47. }
  48. return self._post('mmpaymkttransfers/sendredpack', data=data)
  49. def send_group(self, user_id, total_amount, send_name, act_name, wishing,
  50. remark, total_num, client_ip=None, amt_type="ALL_RAND",
  51. out_trade_no=None, scene_id=None, consume_mch_id=None):
  52. """
  53. 发送裂变红包
  54. :param user_id: 接收红包的用户在公众号下的 openid
  55. :param total_amount: 红包金额,单位分
  56. :param send_name: 商户名称
  57. :param act_name: 活动名称
  58. :param wishing: 红包祝福语
  59. :param remark: 备注
  60. :param total_num: 红包发放总人数
  61. :param client_ip: 可选,调用接口的机器 IP 地址
  62. :param amt_type: 可选,红包金额设置方式
  63. ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
  64. :param out_trade_no: 可选,商户订单号,默认会自动生成
  65. :param scene_id: 可选,发放红包使用场景,红包金额大于200时必传
  66. :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
  67. :return: 返回的结果数据字典
  68. """
  69. if not out_trade_no:
  70. now = datetime.datetime.now()
  71. out_trade_no = '{0}{1}{2}'.format(
  72. self._client.mch_id,
  73. now.strftime('%Y%m%d%H%M%S'),
  74. random.randint(1000, 10000)
  75. )
  76. data = {
  77. 'wxappid': self.appid,
  78. 're_openid': user_id,
  79. 'total_amount': total_amount,
  80. 'send_name': send_name,
  81. 'act_name': act_name,
  82. 'wishing': wishing,
  83. 'remark': remark,
  84. 'total_num': total_num,
  85. 'client_ip': client_ip or get_external_ip(),
  86. 'amt_type': amt_type,
  87. 'mch_billno': out_trade_no,
  88. 'scene_id': scene_id,
  89. 'risk_info': None,
  90. 'consume_mch_id': consume_mch_id
  91. }
  92. return self._post('mmpaymkttransfers/sendgroupredpack', data=data)
  93. def query(self, out_trade_no, bill_type='MCHT'):
  94. """
  95. 查询红包发放记录
  96. :param out_trade_no: 商户订单号
  97. :param bill_type: 可选,订单类型,目前固定为 MCHT
  98. :return: 返回的红包发放记录信息
  99. """
  100. data = {
  101. 'mch_billno': out_trade_no,
  102. 'bill_type': bill_type,
  103. 'appid': self.appid,
  104. }
  105. return self._post('mmpaymkttransfers/gethbinfo', data=data)