<?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); } }