美文网首页
微信提现到用户银行卡

微信提现到用户银行卡

作者: 骑代码奔小康 | 来源:发表于2020-11-25 16:54 被阅读0次

    1、微信提现到指定的银行卡
    2、官方文档:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_1&index=1

    <?php
    
    namespace data\service\Pay;
    
    /**
     * 功能说明:微信退款(企业付款到银行卡)
     */
    class WxRefund
    {
        //应用appid
        public $pay_appid = '';
        //商户id
        public $pay_mchid = '';
        //商户密钥
        public $pay_mchkey = '';
    
        public function __construct()
        {
            $this->pay_appid = config('WEIXINPAY.APPID');
            $this->pay_mchid = config('WEIXINPAY.PAYMCHID');
            $this->pay_mchkey = config('WEIXINPAY.PAYMCHKEY');
        }
    
        /**
         *  作用:生成签名
         */
        private function getSign($Parameters)
        {
            //签名步骤一:按字典序排序参数
            ksort($Parameters);
            $buff = "";
            foreach ($Parameters as $k => $v) {
                $buff .= $k . "=" . $v . "&";
            }
            $String = '';
            if (strlen($buff) > 0) {
                $String = substr($buff, 0, strlen($buff) - 1);
            }
            //签名步骤二:在string后加入KEY
            $String = $String . "&key=" . $this->pay_mchkey;
            //签名步骤三:MD5加密
            $String = md5($String);
            //签名步骤四:所有字符转为大写
            $result_ = strtoupper($String);
            return $result_;
        }
    
        /**
         *  作用:array转xml
         */
        private function arrayToXml($arr)
        {
            $xml = "<xml>";
            foreach ($arr as $key => $val) {
                $xml .= "<" . $key . ">" . $val . "</" . $key . ">";
            }
            $xml .= "</xml>";
            return $xml;
        }
    
        /**
         *   xml转换为数组
         */
        public function xmlToArray($xml)
        {
            //禁止引用外部xml实体
            libxml_disable_entity_loader(true);
            $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
            $val = json_decode(json_encode($xmlstring), true);
            return $val;
        }
    
        /**
         *  作用:以post方式提交xml到对应的接口url
         */
        private function postXmlCurl($xml, $url)
        {
            $ch = curl_init();                                      //初始化curl
            curl_setopt($ch, CURLOPT_URL, $url);                 //抓取指定网页
            curl_setopt($ch, CURLOPT_HEADER, 0);                    //设置header
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);            //要求结果为字符串且输出到屏幕上
            curl_setopt($ch, CURLOPT_POST, 1);                      //post提交方式
            curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);           // 增加 HTTP Header(头)里的字段
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);        // 终止从服务端进行验证
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    
            // API证书安全
            // 1.证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载;
            // 2.建议将证书文件名改为复杂且不容易猜测的文件名;
            // 3.商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。
            $zs1 =  "证书文件夹/weixin/********.pem"; // 证书地址
            $zs2 =  "证书文件夹/weixin/******.pem"; // 证书地址
    
    
            curl_setopt($ch, CURLOPT_SSLCERT, $zs1);
            curl_setopt($ch, CURLOPT_SSLKEY, $zs2);
    
            $data = curl_exec($ch);                                 //运行curl
    
            if (curl_errno($ch)) {
                echo 'Errno:' . curl_error($ch);
            }
            curl_close($ch);
            return $data;
        }
    
        /**
         * 公钥加密,银行卡号和姓名需要RSA算法加密
         * @param string $data 需要加密的字符串,银行卡/姓名
         * @return null|string  加密后的字符串
         */
        private function publicEncrypt($data)
        {
            // 进行RSA公钥加密
            $pubkey = openssl_pkey_get_public(file_get_contents('证书地址/weixin/*****.pem')); // 证书地址和文件名
            $encrypt_data = '';
            $encrypted = '';
            $r = openssl_public_encrypt($data, $encrypt_data, $pubkey, OPENSSL_PKCS1_OAEP_PADDING);
            if ($r) {//加密成功,返回base64编码的字符串
                return base64_encode($encrypted . $encrypt_data);
            } else {
                return false;
            }
        }
    
    
        /**
         * 产生随机字符串,不长于32位
         *
         * @param int $length
         * @return 产生的随机字符串
         */
        public static function getNonceStr($length = 32)
        {
            $chars = "abcdefghijklmnopqrstuvwxyz0123456789";
            $str = "";
            for ($i = 0; $i < $length; $i++) {
                $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
            }
            return $str;
        }
    
    
    
        /**
         * 企业付款到银行卡接口
         * @params string $out_trade_no : 商户订单号
         * @params int $amount : 付款金额,单位分
         * @params string $enc_bank_no : 收款方银行卡号
         * @params string $enc_true_name : 收款方用户名
         * @params string $bank_code : 收款方开户行银行编号bank_code
         * @params string $desc : 付款备注
         * return string $payment_no :支付成功的订单号
         */
        public function payForBank($out_trade_no,$amount,$enc_bank_no,$enc_true_name,$bank_code,$desc='企业付款到银行卡')
        {
            $data = [
                'amount' => $amount * 100,
                'bank_code' => $bank_code,
                'desc' => $desc,
                'enc_bank_no' => $this->publicEncrypt($enc_bank_no),
                'enc_true_name' => $this->publicEncrypt($enc_true_name),
                'mch_id' => $this->pay_mchid,
                'nonce_str' => $this->getNonceStr(),
                'partner_trade_no' => $out_trade_no
            ];
    
            $data['sign'] = $this->getSign($data);
    
            $xml = $this->arrayToXml($data);
    
            $url = 'https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank';
    
            $res = $this->postXmlCurl($xml,$url);
    
            $return = $this->xmlToArray($res);
    
            if($return['return_code'] == 'SUCCESS' && $return['result_code'] == 'SUCCESS' && $return['err_code'] == 'SUCCESS'){
                return array('status'=>1,'payment_no'=>$return['payment_no']);
            }else{
                return array('status'=>0,'message'=>$return['err_code_des']);
            }
        }
    
    
    }
    

    相关文章

      网友评论

          本文标题:微信提现到用户银行卡

          本文链接:https://www.haomeiwen.com/subject/kmpniktx.html