$cash = Db::name('cash')->where('id', $id)->find();
Db::startTrans();
try {
    $order_no = $cash['order_no'];
    $wxpay = new Wxpayv2();
    $parm = [
        'order_no' => $order_no,
        'openid' => $cash['openid'],
        'money' => $cash['real_money']
    ];
    if(!empty($cash['type'])){
        $bank_info=Db::name('bankcard')->where('id',$cash['bc_id'])->find();
        $parm['enc_bank_no']=$bank_info['enc_bank_no'];// 收款方银行卡号
        $parm['enc_true_name']=$bank_info['enc_true_name'];;
        $parm['bank_code']=$bank_info['bank_code'];
    }
    $res = $wxpay->getCash($parm,$cash['type']);
    write_log($res);
    if ($res['result_code'] != 'SUCCESS') {
        Db::name('cash_error_log')->insert([
            'user_id' => $cash['user_id'],
            'openid' => $cash['openid'],
            'order_no' => $order_no,
            'money' => $cash['real_money'],
            'error' => $res['err_code_des'],
            'status' => 1,
            'create_time' => times()
        ]);
        return json(['status' => 202, 'msg' => '打款失败']);
    }
    $insertData = [
        'user_id' => $cash['user_id'],
        'table' => 'cash',
        'table_id' => $id,
        'money' => $cash['real_money'],
        'from' => '打款',
        'type' => 2,
        'create_time' => date('Y-m-d H:i:s'),
    ];
    Db::name('balance_log')->insert($insertData);
    Db::name('cash')->where('id', $id)->update(['is_payment'=>1,'pay_time'=>times()]);
    Db::commit();
} catch (Exception $e) {
    Db::rollback();
    write_log('打款失败'.$cash['user_id'].'-' .$cash['real_money'].':'.date('Y-m-d H:i:s'));
    $arr = ['status' => 202, 'msg' => '打款失败'];
    return json($arr);
}
//封装提现方法
function getCash($parm, $type = 0)
{
    if (empty($parm['order_no']) || empty($parm['money']) || empty($parm['openid'])) {
        return false;
    }
    $arr = array();
    $arr['nonce_str'] = $this->getRandChar(24);//随机字符串,不长于32位
    $arr['partner_trade_no'] = $parm['order_no'];//商户订单号
    $arr['amount'] = $parm['money'] * 100;//付款金额,单位为分
    $arr['desc'] = '团长分成';//描述信息
    if (!empty($type)) {
        $arr['mch_id'] = $this->config['mch_id'];
        $arr['enc_bank_no'] = $parm['enc_bank_no'];// 收款方银行卡号
        $arr['enc_true_name'] = $parm['enc_true_name'];;
        $arr['bank_code'] = $parm['bank_code'];
        $url = 'https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank';
    } else {
        $arr['mchid'] = $this->config['mch_id'];
        $arr['mch_appid'] = $this->config['appid'];
        $arr['openid'] = $parm['openid'];
        $arr['check_name'] = 'NO_CHECK';//是否验证用户真实姓名,这里不验证
        $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
    }
    $arr['sign'] = $this->getSign($arr);//签名
    write_log($arr);
    $var = $this->arrayToXml($arr);
    $xml = $this->postXmlCurl($var, $url);
    return $this->xmlToArray($xml);
}

参考网址:

企业付款到零钱官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2

企业付款到银行卡官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay_yhk.php?chapter=24_2

IP地址不允许调用接口处理:https://zhuanlan.zhihu.com/p/364139091