APP提现之微信商户号企业付款

来源:互联网 发布:淘宝产品参数如何设置 编辑:程序博客网 时间:2024/04/30 23:36

微信提供的体现API出了服务号红包之外,还有商户号的企业付款,详细的API文档参照https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

企业付款直接把钱转到微信用户的零钱里,不需要用户手动领取,每笔的限额实名认证的为20000,非实名的为2000,使用比红包方便,但是它是收手续费的,收费比例为2%,

这部分收费是由用户支付,假如用户体现100元,商户号实际扣除100元,最后实际转入用户零钱的金额为98元,另外2元作为手续费,相对来说是一个比较高的比例(TX真黑)。

在微信开放平台中,一个APP如果开通了支付功能,会分配一个商户ID。同时这个APP会有一个appid,在appid和商户mch_id基础上就可以实现获取用户的体现。

APP内部绑定微信号

1 客户端通过微信AUTH获得微信的code发送给服务器,这个code是微信用户相对于APP的code。
2 服务器通过code获取用户access_token和openid,参照https://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html

APP内用户提现

如果用户提现金额大于2000,就需要用户发送真实姓名过来,发送给微信服务器进行实名认证。一个提现单有三种状态 ’SUCCESS‘、’FAILED‘、’PROCESSING‘,所以需要对于已经发出去的订单要定时查询,只有微信方返回’SUCCESS‘的时候才算提现成功,这时候才能执行app内部的逻辑。

服务号提现

服务号再申请的时候,也会有一个相对应的mchid,根据服务号的wxappid,以及mchid,参考以上APP步骤获取微信号相对于改服务号的openid就可以完成对该微信号的提现需求

部分代码如下
class WeixinWithdrawOrder_qiye(object):    def __init__(self, withhdraw_id, openid, re_user_name, mch_billno, amount, way):        from model.withdrawnew import Withdraw        self.wid = withhdraw_id        self.pw_tid = 0        if way == Withdraw.PLATFORM.WEIXINPAY_APP:            self.mch_appid = config.WX_APPID            self.mchid = config.WX_MCH_ID            self.cert = ('data/weixin/app/apiclient_cert.pem', 'data/weixin/app/apiclient_key.pem')            self.mch_key = config.WX_MCH_KEY        elif way == Withdraw.PLATFORM.WEIXINPAY_WEB:            self.mch_appid = config.WX_FWH_APPID            self.mchid = config.WX_FWH_MCH_ID            self.cert = ('data/weixin/fwh/apiclient_cert.pem', 'data/weixin/fwh/apiclient_key.pem')            self.mch_key = config.WX_FWH_MCH_KEY        self.nonce_str = hashlib.md5('%s-%s' % (self.wid, time.time())).hexdigest()        self.partner_trade_no = mch_billno        self.openid = openid        if re_user_name:            self.check_name = 'OPTION_CHECK'            self.re_user_name = re_user_name        else:            self.check_name = 'NO_CHECK'        self.amount = amount        self.desc = '提现'        self.spbill_create_ip = config.WX_PAY_IP_ADDR    @classmethod    def sign(cls, data):        weixin_params = []        for key, value in data.iteritems():            if key not in ('wid', 'sign', 'pw_tid', 'cert', 'mch_key', ):                weixin_params.append([str(key), str(value)])        weixin_params.sort(key=lambda x:x[0])        sign_src = '%s&key=%s' % ('&'.join(['%s=%s'%(x[0], x[1]) for x in weixin_params]), data['mch_key'])        logging.info(sign_src)        return hashlib.md5(sign_src).hexdigest().upper()    def order(self):        order_fmt = '''<xml>   <mch_appid>%s</mch_appid>   <mchid>%s</mchid>   <nonce_str>%s</nonce_str>   <partner_trade_no>%s</partner_trade_no>   <openid>%s</openid>   <check_name>%s</check_name>   %s   <amount>%s</amount>   <desc>%s</desc>   <spbill_create_ip>%s</spbill_create_ip>   <sign>%s</sign></xml>'''        arg_opt = ''        if getattr(self, 're_user_name', None):arg_opt = '<re_user_name>%s</re_user_name>' % self.re_user_name        order_arg = (            self.mch_appid, self.mchid, self.nonce_str, self.partner_trade_no, self.openid.encode('utf8'),            self.check_name, arg_opt, self.amount, self.desc, self.spbill_create_ip,            WeixinWithdrawOrder_qiye.sign(self.__dict__),        )        return order_fmt % order_arg    def run_withdraw(self):        try:            order = self.order()            logging.info(order)            url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers'            cert = self.cert            data = requests.post(url, data=order, cert=cert).text            root = ElementTree.fromstring(data)            response = {child.tag : child.text for child in root.getchildren()}            logging.info(response)            if response.get('return_code') == 'SUCCESS':                if response.get('result_code') == 'SUCCESS':                    return True, response.get('partner_trade_no'), response.get('err_code'), response.get('return_msg')                else:                    logging.error(data)                    return True, self.partner_trade_no, response.get('err_code'), response.get('return_msg')            else:                logging.error(data)                return False, self.partner_trade_no, response.get('err_code'), response.get('return_msg')        except:            traceback.print_exc()            return False, self.partner_trade_no, 'url not connect', 'url not connect'








0 0
原创粉丝点击