123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- <?php
- namespace bibidd\Controller;
- use Bibidd\Controller\CommonBaseController;
- /**
- * 领航支付通道
- */
- class LinghangPayController extends CommonBaseController
- {
- /**
- * 领航支付
- * @return void
- */
- public function pay()
- {
- $this->addHeaders(); //添加头部请求
- $user_info = $this->checkUserIsExist($_POST['uid']); //检查用户
- $uid = $_POST['uid'];
- $time_unix=$this->getUnixTimestamp();
- //用户id
- //选择支付类型,通道支付宝1、支付宝2、微信1
- $channel = $_POST['channel'];
- $pay_amount = $_POST['payAmount']; //充值金额
- //1是没首充 0有奖励
- $yn_first_pay = $_POST['yn_first_pay'];
- //获取通道编码
- $channel_info = M("td_zf")->where("tongdao='$channel' and $pay_amount>=min_ and $pay_amount<=max_")->find();
- $pay_bankcode = $channel_info["td_id"];
- $beizhu = $channel_info["td_name"];
- $number=$uid.$time_unix.$this->random_num(5);
- //提交时间
- $ttime = time();
- $pay_applydate = date("Y-m-d H:i:s",$ttime);;
- //服务端通知
- $pay_notifyurl = C("appUrl").'/bibidd/LinghangPay/call_back_coins';
- //页面跳转通知
- $pay_callbackurl = C("appUrl").'/bibidd/LinghangPay/huidiao_gold_coins';
- //付款人 IP
- $pay_ip = $this->getIp();
- //商户号
- $pay_memberid = 'M1746445379';
- //密钥
- $member_key = 'r4sucel7kfdqvagjdu9kap1otlgr82jy';
- //订单号
- $pay_orderid = "$number" ;
- //商品名称
- $pay_productname = $uid.$beizhu.$pay_bankcode;
- $dingdan['order_id'] = $number;
- $dingdan['uid'] = $uid;
- $dingdan['order_str'] = $pay_productname;
- $dingdan['order_ip'] = $pay_ip;
- $dingdan['apply_date'] = $pay_applydate;
- $dingdan['apply_time'] = $ttime;
- $dingdan['order_type'] = '待支付';
- $dingdan['amount'] = $pay_amount;
- $tmpl_amount= $pay_amount*100; //通道是以分为单位
- $stringSignTemp="mchId=$pay_memberid&wayCode=$pay_bankcode&subject=$pay_productname&outTradeNo=$pay_orderid&amount=$tmpl_amount&extParam=$yn_first_pay&clientIp=198.2.208.143¬ifyUrl=$pay_notifyurl&returnUrl=$pay_callbackurl&reqTime=$ttime" ;
- $md5Value =$this-> generateSortedMd5($stringSignTemp,$member_key);
- M("pay_test")->add($dingdan);
- $post_data = array(
- 'mchId' => $pay_memberid,
- 'wayCode' =>$pay_bankcode,
- 'subject' => $pay_productname,
- 'outTradeNo' => $pay_orderid,
- 'amount' => $tmpl_amount,
- 'extParam' => $yn_first_pay,
- 'clientIp' => '198.2.208.143',
- 'notifyUrl' => $pay_notifyurl,
- 'returnUrl' => $pay_callbackurl,
- 'reqTime' => $ttime,
- 'sign' => $md5Value,
- );
- $rs= $this->send_post('https://r6rivnnp.abkoiuhnbrqwkjngpay.xyz/Pay_SG', $post_data);
- if (empty($rs) || $rs['status']=='error') {
- $e_data['status'] = '0';
- $e_data['code'] = '204';//未携带参数,请求失败
- $e_data['pay_url'] = '';//未携带参数,请求失败
- $e_data['message'] = '请重试。';
- echo json_encode($e_data);
- }else{
- $rs['code'] = 200;
- echo json_encode($rs);
- }
- }
- /**
- * md5
- * @param $params
- * @return string
- */
- private function generateSortedMd5($params,$key)
- {
- // 解析参数字符串为关联数组
- parse_str($params, $paramArray);
- // 过滤空值参数(包括null和空字符串)
- $filteredParams = array_filter($paramArray, function($value) {
- return $value !== '' && $value !== null && $value !== 0;
- });
- // 按键名进行字典序排序
- ksort($filteredParams);
- // 构建查询字符串(不进行URL编码)
- $queryString = $this->buildRawQueryString($filteredParams,$key);
- // 计算MD5哈希
- $md5 = md5($queryString);
- return $md5;
- }
- /**
- * 构建原始查询字符串(不进行URL编码)
- */
- private function buildRawQueryString($params,$key1)
- {
- $base_string = '';
- foreach ($params as $key => $value) {
- $base_string .= $key . '=' . $value . '&';
- }
- $base_string.= 'key='.$key1;
- return $base_string;
- }
- function send_post($url, $post_data) {
- // 将数据编码为JSON格式
- $json_data = json_encode($post_data);
- // 检查JSON编码是否成功
- if ($json_data === false) {
- throw new Exception('JSON编码失败: ' . json_last_error_msg());
- }
- $options = array(
- 'http' => array(
- 'method' => 'POST',
- 'header' => "Content-Type: application/json\r\n" .
- "Accept: application/json\r\n",
- 'content' => $json_data,
- 'timeout' => 15 * 60 // 超时时间(单位:s)
- )
- );
- $context = stream_context_create($options);
- // 使用错误抑制符@防止警告直接输出,我们会捕获异常
- $result = @file_get_contents($url, false, $context);
- // 检查请求是否成功
- if ($result === false) {
- $error = error_get_last();
- throw new Exception('HTTP请求失败: ' . ($error['message'] ?? '未知错误'));
- }
- // 尝试解码JSON响应
- $decoded_result = json_decode($result, true);
- // 检查JSON解码是否成功
- if (json_last_error() !== JSON_ERROR_NONE) {
- // 如果不是JSON响应,返回原始结果
- return $result;
- }
- return $decoded_result;
- }
- /**
- * 领航回调地址
- * @return void
- */
- public function call_back_coins(){
- $this->addHeaders();
- //验签
- $params = $this->validate_sign();
- $post = $_POST;
- if ($post == null) {
- $post = file_get_contents("php://input");
- }
- $chenggong['name'] = $params['state'];
- //商户编号
- $memberid = $params['mchId'];
- //订单号
- $orderid = $params['outTradeNo'];
- //订单金额
- $amount = $params['amount']/100;
- //交易流水号
- $transaction_id = $params['tradeNo'];
- //交易时间
- $datetime = $params['notifyTime'];
- //交易状态
- $returncode = $params['state'];
- //扩展返回
- $attach = $params['extParam'];
- //attach 如果是0
- //防止重复回调,2024-4-15
- $idempotent_check = M("huidiao_test")->where("memberid = '$memberid' AND orderid = '$orderid' AND transaction_id = '$transaction_id'")->find();
- if(!empty($idempotent_check))
- {
- exit('SUCCESS');
- die();
- }
- //防止重复回调,2024-6-1
- $uid = M("pay_test")->where("order_id='$orderid'")->getField("uid");
- if(empty($uid))
- {
- exit('SUCCESS');
- die();
- }
- $post['uid'] = $uid;
- $post['time'] = time();
- try {
- //添加回调表用户来源add_url
- $add_url1= M("user_info")->where("id='$uid'")->getField("add_url");
- //回调
- $callback_info['uid']=$uid;
- $callback_info['time']=time();
- $callback_info['name']=$params['subject'];
- $callback_info['code']=$params['originTradeNo'];
- $callback_info['memberid']=$params['mchId'];
- $callback_info['orderid']=$params['outTradeNo'];
- $callback_info['amount']=$params['amount']/100;
- $callback_info['transaction_id']=$params['tradeNo'];
- $callback_info['datetime']=$params['notifyTime'];
- $callback_info['returncode']=$params['state'];
- $callback_info['attach']=$params['extParam'];
- $callback_info['add_url']=$add_url1;
- $callback_info['ip']=$this->getIp();
- M("huidiao_test")->add($callback_info);
- }catch (Exception $e)
- {
- exit('SUCCESS');
- die();
- }
- //end,2024-6-1
- //支付成功
- if ($chenggong['name']==1) {
- //交易成功 将用户改成会员
- $now_time_chuo = time();
- $chenggong['order_type'] = '已支付';
- $chenggong['pay_time'] = $now_time_chuo;
- $chenggong['amount_due'] =$amount;
- $chenggong['mifeng_id'] =$transaction_id;
- if($attach=='-1')
- {
- //加金币
- switch ($amount) {
- case '40.0000':
- $ks = M("user_info")->where("id=$uid")->setInc('gold_coins_number',40);
- break;
- case '60.0000':
- $ks = M("user_info")->where("id=$uid")->setInc('gold_coins_number',60);
- break;
- case '100.0000':
- M("user_info")->where("id=$uid")->setInc('gold_coins_number',100);
- break;
- case '200.0000':
- M("user_info")->where("id=$uid")->setInc('gold_coins_number',200);
- break;
- case '500.0000':
- M("user_info")->where("id=$uid")->setInc('gold_coins_number',500);
- break;
- case '1000.0000':
- M("user_info")->where("id=$uid")->setInc('gold_coins_number',1000);
- break;
- default:
- M("user_info")->where("id=$uid")->setInc('gold_coins_number',$amount);
- }
- }elseif ($attach=='xx')
- {
- //直冲添加会员
- switch ($amount) {
- case '50.0000': //永久会员
- //永久会员
- $over_time_chuo_jj = '9999999999';
- $huiyuan['vip_over_time'] =$over_time_chuo_jj;
- $huiyuan['vip_yn'] = '1';
- $this->xiaofei_detail($uid,"开通会员","永久会员",$amount);
- //另外的统计表
- $vip_table_list['code'] = 1;
- $vip_table_list['time'] = time() ;
- $vip_table_list['uid'] = $uid;
- $vip_table_list['amount'] = $amount;
- M("vip_add_list")->add($vip_table_list);
- break;
- case '50.0000': //一个月会员
- //一个月会员
- $over_time_chuo_jj = $now_time_chuo + (3600*24*30);
- $huiyuan['vip_over_time'] =$over_time_chuo_jj;
- $huiyuan['vip_yn'] = '2';
- $this->xiaofei_detail($uid,"开通会员","月会员",$amount);
- //另外的统计表
- $vip_table_list['code'] = 2;
- $vip_table_list['time'] = time() ;
- $vip_table_list['uid'] = $uid;
- $vip_table_list['amount'] = $amount;
- M("vip_add_list")->add($vip_table_list);
- break;
- case '40.0000': //周会员
- //7天
- $over_time_chuo_yue = $now_time_chuo + (3600*24*7);
- $huiyuan['vip_over_time'] = $over_time_chuo_yue;
- $huiyuan['vip_yn'] = '3';
- $this->xiaofei_detail($uid,"开通会员","7天会员",$amount);
- //另外的统计表
- $vip_table_list['code'] = 3;
- $vip_table_list['time'] = time() ;
- $vip_table_list['uid'] = $uid;
- $vip_table_list['amount'] = $amount;
- M("vip_add_list")->add($vip_table_list);
- break;
- default:
- echo "type error";
- die();
- }
- //更新为会员
- M("user_info")->where("id=$uid")->save($huiyuan);
- }//end huiyuan
- //更新用户充值金额
- M("user_info")->where("id=$uid")->setInc('vip_money',$amount);
- //修改订单相关 并且添加支付表
- M("pay_test")->where("order_id='$orderid'")->save($chenggong);
- //统计用户充值总额 2024-11-15(上线时间为切割点)
- $this->count_chongzhi($uid,$amount);
- //代理返佣,统计
- $this->proxy_pay_count($uid,$amount);
- exit('SUCCESS');
- }
- }
- private function validate_sign()
- {
- // $params = [
- // 'mchId' => $_POST['mchId'],
- // 'tradeNo' => $_POST['tradeNo'],
- // 'outTradeNo' => $_POST['outTradeNo'],
- // 'originTradeNo' => $_POST['originTradeNo'],
- // 'amount' => $_POST['amount'],
- // 'subject' => $_POST['subject'],
- // 'extParam' => $_POST['extParam'],
- // 'state' => $_POST['state'],
- // 'notifyTime' => $_POST['notifyTime'],
- // 'sign' => $_POST['sign'],
- // ];
- $params = json_decode(file_get_contents('php://input'), true);
- ksort($params); //自然排序
- //拼接请求
- $base_string = '';
- foreach ($params as $key => $value) {
- if($key=='sign') continue;
- $base_string .= $key . '=' . $value . '&';
- }
- $base_string.= 'key=r4sucel7kfdqvagjdu9kap1otlgr82jy';
- $sign_check = md5($base_string);
- //校验签名
- $sign = $params['sign'];
- if(strcasecmp($sign_check , $sign)!=0)
- {
- // 验签失败
- $trans_id = $_POST['transaction_id'];
- $update_inf["mifeng_id"]='验签失败:'.$sign_check.'对方签名'.$sign;
- M("pay_test")->where("mifeng_id='$trans_id'")->save($update_inf);
- $data['code'] = '200';
- $data['message'] = '非法请求';
- //echo json_encode($data);
- exit('SUCCESS');
- die();
- }
- return $params;
- }
- }
|