<?php
namespace app\home\service;

use app\model\PaymentListModel;
use app\model\RechargeApplyModel;
use app\model\StockMarketModel;
use app\model\UserWithdrawalModel;
use app\model\WalletListModel;
use think\facade\Db;
use think\facade\Log;

/**
 * 处理团队佣金业务
 */
class IndPayService extends BaseHomeService
{
    private $mch_id = '861100000011999';  //商户号替换成自己的
    private $md5_key= '4ABDD9347461960229F1CC55DC6344BC';  //Md5密匙替换成自己
    private $public_key='MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPlFQWrYVHecFqQQ6+V32ZfI4Z8uAdrC2hWlL2s5RsvoonmwYbR9PcKc2B/BV8YP2jh7iaxzrnj4LEZ9PpKBvJuxrGLzpLnYrLrruSLLwp8+5LSCVcxMMcx2J7eWZqB92drnzW2hBnpPBQGIm03tGpeAov9B/KHdSoQ2+7CmTlpQIDAQAB';
    private $private_key='MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI+UVBathUd5wWpBDr5XfZl8jhny4B2sLaFaUvazlGy+iiebBhtH09wpzYH8FXxg/aOHuJrHOuePgsRn0+koG8m7GsYvOkudisuuu5IsvCnz7ktIJVzEwxzHYnt5ZmoH3Z2ufNbaEGek8FAYibTe0al4Ci/0H8od1KhDb7sKZOWlAgMBAAECgYBsYJ1chNxOyIQLrVHwsV/YRKGKyr8LBtVmryRinckSkHz+SlFAtGYiENfUHzEksp2iG6doBazb74LYuDrICwN1hS0CfQdGrPqCz4632p7TQFnEBIz5Q1Im57LiFZwh0AEDU8/xL/FsX21WjERWLcQLMwekv0rYoW/fDNXPqOjaoQJBAPyMWoj6D+Cwzk2n29fdpfm7Qxr0vxGkSW8mmx/dxj2MTl0j4ySdgDGw9V/ALWeR2P8k3F0ltnpLihbOjkWuAi0CQQCRirOSHx16eKur431mafnknVA11lmlwFheI73R4voTrG3Eo5MrqEGb7JTALCgIrL9VGKR+0SybRMO2YJlkaTRZAkAJIv7Hg9x9MYhVMOR4O9GcZlT4LbCX78ykU8466egZI/FV102JbpVLtu45p5c87v7dxDSgvhOK+x6k0pY9GR2FAkBOpexJ3ySX5ROn7GP8bvJKNzR8E1wYdOuL27ac8BIBhaE/rME/y0nBD8SGYJY1sdwnCQ0DNtfrA+ra6DKcDznpAkBKZX3ODndpR2dVA2rNE7lituD+1onSuSHnwmKjrRHnkYJDDpG2gjkbJxCN9cE9zOjVGzFg4uE5K3E1rOJ6ubOx';

    public function indPayNotify(array $data):array
    {
        $sign_data=$data;
        unset($sign_data['sign']);
        $sign=$this->makeMd5Sign($sign_data);
        if($sign==$data['sign'] && $data['status']=='SUCCESS'){
            Log::info('回调签名检验成功:'.$sign.'-----'.$data['sign']);
            $order_info=RechargeApplyModel::getOrderByNo([
                'order_no'=>$data['mer_order_no'],
                'order_idx'=>$data['order_no'],
            ]);
            if(empty($order_info)){
                Log::info('回调检验订单失败:'.$data['mer_order_no']);
                return [
                    'code'=>100130,
                    'msg'=>'FAIL'
                ];
            }
            if($order_info['status']==0){
                return (new PayService())->dealPayNotify($order_info);
            }else{
                return [
                    'code'=>200,
                    'msg'=>'SUCCESS'
                ];
            }
        }else{
            Log::info('回调签名检验失败:'.$sign.'-----'.$data['sign']);
            return [
                'code'=>100120,
                'msg'=>'FAIL'
            ];
        }
    }

