Esempio n. 1
0
    def create(self, trade_type, body, total_fee, notify_url, client_ip=None, spbill_create_ip=None,
               openid=None, out_trade_no=None, detail=None, attach=None,
               fee_type='CNY', time_start=None, time_expire=None,
               goods_tag=None, product_id=None, device_info=None, limit_pay=None, scene_info=None):
        """
        统一下单接口

        :param trade_type: 交易类型,取值如下:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
        :param body: 商品描述
        :param total_fee: 总金额,单位分
        :param notify_url: 接收微信支付异步通知回调地址
        :param spbill_create_ip: 可选,APP和网页支付提交用户端IP,Native支付填调用微信支付API的机器IP
        :param openid: 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传
        :param out_trade_no: 可选,商户订单号,默认自动生成
        :param detail: 可选,商品详情
        :param attach: 可选,附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
        :param fee_type: 可选,符合ISO 4217标准的三位字母代码,默认人民币:CNY
        :param time_start: 可选,订单生成时间,默认为当前时间
        :param time_expire: 可选,订单失效时间,默认为订单生成时间后两小时
        :param goods_tag: 可选,商品标记,代金券或立减优惠功能的参数
        :param product_id: 可选,trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义
        :param device_info: 可选,终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
        :param limit_pay: 可选,指定支付方式,no_credit--指定不能使用信用卡支付
        :param scene_info: 可选,上报支付的场景信息
        :type scene_info: dict
        :return: 返回的结果数据
        """
        now = datetime.datetime.fromtimestamp(time.time(), tz=timezone('Asia/Shanghai'))
        hours_later = now + datetime.timedelta(hours=2)
        if time_start is None:
            time_start = now
        if time_expire is None:
            time_expire = hours_later
        if scene_info is not None:
            scene_info = json.dumps(scene_info, ensure_ascii=False)
        data = {
            'appid': self.appid,
            'device_info': device_info,
            'body': body,
            'detail': detail,
            'attach': attach,
            'out_trade_no': out_trade_no or self.out_trade_no,
            'fee_type': fee_type,
            'total_fee': total_fee,
            'spbill_create_ip': spbill_create_ip or client_ip or get_external_ip(),
            'time_start': time_start.strftime('%Y%m%d%H%M%S'),
            'time_expire': time_expire.strftime('%Y%m%d%H%M%S'),
            'goods_tag': goods_tag,
            'notify_url': notify_url,
            'trade_type': trade_type,
            'limit_pay': limit_pay,
            'product_id': product_id,
            'openid': openid,
            'scene_info': scene_info,
        }
        return self._post('/pay/unifiedorder', data=data)
Esempio n. 2
0
    def send(self,
             openid,
             total_amount,
             send_name,
             act_name,
             wishing,
             remark,
             total_num=1,
             client_ip=None,
             out_trade_no=None,
             scene_id=None,
             consume_mch_id=None,
             miniprogram=False,
             notify_way='JSAPI'):
        """
        发送现金红包

        :param openid: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额,单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param client_ip: 可选,调用接口的机器 IP 地址
        :param total_num: 可选,红包发放总人数,默认为 1
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param scene_id: 可选,发放红包使用场景,红包金额大于200或者小于1元时必传
        :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
        :param miniprogram: 是否发放小程序红包,默认为否
        :param notify_way: 通过 JSAPI 方式领取红包,小程序红包固定传 JSAPI
        :return: 返回的结果数据字典
        """
        data = {
            'wxappid': self.appid,
            're_openid': openid,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'client_ip': client_ip or get_external_ip(),
            'total_num': total_num,
            'mch_billno': out_trade_no or self.out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id,
        }
        if miniprogram:
            data['notify_way'] = notify_way
        return self._post('/mmpaymkttransfers/sendminiprogramhb'
                          if miniprogram else '/mmpaymkttransfers/sendredpack',
                          data=data)
Esempio n. 3
0
    def send_group(self,
                   openid,
                   total_amount,
                   send_name,
                   act_name,
                   wishing,
                   remark,
                   total_num,
                   client_ip=None,
                   amt_type="ALL_RAND",
                   out_trade_no=None,
                   scene_id=None,
                   consume_mch_id=None):
        """
        发送裂变红包

        :param openid: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额,单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param total_num: 红包发放总人数
        :param client_ip: 可选,调用接口的机器 IP 地址
        :param amt_type: 可选,红包金额设置方式
                         ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param scene_id: 可选,发放红包使用场景,红包金额大于200时必传
        :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
        :return: 返回的结果数据字典
        """
        data = {
            'wxappid': self.appid,
            're_openid': openid,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'total_num': total_num,
            'client_ip': client_ip or get_external_ip(),
            'amt_type': amt_type,
            'mch_billno': out_trade_no or self.out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id,
        }
        return self._post('/mmpaymkttransfers/sendgroupredpack', data=data)
