getConfig(); } /** * 获取配置信息 */ private function getConfig() { // 支付地址 $this->domain = YBF_PAYMENT_GATEWAY; // "https://test-ybf-wallet-api.dcops.cc/wallet-api"; //测试 // "https://wallet-api.yibifu.net/wallet-api"; // 正式 // 参数配置 $config = Db::name('pay_channel')->where('key','YBF')->value('value'); $config = json_decode($config,true); $this->config = $config; } /** * 参数加密 * @param $params * @return false|string */ private function encryptData($params) { $str = json_encode($params,320); $encryptData = base64_encode(openssl_encrypt($str,"AES-128-CBC",$this->config['aesKey'],OPENSSL_RAW_DATA,$this->config['aesKey'])); return $encryptData; } private function decryptData($data) { $data = openssl_decrypt(base64_decode($data),"AES-128-CBC",$this->config['aesKey'],OPENSSL_RAW_DATA,$this->config['aesKey']); $data = json_decode($data,true); return $data; } /** * 生成签名 * @param $params * @return false|string */ private function getSign($params) { $str = json_encode($params,320); $str .= $this->config['md5Key']; $sign = hash('sha256',$str); return $sign; } /** * 设置参数 * @param $params * @return array */ private function setParams($params) { $data = [ 'merchantCode' => $this->config['merchantCode'], 'params' => $this->encryptData($params,320), ]; $data['signature'] = $this->getSign($params,1); return json_encode($data); } /** * 设置提现验证Token * @param $orderNo * @return mixed */ private function setWithdrawToken($orderNo) { $token = createOrderNo('tk'); $key = "ybf_token_".$orderNo; Cache::set($key,$token,180); return $token; } /** * 获取提现验证Token * @param $orderNo * @return mixed */ private function getWithdrawToken($orderNo) { $key = "ybf_token_".$orderNo; $token = Cache::get($key); return $token; } /** * 设置返回结果 * @param $result * @return array|mixed */ private function setResult($result) { if(!empty($result['merchantCode'])){ $data = $this->decryptData($result['params']); $sign = $this->getSign($data); if($sign == $result['signature']){ return $data; }else{ return [ 'code' => 0, 'data' => $result, 'msg' => '签名错误', ]; } }else{ return [ 'code' => 0, 'data' => $result, 'msg' => '请求错误', ]; } } /** * 充值 * @return mixed */ /** * 充值 * @param $orderNo * @param $amount * @return mixed */ public function recharge($orderNo,$amount,$currency=0,$coinType=0) { $key = '/depositRequest'; $requestUrl = $this->domain . $key; $params = [ "amount"=> $amount, "callBackUrl"=> $this->config['callBackUrl'], "cardholderName"=> "", "coinType"=> $coinType ?: "2", "currency"=> $currency ?: '1', "depositOrderId"=> $orderNo, "merchantCode"=> '', "merchantId"=> '', "payType"=> "2", "paymentType"=> "1", "remark"=> "", "returnUrl"=> $this->config['returnUrl'], "telephone"=> $this->config['telephone'], "timestamp"=> time(), "userCode"=> $this->config['userCode'] ]; $params = $this->setParams($params); $header = ['content-type:application/json']; addLogToFile('发送报文:'.json_encode($params),'ybf_curl','ybf'); $result = httpPost($requestUrl,$params,$header); addLogToFile('返回结果:'.json_encode($result),'ybf_curl','ybf'); return $this->setResult($result); } /** * 提币转账接口 * @param $orderNo * @param $walletAddress * @param $amount * @return array|mixed */ public function withdraw($orderNo,$walletAddress,$amount) { $key = '/withdrawRequest'; $requestUrl = $this->domain . $key; $params = [ "amount"=> $amount, "callBackUrl"=> $this->config['callBackUrl'], "callToken"=> $this->setWithdrawToken($orderNo), "currency"=> '1', "merchantCode"=> '', "merchantId"=> '', "remark"=> "", "timestamp"=> time(), "userCode"=> $this->config['userCode'], "walletAddress" => $walletAddress, "withdrawOrderId" => $orderNo, "withdrawQueryUrl" => $this->config['withdrawQueryUrl'], ]; $params = $this->setParams($params); $header = ['content-type:application/json']; addLogToFile('发送报文:'.json_encode($params),'ybf_callback','ybf'); $result = httpPost($requestUrl,$params,$header); addLogToFile('返回结果:'.json_encode($result),'ybf_callback','ybf'); return $this->setResult($result); } /** * 回调 * @param $result * @return string|void * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @throws \think\exception\PDOException */ public function callback($result,$logId=0) { $result = $this->setResult($result); if($result['code'] == 200){ // 充值回调 $orderNo = $result['data']['depositOrderId'] ?? ''; if($orderNo){ if($logId) Db::name('pay_callback_log')->where('id',$logId)->update(['unique_no'=>$orderNo]); return $this->recharge_callback($result); } // 提现回调 $orderNo = $result['data']['withdrawOrderId'] ?? ''; if($orderNo){ if($logId) Db::name('pay_callback_log')->where('id',$logId)->update(['unique_no'=>$orderNo]); return $this->withdraw_callback($result); } } } /** * 充值回调 * @param $result * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException * @throws \think\exception\PDOException */ private function recharge_callback($result) { if($result['code'] == 200){ $data = $result['data']; $payTime = intval($result['timestamp']/1000); $order = Db::name('user_recharge')->where('order_no',$data['depositOrderId'])->find(); if($order && $order['status'] == "WAIT"){ if($data['orderStatus'] == 1){ Db::startTrans(); // 用户上分 $userId = $order['user_id']; $amount = $data['settlementAmount']; $user = Db::name('user')->where('id',$userId)->lock(true)->find(); // 计算兑换比率 $system = Db::name('system')->find(); $rechargeMoney = empty($system['recharge_money']) ? 100 : $system['recharge_money']; $money = $amount*($rechargeMoney/100); // 上分 $userMoney = $user['money']; $moneyAfter = $user['money'] + $money; $res = Db::name('user')->where('id',$userId)->update([ 'money' => $moneyAfter, 'last_recharge' => $money, 'last_recharge_time' => time(), ]); if(!$res){ Db::rollback(); return; } // 确认成功 $updateData = [ 'status' => 'SUCCESS', 'pay_time' => $payTime, 'out_trade_no' => $data['transactionId'], 'from_addr' => $data['fromAddress'], 'amount' => $amount, 'money' => $money, 'old_money' => $userMoney, 'new_money' => $moneyAfter, ]; $res = Db::name('user_recharge')->where('id',$order['id'])->update($updateData); if(!$res){ Db::rollback(); return; } Db::commit(); return 'success'; }else if($order['orderStatus'] == 9){ // 确认失败 Db::name('user_recharge')->where('id',$order['id'])->update(['status' => 'FAIL','pay_time' => $payTime]); } } } } private function withdraw_callback($result) { if($result['code'] == 200) { $data = $result['data']; $payTime = intval($result['timestamp'] / 1000); $orderNo = $data['withdrawOrderId']; $order = Db::name('user_withdraw')->where('order_no',$orderNo)->find(); if($order && $order['status'] == "AGREE"){ if($data['orderStatus'] == 1){ $amount = $data['amount']+$data['fee']; if($amount == $order['amount']){ // 确认成功 $updateData = [ 'status' => 'SUCCESS', 'pay_time' => $payTime, 'out_trade_no' => $data['transactionId'], 'from_address' => $data['fromAddress'] ]; $res = Db::name('user_withdraw')->where('id',$order['id'])->update($updateData); if(!$res){ return; } return 'success'; } }else if($data['orderStatus'] == 9){ // 确认失败 Db::name('user_withdraw')->where('id',$order['id'])->update(['status' => 'FAIL','pay_time' => $payTime]); } } } } /** * 提现反查 * @param $data * @return array * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function withdraw_query($data) { $orderNo = $data['orderNo']; $key = $this->getWithdrawToken($orderNo); if($key){ $str = 'merchantId='.$data['merchantId']; $str .= '&money='.$data['money']; $str .= '&orderNo='.$data['orderNo']; $str .= '&target='.$data['target']; $str .= '&time='.$data['time']; $str .= '&key='.$key; $sign = md5($str); if($sign == $data['sign']){ $order = Db::name('user_withdraw')->where(['order_no' => $orderNo, 'status' => 'AGREE'])->find(); if($order && $order['amount'] == $data['money']){ $result = [ 'code' => 200, 'msg' => '该订单存在,验证通过', 'status' => 1, ]; } } } if(empty($result)){ $result = [ 'code' => 200, 'msg' => '该订单不存在,请勿出款,请联系客服核实', 'status' => 0, ]; } return $result; } }