auth->id; if ($pay_type != 'wechat') { throw new Exception('支付类型有误'); } if(!$rc_id){ throw new Exception('请选择会员套餐'); } //赋值money $recharge_config = Db::name('payvip_config')->where('id',$rc_id)->find(); $money = $recharge_config['money']; if($money <= 0) { throw new Exception('支付金额必须大于0'); } if($money > 10000){ throw new Exception('支付金额太大'); } //会员等级冲突 //当前是会员,但是却要向下级续费,直接提示报错 //修改等级,向上立刻改,向下不允许 $wallet_info = model('wallet')->getWallet($this->auth->id); if($wallet_info['vip_endtime'] > time() && $recharge_config['vip_level'] < $wallet_info['vip_level']){ throw new Exception('当前会员没有过期,不能续费'); } //创建订单 $data = []; $data['status'] = 0; $pay_no = createUniqueNo('V',$uid); $data['pay_no'] = $pay_no; $data['money'] = $money; $data['payment_class'] = $pay_type; $data['user_id'] = $uid; $data['ext_info'] = json_encode(['subject'=>'充值vip支付']); $data['memo'] = '充值会员支付'; $data['createtime'] = time(); //$data['payment'] = 'miniapp'; $data['payment'] = 'app'; $pay_order = Db::name('pay_order')->insertGetId($data); //创建回调 $even_data = []; $even_data['event'] = 'success'; $even_data['class'] = 'app\common\model\Recharge'; $even_data['method'] = 'vippaysucc'; $even_data['args'] = json_encode(['user_id'=>$uid,'days'=>$recharge_config['days'],'vip_level'=>$recharge_config['vip_level'],'gold_num'=>$recharge_config['gold_num'],'money'=>$money]); $even_data['pay_no'] = $pay_no; $pay_event = Db::name('pay_event')->insertGetId($even_data); if (!$pay_order || !$pay_event){ throw new Exception('下单失败'); } // h5跳转小程序支付链接 $url = self::H5."?order_no={$pay_no}"; Db::commit(); $this->success('success',[ 'url' => $url ]); } catch (Exception $e) { Db::rollback(); $this->error($e->getMessage()); } } /** * 金币充值 * @return void */ public function gold_recharge() { Db::startTrans(); try { $rc_id = input_post('rc_id',0); $pay_type = 'wechat'; $freemoney = input_post('freemoney', 0, 'intval'); $uid = $this->auth->id; if(!$rc_id && !$freemoney){ throw new Exception('请选择或填写充值金额'); } if (!in_array($pay_type,['wechat','alipay'])) { throw new Exception('错误的支付类型'); } //赋值money if($rc_id){ $recharge_config = Db::name('paygold_config')->where('id',$rc_id)->find(); $money = $recharge_config ? $recharge_config['money']: 0; $gold = $recharge_config ? $recharge_config['gold'] : 0; $first_gold = $recharge_config ? $recharge_config['first_gold'] : 0; $first_vipdays = $recharge_config ? $recharge_config['first_vipdays'] : 0; $vip_gold = $recharge_config ? $recharge_config['vip_gold'] : 0; } //自由输入覆盖 if(!empty($freemoney)){ $rc_id = 0; $money = floatval($freemoney); $bili = config('site.money_to_gold') ?: 10; $gold = bcmul($money,$bili,0); $first_gold = 0; $first_vipdays = 0; $vip_gold = 0; } if($money <= 0) { throw new Exception('支付金额必须大于0'); } if($money > 10000){ throw new Exception('支付金额太大'); } //查询是不是会员,若不是则不赠送金币 $vip_endtime = Db::name('user_wallet')->where('user_id',$this->auth->id)->value('vip_endtime'); if ($vip_endtime < time()) { $vip_gold = 0; } //创建订单 $data = []; $data['status'] = 0; $pay_no = createUniqueNo('P',$uid); $data['pay_no'] = $pay_no; $data['money'] = $money; $data['payment_class'] = $pay_type; $data['user_id'] = $uid; $data['ext_info'] = json_encode(['subject'=>'充值金币支付']); $data['memo'] = '充值金币支付'; $data['createtime'] = time(); $data['payment'] = 'app'; $pay_order = Db::name('pay_order')->insertGetId($data); //创建回调 $even_data = []; $even_data['event'] = 'success'; $even_data['class'] = 'app\common\model\Recharge'; $even_data['method'] = 'goldpaysucc'; $even_data['args'] = json_encode(['user_id'=>$uid,'gold'=>$gold,'money'=>$money,'pg_id'=>$rc_id,'first_gold'=>$first_gold,'first_vipdays'=>$first_vipdays, 'intro_uid' => $this->auth->intro_uid, 'vip_gold' => $vip_gold]); $even_data['pay_no'] = $pay_no; $pay_event = Db::name('pay_event')->insertGetId($even_data); if (!$pay_order || !$pay_event){ throw new Exception('下单失败'); } // h5跳转小程序支付链接 $url = self::H5."?order_no={$pay_no}"; Db::commit(); $this->success('success',[ 'url' => $url ]); } catch (Exception $e) { Db::rollback(); $this->error($e->getMessage()); } } /** * 汇付 支付 */ public function pay() { $params = \request()->post(); $order_no = $params['order_no'] ?? ''; if ($params['openid'] != 9696){ $wxInfo = Cache::get($params['openid'] ?? ''); $openid = $wxInfo['openid'] ?? ''; }else{ $openid = 'ol8qS68vKSgWJ3Unrgfyi3rkakcQ'; } if (empty($order_no) || empty($openid)){ $this->error('支付超时,请重新下单支付'); } // 获取下单信息 $order = Db::name('pay_order')->where('pay_no',$order_no)->find(); if (!$order){ $this->error('订单不存在,请重新下单支付'); } $money = $order['money']; $money = '0.01';// 测试支付 $pay = new PayUtil(); $notify_url = CurlUtil::getHttp('/api/hui_pay/pay_notify',false); if (!$pay->jsPay($openid, $order_no, $money, $order['memo'] ?? '商品下单支付', $notify_url)){ $this->error($pay->getMessage()); } $res = $pay->getData(); if (empty($res['data']['pay_info']) || !$pay_info = json_decode($res['data']['pay_info'],true)){ $this->error('支付信息有误'); // exit; // 这里 不加 exit 编辑器可能会提示 $pay_info 有可能不存在的变量 是因为 fastadmin 自带 error 写法不规范导致的 } $this->success('success', [ 'pay_info' => $pay_info,// 这里编辑器可能会提示 有可能不存在的变量 是因为 fastadmin 自带 error 写法不规范导致的 'order_no' => $order_no ]); } /** * 支付回调 * @return void */ public function pay_notify(Request $request) { $params = $request->param(); // 消息主体信息 $resp_data = json_decode(stripslashes(htmlspecialchars_decode($params['resp_data'] ?? '')),true); unset($params['resp_data']); LogUtil::info('支付回调参数', self::LOG_MODULE, __FUNCTION__,[ 'params' => $params, 'resp_data' => $resp_data, ]); if (empty($params['resp_code']) || $params['resp_code'] != '00000000' || empty($resp_data)){ LogUtil::info('回调信息有误', self::LOG_MODULE, __FUNCTION__,"resp_code error"); $this->error('支付信息有误'); } $this->success(); } }