Esempio n. 4
0
 def create(self,
            body,
            total_fee,
            auth_code,
            client_ip=None,
            spbill_create_ip=None,
            out_trade_no=None,
            detail=None,
            attach=None,
            fee_type='CNY',
            goods_tag=None,
            device_info=None,
            limit_pay=None):
     """
     刷卡支付接口
     :param device_info: 可选,终端设备号(商户自定义,如门店编号)
     :param body: 商品描述
     :param detail: 可选,商品详情
     :param attach: 可选,附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
     :param spbill_create_ip: 可选,APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
     :param out_trade_no: 可选,商户订单号,默认自动生成
     :param total_fee: 总金额,单位分
     :param fee_type: 可选,符合ISO 4217标准的三位字母代码,默认人民币:CNY
     :param goods_tag: 可选,商品标记,代金券或立减优惠功能的参数
     :param limit_pay: 可选,指定支付方式,no_credit--指定不能使用信用卡支付
     :param auth_code: 授权码,扫码支付授权码,设备读取用户微信中的条码或者二维码信息
     :return: 返回的结果数据
     """
     data = {
         'appid': self.appid,
         'device_info': device_info,
         'body': body,
         'detail': detail,
         'attach': attach,
         'out_trade_no': out_trade_no or self.out_trade_no,
         'total_fee': total_fee,
         'fee_type': fee_type,
         'spbill_create_ip': spbill_create_ip or client_ip
         or get_external_ip(),
         'goods_tag': goods_tag,
         'limit_pay': limit_pay,
         'auth_code': auth_code,
     }
     return self._post('/pay/micropay', data=data)
Esempio n. 5
0
    def send(self, openid, total_amount, send_name, act_name,
             wishing, remark, total_num=1, client_ip=None,
             out_trade_no=None, scene_id=None, consume_mch_id=None,
             miniprogram=False, notify_way='JSAPI'):
        """
        发送现金红包

        :param openid: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额,单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param client_ip: 可选,调用接口的机器 IP 地址
        :param total_num: 可选,红包发放总人数,默认为 1
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param scene_id: 可选,发放红包使用场景,红包金额大于200或者小于1元时必传
        :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
        :param miniprogram: 是否发放小程序红包,默认为否
        :param notify_way: 通过 JSAPI 方式领取红包,小程序红包固定传 JSAPI
        :return: 返回的结果数据字典
        """
        data = {
            'wxappid': self.appid,
            're_openid': openid,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'client_ip': client_ip or get_external_ip(),
            'total_num': total_num,
            'mch_billno': out_trade_no or self.out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id,
        }
        if miniprogram:
            data['notify_way'] = notify_way
        return self._post('/mmpaymkttransfers/sendminiprogramhb' if miniprogram else '/mmpaymkttransfers/sendredpack', data=data)
Esempio n. 6
0
    def transfer(self, openid, amount, desc, client_ip=None, spbill_create_ip=None,
                 check_name='OPTION_CHECK', real_name=None,
                 out_trade_no=None, device_info=None):
        """
        企业付款接口

        :param openid: 接受收红包的用户在公众号下的 openid
        :param amount: 付款金额,单位分
        :param desc: 付款说明
        :param spbill_create_ip: 可选,调用接口机器的 IP 地址
        :param check_name: 可选,校验用户姓名选项,
                           NO_CHECK:不校验真实姓名,
                           FORCE_CHECK:强校验真实姓名(未实名认证的用户会校验失败,无法转账),
                           OPTION_CHECK:针对已实名认证的用户才校验真实姓名(未实名认证用户不校验,可以转账成功),
                           默认为 OPTION_CHECK
        :param real_name: 可选,收款用户真实姓名,
                          如果check_name设置为FORCE_CHECK或OPTION_CHECK,则必填用户真实姓名
        :param out_trade_no: 可选,商户订单号,需保持唯一性,默认自动生成
        :param device_info: 可选,微信支付分配的终端设备号
        :return: 返回的结果信息
        """
        #
        # WeChatPayException: OrderedDict([(u'return_code', u'SUCCESS'), (u'return_msg', u'\u53c2\u6570\u9519\u8bef:\u63cf\u8ff0\u4fe1\u606f\u5927\u4e8e100Bytes'), (u'result_code', u'FAIL'), (u'err_code', u'PARAM_ERROR'), (u'err_code_des', u'\u53c2\u6570\u9519\u8bef:\u63cf\u8ff0\u4fe1\u606f\u5927\u4e8e100Bytes')])
        # 参数错误:描述信息大于100Bytes
        #
        data = {
            'mch_appid': self.appid,
            'mchid': self.mch_id,
            'device_info': device_info,
            'partner_trade_no': out_trade_no or self.out_trade_no,
            'openid': openid,
            'check_name': check_name,
            're_user_name': real_name,
            'amount': amount,
            'desc': desc if len(desc) <= 33 else desc[:32] + '...',
            'spbill_create_ip': spbill_create_ip or client_ip or get_external_ip(),
        }
        return self._post('/mmpaymkttransfers/promotion/transfers', data=data)