    public function indPay($out_trade_no,$order_amount)
    {
        $url=env('PAY.NOTIFY_URL');
        $notifyUrl=$url.url('indpay_notify');
        $pageUrl=$url.url('indpay_query');
        $data['mer_no']=$this->mch_id;
        $data['mer_order_no']=$out_trade_no;
        $data['pname']='test';
        $data['pemail']='test@mail.com';
        $data['phone']="9852146882";//限制只能为数字号码
        $data['order_amount']=$order_amount;
        //$data['order_amount']=100000;
        $data['ccy_no']="IDR";
        $data['busi_code']="100401";##支付编码
        $data['notifyUrl']=$notifyUrl;##回调地址
        $data['pageUrl']=$pageUrl;##跳转地址
        Log::info('支付post数据:'.json_encode($data));
        $data=$this->encrypt($data);
        $data=json_encode($data, JSON_UNESCAPED_UNICODE);
        $url='https://cqdft.dyb360.com/ty/orderPay';
        $ret=$this->globalpay_http_post_res_json($url,$data);
        Log::info('支付返回数据:'.json_encode($ret));
        return $ret;
    }
    public function singleIndOrder($order)
    {
        //$order=UserWithdrawalModel::where('id',1)->find()->toArray();
        $url=env('PAY.NOTIFY_URL');
        $notifyUrl=$url.url('single_notify');

        $pay_info=json_decode($order['pay_info'],true);

        $data['mer_no']=$this->mch_id;
        $data['mer_order_no']=$order['order_no'];
        $data['acc_no']=$pay_info['bank_card'];
        $data['acc_name']=$pay_info['true_name'];
        $data['bank_code']=$pay_info['bank_code'];##'=>'银行编码
        $data['ccy_no']='IDR';
        $data['order_amount']=round($order['total_amount'],2);
        $data['mobile_no']=$pay_info['bank_phone'];//限制只能为数字号码
        $data['summary']='summary';##备注
        $data['notifyUrl']=$notifyUrl;//回调地址 代付成功失败都走回调

        $data=$this->encrypt($data);

        $data=json_encode($data, JSON_UNESCAPED_UNICODE);
        $url='https://sbgdt.dyb360.com/withdraw/singleOrder';
        $ret=$this->globalpay_http_post_res_json($url,$data);
        $code=300;
        $order_idx='';
        if($ret['status']=='SUCCESS'){
            $code=200;
            $order_idx=$ret['order_no'];
        }
        return [
            'code'=>$code,
            'msg'=>$ret['status'],
            'order_idx'=>$order_idx
        ];
    }
    public function getIndBalance(){
        $data['mer_no']=$this->mch_id;
        $data['request_no']=$this->generateOrderNumber();
        $data['request_time']=date('YmdHis');
        $data=$this->encrypt($data);
        $data=json_encode($data, JSON_UNESCAPED_UNICODE);
        $url='https://sbgdt.dyb360.com/withdraw/balanceQuery';
        $ret=$this->globalpay_http_post_res_json($url,$data);
        //var_dump($ret);

    }

