|
@@ -0,0 +1,236 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+namespace app\api\controller;
|
|
|
+
|
|
|
+use app\common\controller\Api;
|
|
|
+use think\Db;
|
|
|
+use wxpay;
|
|
|
+use addons\epay\library\Service;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 支付回调
|
|
|
+ */
|
|
|
+class Notify extends Api
|
|
|
+{
|
|
|
+ protected $noNeedLogin = ['*'];
|
|
|
+ protected $noNeedRight = ['*'];
|
|
|
+
|
|
|
+ // 定单支付回调
|
|
|
+ public function notify() {
|
|
|
+// require_once($_SERVER['DOCUMENT_ROOT'] . "/Plugins/WxPay/WxPay.php");
|
|
|
+ $wxPay = new wxpay\WxPay();
|
|
|
+ //验证是否是微信发送
|
|
|
+ $flag = $wxPay->WxPayNotifyCheck();
|
|
|
+ //LL($flag,'./log1.txt');
|
|
|
+ //验证成功
|
|
|
+ if ($flag['status']) {
|
|
|
+ if ($flag['data']['return_code'] == 'SUCCESS' && $flag['data']['result_code'] == 'SUCCESS') {
|
|
|
+ $total_fee = trim($flag['data']['total_fee']); //支付的金额, 单位:分
|
|
|
+ $order_sn = trim($flag['data']['out_trade_no']);//商家订单号
|
|
|
+
|
|
|
+ $PayResult = M('PayResult');
|
|
|
+ $where['out_trade_no'] = $order_sn;
|
|
|
+ $order_info = $PayResult->where($where)->find();
|
|
|
+ if ($order_info['total_amount'] != $total_fee) {
|
|
|
+ $r_arr['return_code'] = 'FAIL';
|
|
|
+ $r_arr['return_msg'] = '回调失败';
|
|
|
+ echo $wxPay->arrayToXml($r_arr);
|
|
|
+ die;
|
|
|
+ }
|
|
|
+ if ($order_info['status'] == 1) {
|
|
|
+ $r_arr['return_code'] = 'SUCCESS';
|
|
|
+ $r_arr['return_msg'] = '回调成功';
|
|
|
+ echo $wxPay->arrayToXml($r_arr);
|
|
|
+ die;
|
|
|
+ }
|
|
|
+
|
|
|
+ //查询订单信息
|
|
|
+ $order_time = M('Order')->field('shop_id, add_time, arrive_time')->where(['order_id' => $order_info['order_id'], 'user_id' => $order_info['user_id'], 'order_status' => 0])->find();
|
|
|
+ $order_data = [
|
|
|
+ 'order_status' => 1,
|
|
|
+ 'add_time' => time(),
|
|
|
+// 'arrive_time' => $order_time['arrive_time'] + time() - $order_time['add_time']
|
|
|
+ ];
|
|
|
+
|
|
|
+ //验证成功, 修改订单状态
|
|
|
+ $results = M('Order')->where(['order_id' => $order_info['order_id'], 'user_id' => $order_info['user_id'], 'order_status' => 0])->setField($order_data);
|
|
|
+ if (!$results) {
|
|
|
+ $_data['pay_status'] = $order_info['type'];
|
|
|
+ } else {
|
|
|
+ //给商家发消息
|
|
|
+ $shop_user_id = M('Shop')->where(['shop_id' => $order_time['shop_id']])->getField('user_id');
|
|
|
+ $data = [
|
|
|
+ 'user_id' => $shop_user_id,
|
|
|
+ 'title' => '新订单',
|
|
|
+ 'content' => '您有新的订单,请注意查看!',
|
|
|
+ 'create_time' => time()
|
|
|
+ ];
|
|
|
+ M('UserAuditNotice')->add($data);
|
|
|
+ $extra['type'] = '6';
|
|
|
+ jPushShop(C('WEB_TITLE'), '您有新的订单,请注意查看!', $shop_user_id, NULL, $extra);
|
|
|
+ }
|
|
|
+
|
|
|
+ $_data['trade_no'] = trim($flag['data']['transaction_id']); //微信交易凭证
|
|
|
+ $_data['status'] = 1;
|
|
|
+ $_data['pay_time'] = time();
|
|
|
+ $PayResult->where($where)->save($_data);
|
|
|
+
|
|
|
+ $r_arr['return_code'] = 'SUCCESS';
|
|
|
+ $r_arr['return_msg'] = '回调成功';
|
|
|
+ echo $wxPay->arrayToXml($r_arr);
|
|
|
+ die;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $r_arr['return_code'] = 'FAIL';
|
|
|
+ $r_arr['return_msg'] = '回调失败';
|
|
|
+ echo $wxPay->arrayToXml($r_arr);
|
|
|
+ file_put_contents('wx_pay_error_logs.txt', date('Y-m-d H:i:s').'支付失败!'.json_encode($flag), FILE_APPEND);
|
|
|
+ die;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 支付回调
|
|
|
+ */
|
|
|
+ public function notify1() {
|
|
|
+ $paytype = $this->request->param('paytype');
|
|
|
+ $pay = Service::checkNotify($paytype);
|
|
|
+// Log::record("=======================", 'info');
|
|
|
+// Log::record("pay:", 'info');
|
|
|
+// Log::record($pay, 'info');
|
|
|
+// Log::record("=======================", 'info');
|
|
|
+ if (!$pay) {
|
|
|
+ echo '签名错误';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $data = $pay->verify();
|
|
|
+ $time = time();
|
|
|
+ try {
|
|
|
+ $payamount = $paytype == 'alipay' ? $data['total_amount'] : $data['total_fee'] / 100;
|
|
|
+ $out_trade_no = $data['out_trade_no'];
|
|
|
+ Db::startTrans();
|
|
|
+ try{
|
|
|
+ $orderModel = new \app\common\model\RecharOrder();
|
|
|
+ $userModel = new \app\common\model\User();
|
|
|
+ $orderInfo = $orderModel->where(["order_no"=>$out_trade_no])->find();
|
|
|
+ $userInfo = $userModel->where(["id"=>$orderInfo["user_id"]])->find();
|
|
|
+ $res1 = false;
|
|
|
+ $res2 = false;
|
|
|
+ $res3 = false;
|
|
|
+ if($orderInfo['status'] == 0) {
|
|
|
+ // 修改订单状态
|
|
|
+ $res1 = $orderModel->update(["status"=>1,"updatetime"=>$time],["order_no"=>$out_trade_no, 'status' => 0]);
|
|
|
+ // 充值后
|
|
|
+ switch($orderInfo['purpose']) {
|
|
|
+ case 1:
|
|
|
+ // 修改用户为已缴纳认证费
|
|
|
+ $userInfo->recharge_auth = 1;
|
|
|
+ $res2 = $userInfo->save();
|
|
|
+ $res3 = true;
|
|
|
+ break;
|
|
|
+ case 2:
|
|
|
+ // 添加有眼缘记录--单次付费
|
|
|
+ $data = [];
|
|
|
+ $data['user_id'] = $userInfo->id;
|
|
|
+ $data['fate_user_id'] = $orderInfo->fate_user_id;
|
|
|
+ if(!\app\common\model\UserFate::where($data)->find()) {
|
|
|
+ $data['createtime'] = $time;
|
|
|
+ $res2 = \app\common\model\UserFate::insert($data);
|
|
|
+ } else {
|
|
|
+ $res2 = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 返利
|
|
|
+ $preuser_id = $userInfo->pre_user_id;
|
|
|
+ if($userInfo->vip_duetime < $time) {
|
|
|
+ $memo = '用户充值获得收益!';
|
|
|
+ $profit = $payamount * config('site.userProfitRate') * 0.01;
|
|
|
+ } else {
|
|
|
+ $memo = '会员充值获得收益!';
|
|
|
+ $profit = $payamount * config('site.vipProfitRate') * 0.01;
|
|
|
+ }
|
|
|
+ if($profit>=0.01 && $preuser_id > 0) {
|
|
|
+ $res3 = \app\common\model\User::profit($profit,$preuser_id,$memo);
|
|
|
+ } else {
|
|
|
+ $res3 = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ break;
|
|
|
+ case 3:
|
|
|
+ // 获取vip配置信息
|
|
|
+ $vip_config_id = $orderInfo['vip_config_id'];
|
|
|
+ $vipConfigInfo = \app\admin\model\vip\Config::where(['id'=>$vip_config_id])->find();
|
|
|
+ // 计算vip到期时间
|
|
|
+ if($userInfo->vip_duetime < $time) {
|
|
|
+ $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month' );
|
|
|
+ } else {
|
|
|
+ $duetime = strtotime ( '+'.intval($vipConfigInfo['time']).' month',$userInfo->vip_duetime);
|
|
|
+ }
|
|
|
+ // 修改用户为vip
|
|
|
+ if($userInfo->vip_duetime <= time()) {
|
|
|
+ $userInfo->view_count = $vipConfigInfo->give_times; // 今日剩余次数
|
|
|
+ $userInfo->view_date = date('Y-m-d'); // 次数最后更新日期
|
|
|
+ }
|
|
|
+ $userInfo->vip_duetime = $duetime;
|
|
|
+ $res2 = $userInfo->save();
|
|
|
+ // 添加查看次数
|
|
|
+ $data = [];
|
|
|
+ $data['user_id'] = $userInfo->id;
|
|
|
+ $data['end_date'] = date("Y-m-d",$duetime);
|
|
|
+ $data['times'] = $vipConfigInfo->give_times;
|
|
|
+ $data['createtime'] = time();
|
|
|
+ $res3 = \app\common\model\GiveFateLog::insert($data);
|
|
|
+ break;
|
|
|
+ case 4:
|
|
|
+ // 获取钻石配置信息
|
|
|
+ $vip_config_id = $orderInfo['vip_config_id'];
|
|
|
+ $vipConfigInfo = Db::name('diamond')->where(['id'=>$vip_config_id])->find();
|
|
|
+ //修改用户钻石余额
|
|
|
+ $diamond = $userInfo['diamond'] + $vipConfigInfo['number'];
|
|
|
+ $res2 = Db::name('user')->where(['id' => $userInfo['id'], 'diamond' => $userInfo['diamond']])->setField('diamond', $diamond);
|
|
|
+ // 添加钻石明细
|
|
|
+ $diamond_log = Db::name('user_diamond_log')->where(['user_id' => $userInfo['id']])->order('id', 'desc')->find();
|
|
|
+ if (!$diamond_log && $userInfo['diamond'] > 0) {
|
|
|
+ $res3 = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if ($diamond_log && $diamond_log['after'] != $userInfo['diamond']) {
|
|
|
+ $res3 = false;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ $data = [];
|
|
|
+ $data['user_id'] = $userInfo['id'];
|
|
|
+ $data['diamond'] = $vipConfigInfo['number'];
|
|
|
+ $data['before'] = $userInfo['diamond'];
|
|
|
+ $data['after'] = $diamond;
|
|
|
+ $data['memo'] = '充值';
|
|
|
+ $data['createtime'] = time();
|
|
|
+
|
|
|
+ $res3 = Db::name('user_diamond_log')->insertGetId($data);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if($res1 && $res2 !== false && $res3) {
|
|
|
+ Db::commit();
|
|
|
+ } else {
|
|
|
+ Db::rollback();
|
|
|
+ }
|
|
|
+ }catch (ValidateException $e) {
|
|
|
+ Db::rollback();
|
|
|
+ $this->error($e->getMessage());
|
|
|
+ } catch (PDOException $e) {
|
|
|
+ Db::rollback();
|
|
|
+ $this->error($e->getMessage());
|
|
|
+ } catch (Exception $e) {
|
|
|
+ Db::rollback();
|
|
|
+ $this->error($e->getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ //你可以在此编写订单逻辑
|
|
|
+ } catch (Exception $e) {
|
|
|
+ }
|
|
|
+ echo $pay->success();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|