示例#1
0
    def create(self, trade_type, body, total_fee, notify_url, client_ip=None,
               user_id=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):
        """
        统一下单接口

        :param trade_type: 交易类型,取值如下:JSAPI,NATIVE,APP,WAP
        :param body: 商品描述
        :param total_fee: 总金额,单位分
        :param notify_url: 接收微信支付异步通知回调地址
        :param client_ip: 可选,APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
        :param user_id: 可选,用户在商户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--指定不能使用信用卡支付
        :return: 返回的结果数据
        """
        now = datetime.fromtimestamp(time.time(), tz=timezone('Asia/Shanghai'))
        hours_later = now + timedelta(hours=2)
        if time_start is None:
            time_start = now
        if time_expire is None:
            time_expire = hours_later
        if not out_trade_no:
            out_trade_no = '{0}{1}{2}'.format(
                self.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'appid': self.appid,
            'device_info': device_info,
            'body': body,
            'detail': detail,
            'attach': attach,
            'out_trade_no': out_trade_no,
            'fee_type': fee_type,
            'total_fee': total_fee,
            'spbill_create_ip': 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': user_id,
        }
        return self._post('pay/unifiedorder', data=data)
示例#2
0
    def send_group(
        self,
        user_id,
        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 user_id: 接收红包的用户在公众号下的 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: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = "{0}{1}{2}".format(
                self._client.mch_id,
                now.strftime("%Y%m%d%H%M%S"),
                random.randint(1000, 10000),
            )
        data = {
            "wxappid": self.appid,
            "re_openid": user_id,
            "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,
            "scene_id": scene_id,
            "risk_info": None,
            "consume_mch_id": consume_mch_id,
        }
        return self._post("mmpaymkttransfers/sendgroupredpack", data=data)
示例#3
0
    def call_args(self, request=None, dt2py=False, **kwargs):
        """调用统一下单接口的参数
        :param attach: 附加数据
        :param kwargs: 覆盖默认生成的数据
        :param dt2py: 将请求微信的datetime格式转换为python的datetime格式
        """
        # 更新ip
        self.spbill_create_ip = kwargs.pop(
            "client_ip",
            get_ip(request) or self.spbill_create_ip or get_external_ip())
        if self._call_args:
            self._call_args["client_ip"] = self.spbill_create_ip
        else:
            self.time_start = kwargs.pop("time_start", self.time_start)
            self.time_expire = kwargs.pop("time_expire", self.time_expire)
            # 显式设置起止时间
            if not self.time_start:
                self.time_start = self.created_at
            if not self.time_expire:
                self.time_expire = self.created_at + datetime.timedelta(
                    hours=2)
            # 构建call_args并缓存
            notify_url = self.pay.app.build_url(
                "order_notify",
                request=request,
                kwargs=dict(payname=self.pay.name),
                absolute=True)
            self._call_args = dict(
                trade_type=self.trade_type,
                body=self.body,
                total_fee=self.total_fee,
                notify_url=notify_url,
                client_ip=self.spbill_create_ip,
                user_id=self.openid,
                out_trade_no=self.out_trade_no,
                detail=self.detail,
                fee_type=self.fee_type,
                time_start=PayDateTimeField.dt2str(self.time_start),
                time_expire=PayDateTimeField.dt2str(self.time_expire),
                goods_tag=self.goods_tag,
                product_id=self.product_id,
                device_info=self.device_info,
                limit_pay=self.limit_pay,
                scene_info=self.scene_info,
                sub_user_id=self.sub_openid,
                receipt=self.receipt)
            self._call_args.update(kwargs)
        self.save()

        rv = self._call_args.copy()
        if dt2py:
            # 将时间重新to_python
            rv["time_start"] = PayDateTimeField.str2dt(rv["time_start"])
            rv["time_expire"] = PayDateTimeField.str2dt(rv["time_expire"])
        return rv
示例#4
0
    def send_group(self,
                   user_id,
                   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 user_id: 接收红包的用户在公众号下的 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: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(self._client.mch_id,
                                              now.strftime('%Y%m%d%H%M%S'),
                                              random.randint(1000, 10000))
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            '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,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id
        }
        return self._post('mmpaymkttransfers/sendgroupredpack', data=data)
示例#5
0
    def send_group(self, user_id, total_amount, send_name, act_name, wishing,
                   remark, total_num, client_ip=None, amt_type="ALL_RAND",
                   amt_list=None, out_trade_no=None,
                   logo_imgurl=None, watermark_imgurl=None,
                   banner_imgurl=None):
        """
        发送裂变红包

        :param user_id: 接收红包的用户在公众号下的 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—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额
                         ALL_SPECIFIED—全部自定义
                         SEED_SPECIFIED—种子红包自定义,其他随机
        :param amt_list: 可选,各红包具体金额,自定义金额时必须设置,单位分
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param logo_imgurl: 可选,商户 Logo 的 URL
        :param watermark_imgurl: 可选,背景水印图片 URL
        :param banner_imgurl: 红包详情页面的 banner 图片 URL
        :return: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self._client.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            '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,
            'amt_list': amt_list,
            'mch_billno': out_trade_no,
            'logo_imgurl': logo_imgurl,
            'watermark_imgurl': watermark_imgurl,
            'banner_imgurl': banner_imgurl,
        }
        return self._post('mmpaymkttransfers/sendgroupredpack', data=data)
示例#6
0
 def create(
     self,
     body,
     total_fee,
     auth_code,
     client_ip=None,
     out_trade_no=None,
     detail=None,
     attach=None,
     fee_type="CNY",
     goods_tag=None,
     device_info=None,
     limit_pay=None,
     receipt="Y",
 ):
     """
     刷卡支付接口
     :param device_info: 可选,终端设备号(商户自定义,如门店编号)
     :param body: 商品描述
     :param detail: 可选,商品详情
     :param attach: 可选,附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
     :param client_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: 授权码,扫码支付授权码,设备读取用户微信中的条码或者二维码信息
     :param receipt: Y,传入Y时,支付成功消息和支付详情页将出现开票入口。需要在微信支付商户平台或微信公众平台开通电子发票功能,传此字段才可生效
     :return: 返回的结果数据
     """
     now = datetime.now()
     if not out_trade_no:
         out_trade_no = f"{self.mch_id}{now.strftime('%Y%m%d%H%M%S')}{random.randint(1000, 10000)}"
     data = {
         "appid": self.appid,
         "device_info": device_info,
         "body": body,
         "detail": detail,
         "attach": attach,
         "out_trade_no": out_trade_no,
         "total_fee": total_fee,
         "fee_type": fee_type,
         "spbill_create_ip": client_ip or get_external_ip(),
         "goods_tag": goods_tag,
         "limit_pay": limit_pay,
         "auth_code": auth_code,
         "receipt": receipt,
     }
     return self._post("pay/micropay", data=data)
示例#7
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: 返回的结果数据
     """
     now = datetime.now()
     if not out_trade_no:
         out_trade_no = '{0}{1}{2}'.format(self.mch_id,
                                           now.strftime('%Y%m%d%H%M%S'),
                                           random.randint(1000, 10000))
     data = {
         'appid': self.appid,
         'device_info': device_info,
         'body': body,
         'detail': detail,
         'attach': attach,
         'out_trade_no': 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)
示例#8
0
    def send(
        self,
        user_id,
        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,
    ):
        """
        发送现金红包

        :param user_id: 接收红包的用户在公众号下的 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时必传
        :param consume_mch_id: 可选,资金授权商户号。服务商替特约商户发放时使用
        :return: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = f"{self.mch_id}{now.strftime('%Y%m%d%H%M%S')}{random.randint(1000, 10000)}"
        data = {
            "wxappid": self.appid,
            "re_openid": user_id,
            "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,
            "scene_id": scene_id,
            "risk_info": None,
            "consume_mch_id": consume_mch_id,
        }
        return self._post("mmpaymkttransfers/sendredpack", data=data)
示例#9
0
    def transfer(self,
                 user_id,
                 amount,
                 desc,
                 client_ip=None,
                 spbill_create_ip=None,
                 check_name='OPTION_CHECK',
                 real_name=None,
                 out_trade_no=None,
                 device_info=None):
        """
        企业付款接口

        :param user_id: 接受收红包的用户在公众号下的 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: 返回的结果信息
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(self.mch_id,
                                              now.strftime('%Y%m%d%H%M%S'),
                                              random.randint(1000, 10000))
        data = {
            'mch_appid': self.appid,
            'mchid': self.mch_id,
            'device_info': device_info,
            'partner_trade_no': out_trade_no,
            'openid': user_id,
            'check_name': check_name,
            're_user_name': real_name,
            'amount': amount,
            'desc': desc,
            'spbill_create_ip': spbill_create_ip or client_ip
            or get_external_ip(),
        }
        return self._post('mmpaymkttransfers/promotion/transfers', data=data)
示例#10
0
 def create(
     self,
     body,
     total_fee,
     auth_code,
     client_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 client_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: 返回的结果数据
     """
     now = datetime.now()
     if not out_trade_no:
         out_trade_no = "{0}{1}{2}".format(self.mch_id, now.strftime("%Y%m%d%H%M%S"), random.randint(1000, 10000))
     data = {
         "appid": self.appid,
         "device_info": device_info,
         "body": body,
         "detail": detail,
         "attach": attach,
         "out_trade_no": out_trade_no,
         "total_fee": total_fee,
         "fee_type": fee_type,
         "spbill_create_ip": 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)
示例#11
0
    def transfer(
        self,
        user_id,
        amount,
        desc,
        client_ip=None,
        check_name="OPTION_CHECK",
        real_name=None,
        out_trade_no=None,
        device_info=None,
    ):
        """
        企业付款接口

        :param user_id: 接受收红包的用户在公众号下的 openid
        :param amount: 付款金额,单位分
        :param desc: 付款说明
        :param client_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: 返回的结果信息
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = "{0}{1}{2}".format(self.mch_id,
                                              now.strftime("%Y%m%d%H%M%S"),
                                              random.randint(1000, 10000))
        data = {
            "mch_appid": self.appid,
            "mchid": self.mch_id,
            "device_info": device_info,
            "partner_trade_no": out_trade_no,
            "openid": user_id,
            "check_name": check_name,
            "re_user_name": real_name,
            "amount": amount,
            "desc": desc,
            "spbill_create_ip": client_ip or get_external_ip(),
        }
        return self._post("mmpaymkttransfers/promotion/transfers", data=data)
示例#12
0
    def send(self, user_id, total_amount, send_name, act_name,
             wishing, remark, total_num=1, client_ip=None,
             nick_name=None, min_value=None,
             max_value=None, out_trade_no=None, logo_imgurl=None):
        """
        发送现金红包

        :param user_id: 接收红包的用户在公众号下的 openid
        :param total_amount: 红包金额,单位分
        :param send_name: 商户名称
        :param nick_name: 可选,提供方名称,默认和商户名称相同
        :param act_name: 活动名称
        :param wishing: 红包祝福语
        :param remark: 备注
        :param client_ip: 可选,调用接口的机器 IP 地址
        :param total_num: 可选,红包发放总人数,默认为 1
        :param min_value: 可选,最小红包金额,单位分
        :param max_value: 可选,最大红包金额,单位分
        :param out_trade_no: 可选,商户订单号,默认会自动生成
        :param logo_imgurl: 可选,商户 Logo 的 URL
        :return: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            'total_amount': total_amount,
            'nick_name': nick_name or send_name,
            'send_name': send_name,
            'act_name': act_name,
            'wishing': wishing,
            'remark': remark,
            'client_ip': client_ip or get_external_ip(),
            'total_num': total_num,
            'min_value': min_value or total_amount,
            'max_value': max_value or total_amount,
            'mch_billno': out_trade_no,
            'logo_imgurl': logo_imgurl,
        }
        return self._post('mmpaymkttransfers/sendredpack', data=data)
示例#13
0
    def send_group(self, user_id, 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 user_id: 接收红包的用户在公众号下的 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: 返回的结果数据字典
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self._client.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'wxappid': self.appid,
            're_openid': user_id,
            '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,
            'scene_id': scene_id,
            'risk_info': None,
            'consume_mch_id': consume_mch_id
        }
        return self._post('mmpaymkttransfers/sendgroupredpack', data=data)
示例#14
0
    def transfer(self, user_id, amount, desc, client_ip=None,
                 check_name='OPTION_CHECK', real_name=None,
                 out_trade_no=None, device_info=None):
        """
        企业付款接口

        :param user_id: 接受收红包的用户在公众号下的 openid
        :param amount: 付款金额,单位分
        :param desc: 付款说明
        :param client_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: 返回的结果信息
        """
        if not out_trade_no:
            now = datetime.now()
            out_trade_no = '{0}{1}{2}'.format(
                self.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )
        data = {
            'mch_appid': self.appid,
            'mchid': self.mch_id,
            'device_info': device_info,
            'partner_trade_no': out_trade_no,
            'openid': user_id,
            'check_name': check_name,
            're_user_name': real_name,
            'amount': amount,
            'desc': desc,
            'spbill_create_ip': client_ip or get_external_ip(),
        }
        return self._post('mmpaymkttransfers/promotion/transfers', data=data)
示例#15
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: 返回的结果数据
     """
     now = datetime.now()
     if not out_trade_no:
         out_trade_no = '{0}{1}{2}'.format(
             self.mch_id,
             now.strftime('%Y%m%d%H%M%S'),
             random.randint(1000, 10000)
         )
     data = {
         'appid': self.appid,
         'device_info': device_info,
         'body': body,
         'detail': detail,
         'attach': attach,
         'out_trade_no': 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)
示例#16
0
    def apply_deduct(self, body, total_fee, contract_id, notify_url, out_trade_no=None,
                     detail=None, attach=None, fee_type='CNY', goods_tag=None, clientip=None, deviceid=None,
                     mobile=None, email=None, qq=None, openid=None, creid=None, outerid=None):
        """
        申请扣款 api

        :param body: 商品描述 商品或支付单简要描述
        :param out_trade_no: 可选 商户订单号 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        :param total_fee: 总金额 订单总金额,单位为分,只能为整数,详见支付金额
        :param contract_id: 委托代扣协议id 签约成功后,微信返回的委托代扣协议id
        :param notify_url: 回调通知url 接受扣款结果异步回调通知的url
        :param detail: 可选 商品详情 商品名称明细列表
        :param attach: 可选 附加数据 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
        :param fee_type: 可选 货币类型 符合ISO 4217标准的三位字母代码,默认人民币:CNY
        :param goods_tag: 可选 商品标记 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
        :param clientip: 可选 客户端 IP 点分IP格式(客户端IP)
        :param deviceid: 可选 设备ID android填imei的一次md5; ios填idfa的一次md5
        :param mobile: 可选 手机号 用户手机号
        :param email: 可选 邮箱地址 用户邮箱地址
        :param qq: 可选 QQ号 用户QQ号
        :param openid: 可选 微信open ID 用户微信open ID
        :param creid: 可选 身份证号 用户身份证号
        :param outerid: 可选 商户侧用户标识 用户在商户侧的标识
        :return: 返回的结果信息
        """
        trade_type = 'PAP'  # 交易类型 交易类型PAP-微信委托代扣支付
        timestamp = int(time.time())  # 10位时间戳
        spbill_create_ip = get_external_ip()  # 终端IP 调用微信支付API的机器IP
        if not out_trade_no:
            now = datetime.fromtimestamp(time.time(), tz=timezone('Asia/Shanghai'))
            out_trade_no = '{0}{1}{2}'.format(
                self.mch_id,
                now.strftime('%Y%m%d%H%M%S'),
                random.randint(1000, 10000)
            )

        data = {
            "appid": self.appid,
            "mch_id": self.mch_id,
            "body": body,
            "out_trade_no": out_trade_no,
            "total_fee": total_fee,
            "trade_type": trade_type,
            "contract_id": contract_id,
            "notify_url": notify_url,
            "detail": detail,
            "attach": attach,
            "fee_type": fee_type,
            "goods_tag": goods_tag,
            "clientip": clientip,
            "deviceid": deviceid,
            "mobile": mobile,
            "email": email,
            "qq": qq,
            "openid": openid,
            "creid": creid,
            "outerid": outerid,
            "timestamp": timestamp,
            "spbill_create_ip": spbill_create_ip,
        }
        return self._post("pay/pappayapply", data=data)
示例#17
0
    def create(
        self,
        trade_type,
        body,
        total_fee,
        notify_url,
        client_ip=None,
        user_id=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,
        sub_user_id=None,
        **kwargs,
    ):
        """
        统一下单接口

        :param trade_type: 交易类型,取值如下:JSAPI,NATIVE,APP,WAP, MWEB
        :param body: 商品描述
        :param total_fee: 总金额,单位分
        :param notify_url: 接收微信支付异步通知回调地址
        :param client_ip: 可选,APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP
        :param user_id: 可选,用户在商户appid下的唯一标识。trade_type=JSAPI和appid已设定,此参数必传
        :param sub_user_id: 可选,小程序appid下的唯一标识。trade_type=JSAPI和sub_appid已设定,此参数必传
        :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: 可选,上报支付的场景信息
        :param kwargs: 其他未列举在上述参数中的统一下单接口调用参数,例如电子发票入口开放标识receipt
        :type scene_info: dict
        :return: 返回的结果数据
        """
        now = datetime.fromtimestamp(time.time(), tz=timezone("Asia/Shanghai"))
        hours_later = now + timedelta(hours=2)
        if time_start is None:
            time_start = now
        else:
            time_start = time_start.astimezone(timezone("Asia/Shanghai"))
        if time_expire is None:
            time_expire = hours_later
        else:
            time_expire = time_expire.astimezone(timezone("Asia/Shanghai"))
        if not out_trade_no:
            out_trade_no = "{0}{1}{2}".format(self.mch_id, now.strftime("%Y%m%d%H%M%S"), random.randint(1000, 10000))
        if scene_info is not None:
            scene_info = json.dumps(scene_info, ensure_ascii=False)
        data = {
            "appid": self.appid,
            "sub_appid": self.sub_appid,
            "device_info": device_info,
            "body": body,
            "detail": detail,
            "attach": attach,
            "out_trade_no": out_trade_no,
            "fee_type": fee_type,
            "total_fee": total_fee,
            "spbill_create_ip": 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": user_id,
            "sub_openid": sub_user_id,
            "scene_info": scene_info,
        }
        data.update(kwargs)
        return self._post("pay/unifiedorder", data=data)
示例#18
0
    def apply_deduct(
        self,
        body,
        total_fee,
        contract_id,
        notify_url,
        out_trade_no=None,
        detail=None,
        attach=None,
        fee_type="CNY",
        goods_tag=None,
        clientip=None,
        deviceid=None,
        mobile=None,
        email=None,
        qq=None,
        openid=None,
        creid=None,
        outerid=None,
    ):
        """
        申请扣款 api

        :param body: 商品描述 商品或支付单简要描述
        :param out_trade_no: 可选 商户订单号 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
        :param total_fee: 总金额 订单总金额,单位为分,只能为整数,详见支付金额
        :param contract_id: 委托代扣协议id 签约成功后,微信返回的委托代扣协议id
        :param notify_url: 回调通知url 接受扣款结果异步回调通知的url
        :param detail: 可选 商品详情 商品名称明细列表
        :param attach: 可选 附加数据 附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据
        :param fee_type: 可选 货币类型 符合ISO 4217标准的三位字母代码,默认人民币:CNY
        :param goods_tag: 可选 商品标记 商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠
        :param clientip: 可选 客户端 IP 点分IP格式(客户端IP)
        :param deviceid: 可选 设备ID android填imei的一次md5; ios填idfa的一次md5
        :param mobile: 可选 手机号 用户手机号
        :param email: 可选 邮箱地址 用户邮箱地址
        :param qq: 可选 QQ号 用户QQ号
        :param openid: 可选 微信open ID 用户微信open ID
        :param creid: 可选 身份证号 用户身份证号
        :param outerid: 可选 商户侧用户标识 用户在商户侧的标识
        :return: 返回的结果信息
        """
        trade_type = "PAP"  # 交易类型 交易类型PAP-微信委托代扣支付
        timestamp = int(time.time())  # 10位时间戳
        spbill_create_ip = get_external_ip()  # 终端IP 调用微信支付API的机器IP
        if not out_trade_no:
            now = datetime.fromtimestamp(time.time(),
                                         tz=timezone("Asia/Shanghai"))
            out_trade_no = f"{self.mch_id}{now.strftime('%Y%m%d%H%M%S')}{random.randint(1000, 10000)}"

        data = {
            "appid": self.appid,
            "mch_id": self.mch_id,
            "body": body,
            "out_trade_no": out_trade_no,
            "total_fee": total_fee,
            "trade_type": trade_type,
            "contract_id": contract_id,
            "notify_url": notify_url,
            "detail": detail,
            "attach": attach,
            "fee_type": fee_type,
            "goods_tag": goods_tag,
            "clientip": clientip,
            "deviceid": deviceid,
            "mobile": mobile,
            "email": email,
            "qq": qq,
            "openid": openid,
            "creid": creid,
            "outerid": outerid,
            "timestamp": timestamp,
            "spbill_create_ip": spbill_create_ip,
        }
        return self._post("pay/pappayapply", data=data)