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