微信银行组件接口

    public function https_request($url,$data = null,$type=1){

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, (string)$url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $sign = $this->checkSign($url);
        //添加请求头
        $headers = [
            'Authorization:'.$sign,
            'Accept: application/json',
            'Content-Type: application/json; charset=utf-8',
            'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',
        ];
        if($type == 2){
            array_push($headers, 'Wechatpay-Serial: '.config('wechat.pay.public_key_id'));
        }
        if(!empty($headers)){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

        $response = curl_exec($curl);
        $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $errno = curl_errno($curl);
        $error = curl_error($curl);
        curl_close($curl);

        // 调试信息
        if ($httpCode!= 200){
            Log::error("微信请求失败:{$httpCode} - {$error}",['url'=>$url,'errno'=>$errno,'error'=>$error,'data'=>$data,'response'=>$response]);
        }
//        echo "HTTP Code: {$httpCode}\n";
//        echo "cURL Error: {$errno} - {$error}\n";
//        echo "Raw Response:\n{$response}\n";

        $response = json_decode($response,true);
        return $response;
    }

    //验签(请求中带有query)
    public function checkSign($url)
    {
        $http_method = 'GET';        //请求方法
        $url_parts = parse_url($url);
        $canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));

        $timestamp = time();         //时间戳
        $nonce = $timestamp.rand('10000','99999');      //随机串
        $body = '';     //请求报文主体
        //构造的请求签名串
        $message = $http_method."\n".
            $canonical_url."\n".
            $timestamp."\n".
            $nonce."\n".
            $body."\n";

        // 获取配置(config文件)
        $config = config('wechat.pay');
        // 加载商户私钥
        $mch_private_key  = Rsa::from('file://' . $config['private_key_path'], Rsa::KEY_TYPE_PRIVATE);
        // 获取序列号
        $serial_no = $config['serial_no'];
        // 获取商户号
        $merchant_id = $config['mch_id'];

        // 加密
        openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');
        $sign = base64_encode($raw_sign);//签名
        $schema = 'WECHATPAY2-SHA256-RSA2048';
        $token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',
            $merchant_id, $nonce, $timestamp, $serial_no, $sign);//微信返回token

        return $schema.' '.$token;
    }


    //获取个人业务银行列表
    public function getPersonalBankList($query)
    {
        $url = '/v3/capital/capitallhh/banks/personal-banking';
        $url = $this->domainName . $url .'?'. http_build_query($query);

        //设置缓存
        $cache_key = 'personal_bank_list_'.md5(json_encode($query));
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url);
        Cache::set($cache_key, $list, 3600);

        return $list;

    }

    //获取对公业务银行列表
    public function getCorporateBankList($query)
    {
        $url = '/v3/capital/capitallhh/banks/corporate-banking';
        $url = $this->domainName . $url .'?'. http_build_query($query);

        //设置缓存
        $cache_key = 'corporate_bank_list_'.md5(json_encode($query));
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url);
        Cache::set($cache_key, $list, 3600);

        return $list;

    }

    //查询省份列表
    public function getProvinceList()
    {
        $url = '/v3/capital/capitallhh/areas/provinces';
        $url = $this->domainName . $url;

        //设置缓存
        $cache_key = 'areas_provinces';
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url);
        Cache::set($cache_key, $list, 3600);

        return $list;
    }

    public function getCityList($province_code)
    {
        $url = '/v3/capital/capitallhh/areas/provinces/'.$province_code.'/cities';
        $url = $this->domainName . $url;

        //设置缓存
        $cache_key = 'areas_provinces_'.$province_code;
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url);
        Cache::set($cache_key, $list, 3600);

        return $list;
    }

    //查询支行列表
    public function getBranchList($bank_alias_code,$query)
    {
        $url = '/v3/capital/capitallhh/banks/'.$bank_alias_code.'/branches';
        $url = $this->domainName . $url .'?'. http_build_query($query);

        //设置缓存
        $cache_key = 'branches_'.$bank_alias_code.'_'.md5(json_encode($query));
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url);
        Cache::set($cache_key, $list, 3600);

        return $list;
    }

    //获取对私银行开户银行
    public function getPersonalBankAccount($query)
    {
        $url = '/v3/capital/capitallhh/banks/search-banks-by-bank-account';
        $url = $this->domainName . $url .'?'. http_build_query($query);

        //设置缓存
        $cache_key = 'bank_account_'.md5(json_encode($query));
        $cache_data = Cache::get($cache_key);
        if($cache_data) return $cache_data;

        $list = $this->https_request($url,null,2);
        Cache::set($cache_key, $list, 3600);

        return $list;
    }


    //使用微信支付公钥加密数据
    public function getEncrypt($str) {
        //$str是待加密字符串
        $public_key_path = config('wechat.pay.public_key_path');
        $public_key = file_get_contents($public_key_path);
        $encrypted = '';
        if (openssl_public_encrypt($str, $encrypted, $public_key, OPENSSL_PKCS1_OAEP_PADDING)) {
            //base64编码
            $sign = base64_encode($encrypted);
        } else {
            throw new Exception('encrypt failed');
        }
        return $sign;
    }

posted @ 2025-11-07 11:50  cmooc  阅读(2)  评论(0)    收藏  举报