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