bourse stock
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

407 lines
16 KiB

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