    public function singleIndNotify(array $data)
    {
        $sign_data=$data;
        unset($sign_data['sign']);
        $sign=$this->makeMd5Sign($sign_data);
        if($sign==$data['sign'] && $data['status']=='SUCCESS'){
            Log::info('代付回调签名检验成功:'.$sign.'-----'.$data['sign']);
            $order=UserWithdrawalModel::where([
                'order_no'=>$data['mer_order_no'],
                'order_idx'=>$data['order_no']
            ])->find();
            if(empty($order)){
                return [
                    'code'=>400,
                    'msg'=>'FAIL'
                ];
            }
            $order_info=$order->toArray();
            if($order_info['status']==3){
                UserWithdrawalModel::where('id',$order_info['id'])->update([
                    'deal_time'=>date('Y-m-d H:i:s'),
                    'status'=>4
                ]);
            }
            return [
                'code'=>200,
                'msg'=>'SUCCESS'
            ];
        }else{
            Log::info('代付回调签名检验失败:'.$sign.'-----'.$data['sign']);
            return [
                'code'=>100120,
                'msg'=>'FAIL'
            ];
        }
    }
    private function decrypt($data){
        $mch_public_key=$this->public_key;
        ksort($data);
        $toSign ='';
        foreach($data as $key=>$value){
            if(strcmp($key, 'sign')!= 0  && $value!=''){
                $toSign .= $key.'='.$value.'&';
            }
        }
        $str = rtrim($toSign,'&');
        $encrypted = '';
        //替换自己的公钥
        $pem = chunk_split( $mch_public_key,64, "\n");
        $pem = "-----BEGIN PUBLIC KEY-----\n" . $pem . "-----END PUBLIC KEY-----\n";
        $publickey = openssl_pkey_get_public($pem);

        $base64=str_replace(array('-', '_'), array('+', '/'), $data['sign']);

        $crypto = '';
        foreach(str_split(base64_decode($base64), 128) as $chunk) {
            openssl_public_decrypt($chunk,$decrypted,$publickey);
            $crypto .= $decrypted;
        }
        if($str != $crypto){
            exit('sign fail11');
        }
    }

//支付加密
    private function encrypt($data){
        $mch_private_key=$this->private_key;
        ksort($data);
        $str = '';
        foreach ($data as $k => $v){
            if(!empty($v)){
                $str .=(string) $k.'='.$v.'&';
            }
        }
        $str = rtrim($str,'&');
        $encrypted = '';
        //替换成自己的私钥
        $pem = chunk_split($mch_private_key, 64, "\n");
        $pem = "-----BEGIN PRIVATE KEY-----\n" . $pem . "-----END PRIVATE KEY-----\n";
        $private_key = openssl_pkey_get_private($pem);
        $crypto = '';
        foreach (str_split($str, 117) as $chunk) {
            openssl_private_encrypt($chunk, $encryptData, $private_key);
            $crypto .= $encryptData;
        }
        $encrypted = base64_encode($crypto);
        $encrypted = str_replace(array('+','/','='),array('-','_',''),$encrypted);

        $data['sign']=$encrypted;
        return $data;
    }

//请求
    private function globalpay_http_post_res_json($url, $postData)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $postData);
        curl_setopt($curl, CURLOPT_HEADER, 0);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array(
            'Content-Type: application/json; charset=utf-8',
            'Content-Length:' . strlen($postData) ,
            'Cache-Control: no-cache',
            'Pragma: no-cache'
        ));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $res = curl_exec($curl);
        $errorno = curl_errno($curl);
        curl_close($curl);
        $result=json_decode($res,true);
        //var_dump($res,$errorno);
        //echo $postData;
        return $result;
    }