Esempio n. 7
0
    def send_group(self, openid, total_amount, send_name, act_name, wishing,
                   remark, total_num, client_ip=None, amt_type="ALL_RAND",
                   out_trade_no=None, scene_id=None, consume_mch_id=None):
        """
        发送裂变红包

        :param openid: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额,单位分
        :param send_name: 商户名称
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param total_num: 红包发放总人数
        :param client_ip: 可选,调用接口的机器 IP 地址
        :param amt_type: 可选,红包金额设置方式
                         ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param scene_id: 可选,发放红包使用场景,红包金额大于200时必传
        :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
        :return: 返回的结果数据字典
        """
        data = {
            'wxappid': self.appid,
            're_openid': openid,
            'total_amount': total_amount,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'total_num': total_num,
            'client_ip': client_ip or get_external_ip(),
            'amt_type': amt_type,
            'mch_billno': out_trade_no or self.out_trade_no,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id,
        }
        return self._post('/mmpaymkttransfers/sendgroupredpack', data=data)
Esempio n. 8
0
    def create(self,
               trade_type,
               body,
               total_fee,
               notify_url,
               client_ip=None,
               spbill_create_ip=None,
               openid=None,
               out_trade_no=None,
               detail=None,
               attach=None,
               fee_type='CNY',
               time_start=None,
               time_expire=None,
               goods_tag=None,
               product_id=None,
               device_info=None,
               limit_pay=None,
               scene_info=None):
        """
        统一下单接口

        :param trade_type: 交易类型,取值如下:JSAPI--公众号支付、NATIVE--原生扫码支付、APP--app支付
        :param body: 商品描述
        :param total_fee: 总金额,单位分
        :param notify_url: 接收微信支付异步通知回调地址
        :param spbill_create_ip: 可选,APP和网页支付提交用户端IP,Native支付填调用微信支付API的机器IP
        :param openid: 可选,用户在商户appid下的唯一标识。trade_type=JSAPI,此参数必传
        :param out_trade_no: 可选,商户订单号,默认自动生成
        :param detail: 可选,商品详情
        :param attach: 可选,附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
        :param fee_type: 可选,符合ISO 4217标准的三位字母代码,默认人民币:CNY
        :param time_start: 可选,订单生成时间,默认为当前时间
        :param time_expire: 可选,订单失效时间,默认为订单生成时间后两小时
        :param goods_tag: 可选,商品标记,代金券或立减优惠功能的参数
        :param product_id: 可选,trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义
        :param device_info: 可选,终端设备号(门店号或收银设备ID),注意:PC网页或公众号内支付请传"WEB"
        :param limit_pay: 可选,指定支付方式,no_credit--指定不能使用信用卡支付
        :param scene_info: 可选,上报支付的场景信息
        :type scene_info: dict
        :return: 返回的结果数据
        """
        now = datetime.datetime.fromtimestamp(time.time(),
                                              tz=timezone('Asia/Shanghai'))
        hours_later = now + datetime.timedelta(hours=2)
        if time_start is None:
            time_start = now
        if time_expire is None:
            time_expire = hours_later
        if scene_info is not None:
            scene_info = json.dumps(scene_info, ensure_ascii=False)
        data = {
            'appid': self.appid,
            'device_info': device_info,
            'body': body,
            'detail': detail,
            'attach': attach,
            'out_trade_no': out_trade_no or self.out_trade_no,
            'fee_type': fee_type,
            'total_fee': total_fee,
            'spbill_create_ip': spbill_create_ip or client_ip
            or get_external_ip(),
            'time_start': time_start.strftime('%Y%m%d%H%M%S'),
            'time_expire': time_expire.strftime('%Y%m%d%H%M%S'),
            'goods_tag': goods_tag,
            'notify_url': notify_url,
            'trade_type': trade_type,
            'limit_pay': limit_pay,
            'product_id': product_id,
            'openid': openid,
            'scene_info': scene_info,
        }
        return self._post('/pay/unifiedorder', data=data)