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)
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)
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
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)