//生成查询签名
    private function makeMd5Sign($data){
        $md5_key=$this->md5_key;
        ksort($data);
        $str = '';
        foreach ($data as $k => $v){
            if(!empty($v)){
                $str .=(string) $k.'='.$v.'&';
            }
        }
        $str = rtrim($str,'&');
        $str .='&key='.$md5_key;

        //加密
        $sign = md5($str);
        return $sign;
    }
    public function getBankList()
    {
         $back_list=[
             'COMMONWEALTH'=>'Bank Commonwealth',
             'CHINATRUST'=>'Bank CTBC (China Trust) Indonesia',
             'BANK_OCBC'=>'Bank OCBC – Indonesia',
             'BANK_MAYBANK'=>'Bank Maybank Indocorp',
             'BANK_MERIN'=>'Bank Merincorp',
             'BANK_AGRIS'=>'Bank Agris',
             'LINK_AJA'=>'Link Aja',
             'DOMPETKU'=>'Indosat Dompetku',
             'BPR_KS'=>'BPR KS',
             'HARDA_INTERNASIONAL'=>'Bank Harda',
             'BANK_VICTORIA'=>'Bank Victoria International',
             'MANDIRI_TASPEN'=>'Bank Mandiri Taspen Pos',
             'FAMA'=>'Bank Fama Internasional',
             'CENTRATAMA'=>'Centratama Nasional Bank',
             'INDEX_SELINDO'=>'Bank Index Selindo',
             'MAYORA'=>'Bank Mayora Indonesia',
             'MULTI_ARTA_SENTOSA'=>'Bank Multi Arta Sentosa',
             'BTPN_SYARIAH'=>'Bank Purba Danarta',
             'ARTOS'=>'Bank Artos IND',
             'BCA_SYR'=>'Bank BCA Syariah',
             'BANK_KESEJAHTERAAN_EKONOMI'=>'Bank Kesejahteraan Ekonomi',
             'BANK_ANGLOMAS'=>'Anglomas Internasional Bank',
             'BANK_LIMAN'=>'Liman International Bank',
             'BANK_AKITA'=>'Bank Akita',
             'OCBC'=>'Bank Dipo International (Bank Sahabat Sampoerna)',
             'BANK_PERSY'=>'Bank Persyarikatan Indonesia',
             'PRIMA_MASTER'=>'Prima Master Bank',
             'BANK_HARFA'=>'Bank Harfa',
             'BANK_INA'=>'Bank Ina Perdana',
             'MEGA_SYR'=>'Bank Syariah Mega',
             'NATIONALNOBU'=>'Bank Alfindo (Bank National Nobu)',
             'ROYAL'=>'Bank Royal Indonesia',
             'BANK_INDOMONEX'=>'ank Indomonex (Bank SBI Indonesia)',
             'AGRONIAGA'=>'Bank BRI Agro',
             'BANK_YUDHA'=>'Bank Yudha Bhakti',
             'BANK_BUMIPUTERA'=>'Bank MNC / Bank Bumiputera',
             'BANK_BINTANG'=>'Bank Bintang Manunggal',
             'JASA_JAKARTA'=>'Bank Jasa Jakarta',
             'BANK_SRI_PARTHA'=>'Bank Sri Partha',
             'BISNIS_INTERNASION'=>'Bank Bisnis Internasional',
             'MANDIRI_SYR'=>'Bank Syariah Mandiri(BSI)',
             'BUKOPIN'=>'Bank Bukopin',
             'BNI_SYR'=>'Bank BNI Syariah',
             'MEGA'=>'Bank Mega',
             'BJB_SYR'=>'Bank BJB Syariah',
             'BANK_SWAGUNA'=>'Bank Swaguna',
             'TABUNGAN_PENSIUNAN_NASIONAL'=>'Bank Tabungan Pensiunan Nasional (BTPN)',
             'JENIUS'=>'JENIUS',
             'BANK_HIM'=>'Bank Himpunan Saudara 1906',
             'BTN'=>'Bank Tabungan Negara (BTN)',
             'QNB_INDONESIA'=>'Bank QNB Kesawan (Bank QNB Indonesia)',
             'BANK_HARM'=>'Bank Harmoni International',
             'ICBC Halim Indonesia'=>'Bank (Bank ICBC Indonesia)',
             'CCB'=>'Bank Windu Kentjana',
             'GANESHA'=>'Bank Ganesha',
             'BANK_HAGAKITA'=>'Bank Hagakita',
             'MASPION'=>'Bank Maspion Indonesia',
             'SINARMAS_UUS'=>'Bank Sinarmas',
             'SHINHAN'=>'Bank Metro Express (Bank Shinhan Indonesia)',
             'MESTIKA_DHARMA'=>'Bank Mestika Dharma',
             'MUAMALAT'=>'Bank Muamalat',
             'BANK_OF_INDIA'=>'Bank of India Indonesia',
             'NUSANTARA_PARAHYANGAN'=>'Bank Nusantara Parahyangan',
             'BANK_SULTRA'=>'Bank Sultra',
             'SULAWESI'=>'Bank Sulawesi Tengah',
             'BENGKULU'=>'Bank Bengkulu',
             'PAPUA'=>'Bank Papua',
             'MALUKU'=>'Bank Maluku Malut',
             'BANK_NTT'=>'Bank NTT',
             'BALI BPD'=>'Bali',
             'BPD_NTB'=>'Bank NTB, NTB Syariah',
             'SUMSEL_DAN_BABEL_SULUT'=>'Bank Sulut Gorontalo',
             'SULSELBAR'=>'Bank Sulsel dan Barat',
             'BPD_KALTENG'=>'Bank Kalteng',
             'BPD_KAITIM'=>'Bank Kalimantan Timur dan Utara',
             'KALIMANTAN_BARAT'=>'Bank Kalimantan Barat',
             'BPD_KALSEL'=>'Bank Kalsel',
             'LAMPUNG'=>'Bank Lampung',
             'SUMSEL_DAN_BABEL'=>'Bank Sumsel Babel',
             'RIAU_DAN_KEPRI'=>'Bank Riau',
             'BANK_NAGARI'=>'Bank Nagari',
             'SUMUT'=>'Bank Sumut',
             'ACEH BPD Aceh'=>'BPD Aceh Syariah',
             'JAMBI'=>'BPD Jambi',
             'BANK_JATIM'=>'Bank Jatim',
             'BANK_JATENG'=>'Bank Jateng',
             'DAERAH_ISTIMEWA'=>'BPD DIY',
             'DKI'=>'Bank DKI',
             'BANK_JABAR'=>'Bank Jabar dan Banten (BJB)',
             'MAYAPADA'=>'Bank Mayapada',
             'JTRUST'=>'Bank JTRUST',
             'BANK_IFI'=>'Bank IFI',
             'BANK_HAGA'=>'Bank Haga',
             'BANK_ANTAR'=>'Bank Antardaerah',
             'BANK_EKONOMI'=>'Bank Ekonomi',
             'BUMI_ARTA'=>'Bank Bumi Arta',
             'BOC'=>'Bank OF China',
             'BANK_WOOR'=>'Bank Woori Indonesia',
             'DEUTSCHE'=>'Deutsche Bank AG.',
             'BANK_ANZ'=>'Bank ANZ Indonesia',
             'BANK_DANAMON'=>'Korea Exchange Bank Danamon',
             'BNP_PARIBAS'=>'Bank BNP Paribas Indonesia',
             'CAPITAL'=>'Bank Capital Indonesia',
             'BANK_KEPPEL'=>'Bank Keppel Tatlee Buana',
             'BANK_A'=>'Bank ABN Amro',
             'STANDARD_CHARTERED'=>'Standard Chartered Bank',
             'MIZUHO'=>'Bank Mizuho Indonesia',
             'RESONA'=>'Bank Resona Perdania',
             'DBS'=>'Bank DBS Indonesia',
             'MITSUI'=>'Bank Sumitomo Mitsui Indonesia',
             'BANK_TOKYO'=>'The Bank of Tokyo Mitsubishi UFJ LTD',
             'HSBC'=>'The Hongkong & Shanghai B.C. (Bank HSBC)',
             'BANK_COMP'=>'The Bangkok Bank Comp. LTD',
             'BANK_C_AGR'=>'Credit Agricole Indosuez',
             'ARTHA'=>'Bank Artha Graha Internasional',
             'BANK_ING'=>'ING Indonesia Bank',
             'BAML'=>'Bank of America, N.A',
             'JPMORGAN'=>'JP. Morgan Chase Bank, N.A',
             'CITIBANK'=>'Citibank',
             'BANK_LTD'=>'American Express Bank LTD',
             'NISP'=>'Bank OCBC NISP',
             'BANK_LIPPO'=>'Bank Lippo',
             'CIMB'=>'Bank CIMB Niaga',
             'ARTA_NIAGA_KENCANA'=>'Bank Arta Niaga Kencana',
             'PANIN'=>'Bank Panin',
             'MAYBANK'=>'Bank BII Maybank',
             'BCA'=>'Bank BCA',
             'PERMATA'=>'Permata Bank',
             'DANAMON'=>'Bank Danamon',
             'BNI'=>'Bank BNI',
             'MANDIRI'=>'Bank Mandiri',
             'EXIMBANK'=>'Bank Ekspor Indonesia',
             'BRI'=>'Bank BRI',
             'BANK_BUANA'=>'Bank UOB Indonesia',
             'BNC'=>'BNC'
         ];
         return $this->toData(0,'Request successful.',$back_list);
    }


}