Browse Source

默认的

Kirin 3 years ago
parent
commit
c0abfbccc4

+ 82 - 0
app/api/controller/user/UserController.php

@@ -3,8 +3,11 @@
 namespace app\api\controller\user;
 
 use app\http\validates\user\AddressValidate;
+use app\models\member\MemberCheck;
+use app\models\member\MemberGrade;
 use app\models\system\SystemCity;
 use app\models\user\UserVisit;
+use crmeb\repositories\OrderRepository;
 use think\db\exception\DataNotFoundException;
 use think\db\exception\DbException;
 use think\db\exception\ModelNotFoundException;
@@ -610,4 +613,83 @@ class UserController
         $puid = $request->post('puid/d', 0);
         return app('json')->success(User::setSpread($puid, $request->uid()));
     }
+
+    public function getMemberConfig($type, Request $request)
+    {
+        $member = MemberGrade::where(['type' => $type])->order('grade asc')->select();
+        return app('json')->success('ok', $member ? $member->toArray() : []);
+    }
+
+    public function applyMemberCheck(Request $request)
+    {
+        $uid = $request->uid();
+        $param = UtilService::postMore([
+            ['type', ''],
+            ['name', ''],
+            ['id', ''],
+            ['phone', ''],
+            ['location', ''],
+            ['address', ''],
+            ['occupation', ''],
+            ['careerYears', ''],
+            ['sponsor', ''],
+            ['img', ''],
+            ['grade', ''],
+            ['pay_type', 'weixin'],
+            ['from', 'weixin'],
+        ], $request);
+        $payType = $param['pay_type'];
+        $from = $param['from'];
+        $order = MemberCheck::createOrder($param, $uid, $payType, $from);
+        if ($order === false) return app('json')->fail(MemberCheck::getErrorInfo('订单生成失败'));
+        $orderId = $order['order_id'];
+        $info = ['order_id' => $orderId];
+        if ($orderId) {
+            switch ($payType) {
+                case "weixin":
+                    $orderInfo = MemberCheck::where('order_id', $orderId)->find();
+                    if (!$orderInfo || !isset($orderInfo['paid'])) return app('json')->fail('支付订单不存在!');
+                    $orderInfo = $orderInfo->toArray();
+                    if ($orderInfo['paid']) return app('json')->fail('订单已支付!');
+                    //支付金额为0
+                    if (bcsub((float)$orderInfo['pay_money'], 0, 2) <= 0) {
+                        //创建订单jspay支付
+                        $payPriceStatus = MemberCheck::jsPayPrice($orderId, $uid);
+                        if ($payPriceStatus)//0元支付成功
+                            return app('json')->status('success', '微信支付成功');
+                        else
+                            return app('json')->status('pay_error', MemberCheck::getErrorInfo());
+                    } else {
+                        try {
+                            if ($from == 'routine') {
+                                $jsConfig = OrderRepository::jsMemberPay($orderId); //创建订单jspay
+                            } else if ($from == 'weixinh5') {
+                                $jsConfig = OrderRepository::h5MemberPay($orderId);
+                            } else {
+                                $jsConfig = OrderRepository::wxMemberPay($orderId);
+                            }
+                        } catch (\Exception $e) {
+                            return app('json')->status('pay_error', $e->getMessage());
+                        }
+                        $info['jsConfig'] = $jsConfig;
+                        if ($from == 'weixinh5') {
+                            return app('json')->status('wechat_h5_pay', '订单创建成功', $info);
+                        } else {
+                            return app('json')->status('wechat_pay', '订单创建成功', $info);
+                        }
+                    }
+                case 'yue':
+                    if (MemberCheck::yuePay($orderId, $request->uid()))
+                        return app('json')->status('success', '余额支付成功', $info);
+                    else {
+                        $errorinfo = MemberCheck::getErrorInfo();
+                        if (is_array($errorinfo))
+                            return app('json')->status($errorinfo['status'], $errorinfo['msg'], $info);
+                        else
+                            return app('json')->status('pay_error', $errorinfo);
+                    }
+                    break;
+            }
+        } else return app('json')->fail(MemberCheck::getErrorInfo('订单生成失败!'));
+    }
 }

+ 168 - 0
app/models/member/MemberCheck.php

@@ -0,0 +1,168 @@
+<?php
+/**
+ *
+ * @author: wuhaotian<442384644@qq.com>
+ * @day: 2019/12/07
+ */
+
+namespace app\models\member;
+
+use app\admin\model\user\User;
+use app\models\store\StoreOrderStatus;
+use app\models\store\StorePink;
+use app\models\user\UserBill;
+use app\models\user\UserSpread;
+use crmeb\basic\BaseModel;
+use crmeb\repositories\PaymentRepositories;
+use crmeb\traits\ModelTrait;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
+use think\db\Where;
+
+/**
+ * Class UserGroup
+ * @package app\admin\model\user
+ */
+class MemberCheck extends BaseModel
+{
+    /**
+     * 数据表主键
+     * @var string
+     */
+    protected $pk = 'id';
+
+    /**
+     * 模型名称
+     * @var string
+     */
+    protected $name = 'member_check';
+
+    protected static $payType = ['weixin' => '微信支付', 'yue' => '余额支付'];
+
+    use ModelTrait;
+
+    public static function valid()
+    {
+        return self::where('paid', 1);
+    }
+
+    public static function getValidList($where)
+    {
+        $data = self::valid()
+            ->page((int)$where['page'], (int)$where['limit'])
+            ->order('add_time', 'desc')->select()->each(function ($item) {
+                $user = \app\admin\model\user\User::get($item['uid']);
+                $item['user_name'] = $user['nickname'];
+                $item['_add_time'] = date('Y-m-d H:i:s', $item['add_time']);
+                $item['_pay_time'] = date('Y-m-d H:i:s', $item['pay_time']);
+            });
+        $count = self::valid()->count();
+        return compact('count', 'data');
+    }
+
+    public static function createOrder($param, $uid, $pay_type, $from)
+    {
+        $type = $param['type'] ?? '';
+        $name = $param['name'] ?? '';
+        $idcard = $param['id'] ?? '';
+        $phone = $param['phone'] ?? '';
+        $location = $param['location'] ?? '';
+        $detail_address = $param['address'] ?? '';
+        $job = $param['occupation'] ?? '';
+        $job_year = $param['careerYears'] ?? '';
+        $saver = $param['sponsor'] ?? '';
+        $logo = $param['img'] ?? '';
+        $grade = $param['grade'] ?? '';
+        $location = explode('/', $location);
+        $province = $location[0] ?? '';
+        $city = $location[1] ?? '';
+        $area = $location[2] ?? '';
+        self::beginTrans();
+        try {
+            if (!array_key_exists($pay_type, self::$payType)) return self::setErrorInfo('选择支付方式有误!', true);
+            $userInfo = User::getUserInfo($uid);
+            if (!$userInfo) return self::setErrorInfo('用户不存在!', true);
+            if (!$grade || !$uid || !$type || !$name || !$idcard || !$phone || !$province || !$city || !$area || !$detail_address || !$job || !$job_year || !$saver || !$logo) {
+                return self::setErrorInfo('参数不完整', true);
+            }
+            $member = MemberGrade::where(['type' => $type, 'grade' => $grade])->find();
+            if (!$member) self::setErrorInfo('会员类型不存在', true);
+            if (self::where('idcard', $idcard)->where('paid', 1)->where('status', 'in', '0,1')->find())
+                return self::setErrorInfo('已有同身份证/企业代码的记录', true);
+            $add_time = time();
+            $pay_money = $member['price'];
+            $order_id = self::getOrderId();
+            $order = compact('pay_type', 'from', 'order_id', 'grade', 'add_time', 'pay_money', 'saver', 'logo', 'uid', 'type', 'name', 'idcard', 'phone', 'province', 'city', 'area', 'detail_address', 'job', 'job_year');
+            if (!$order) return self::setErrorInfo('订单生成失败!', true);
+            self::commitTrans();
+            return $order;
+        } catch (\PDOException $e) {
+            self::rollbackTrans();
+            return self::setErrorInfo('生成订单时SQL执行错误错误原因:' . $e->getMessage());
+        } catch (\Exception $e) {
+            self::rollbackTrans();
+            return self::setErrorInfo('生成订单时系统错误错误原因:' . $e->getMessage());
+        }
+    }
+
+    public static function jsPayPrice($order_id, $uid)
+    {
+        $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
+        if (!$orderInfo) return self::setErrorInfo('订单不存在!');
+        if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
+        $userInfo = \app\models\user\User::getUserInfo($uid);
+        self::beginTrans();
+        $res1 = UserBill::expend('申请会员', $uid, 'now_money', 'pay_member', $orderInfo['pay_money'], $orderInfo['id'], $userInfo['now_money'], '微信支付' . floatval($orderInfo['pay_money']) . '元申请会员');
+        $res2 = self::paySuccess($order_id, 'weixin');//微信支付为0时
+        $res = $res1 && $res2;
+        self::checkTrans($res);
+        return $res;
+    }
+
+    public static function yuePay($order_id, $uid)
+    {
+        $orderInfo = self::where('uid', $uid)->where('order_id', $order_id)->find();
+        if (!$orderInfo) return self::setErrorInfo('订单不存在!');
+        if ($orderInfo['paid']) return self::setErrorInfo('该订单已支付!');
+        $userInfo = \app\models\user\User::getUserInfo($uid);
+        if ($userInfo['now_money'] < $orderInfo['pay_money'])
+            return self::setErrorInfo(['status' => 'pay_deficiency', 'msg' => '余额不足' . floatval($orderInfo['pay_money'])]);
+        self::beginTrans();
+
+        $res1 = false !== User::bcDec($uid, 'now_money', $orderInfo['pay_money'], 'uid');
+        $res2 = UserBill::expend('申请会员', $uid, 'now_money', 'pay_member', $orderInfo['pay_money'], $orderInfo['id'], $userInfo['now_money'], '余额支付' . floatval($orderInfo['pay_money']) . '元申请会员');
+        $res3 = self::paySuccess($order_id, 'yue');//余额支付成功
+        $res = $res1 && $res2 && $res3;
+        self::checkTrans($res);
+        return $res;
+    }
+
+
+    /**
+     * //TODO 支付成功后
+     * @param $orderId
+     * @param string $paytype
+     * @param string $formId
+     * @return bool
+     * @throws DataNotFoundException
+     * @throws DbException
+     * @throws ModelNotFoundException
+     */
+    public static function paySuccess($orderId, $paytype = 'weixin')
+    {
+        $order = self::where('order_id', $orderId)->find();
+        $res1 = self::where('order_id', $orderId)->update(['paid' => 1, 'pay_type' => $paytype, 'pay_time' => time()]);//订单改为支付
+        $now_money = \app\models\user\User::where('uid', $order['uid'])->value('now_money');
+        UserBill::expend('申请会员', $order['uid'], 'now_money', 'pay_money', $order['pay_money'], $order['id'], $now_money, '支付' . floatval($order['pay_money']) . '元申请会员');
+        return false !== $res1;
+    }
+
+    public static function getOrderId()
+    {
+        do {
+            $str = 'mem' . time() . rand(1000, 9999);
+        } while (self::be(['order_id' => $str]));
+        return $str;
+    }
+}

+ 44 - 0
app/models/member/MemberGrade.php

@@ -0,0 +1,44 @@
+<?php
+/**
+ *
+ * @author: wuhaotian<442384644@qq.com>
+ * @day: 2019/12/07
+ */
+
+namespace app\models\member;
+
+use app\admin\model\user\User;
+use app\models\store\StoreOrderStatus;
+use app\models\store\StorePink;
+use app\models\user\UserBill;
+use app\models\user\UserSpread;
+use crmeb\basic\BaseModel;
+use crmeb\repositories\PaymentRepositories;
+use crmeb\traits\ModelTrait;
+use think\db\exception\DataNotFoundException;
+use think\db\exception\DbException;
+use think\db\exception\ModelNotFoundException;
+use think\db\Where;
+
+/**
+ * Class UserGroup
+ * @package app\admin\model\user
+ */
+class MemberGrade extends BaseModel
+{
+    /**
+     * 数据表主键
+     * @var string
+     */
+    protected $pk = 'id';
+
+    /**
+     * 模型名称
+     * @var string
+     */
+    protected $name = 'member_grade';
+
+
+    use ModelTrait;
+
+}

+ 76 - 0
crmeb/repositories/OrderRepository.php

@@ -3,6 +3,7 @@
 namespace crmeb\repositories;
 
 use app\admin\model\vote\VoteOrder;
+use app\models\member\MemberCheck;
 use app\models\store\StoreOrder;
 use app\models\user\User;
 use app\models\user\WechatUser;
@@ -166,6 +167,81 @@ class OrderRepository
         return WechatService::paymentPrepare(null, $orderInfo['order_id'], $orderInfo['pay_price'], 'vote', StoreOrder::getSubstrUTf8($site_name . ' - ' . $bodyContent, 30), '', 'MWEB');
     }
 
+
+    /**
+     * TODO 小程序JS支付
+     * @param $orderId
+     * @param string $field
+     * @return array|string
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public static function jsMemberPay($orderId, $field = 'order_id')
+    {
+        if (is_string($orderId))
+            $orderInfo = MemberCheck::where($field, $orderId)->find();
+        else
+            $orderInfo = $orderId;
+        if (!$orderInfo || !isset($orderInfo['paid'])) exception('支付订单不存在!');
+        if ($orderInfo['paid']) exception('支付已支付!');
+        if ($orderInfo['pay_money'] <= 0) exception('该支付无需支付!');
+        $openid = WechatUser::getOpenId($orderInfo['uid']);
+        $bodyContent = '申请会员';
+        $site_name = sys_config('site_name');
+        if (!$bodyContent && !$site_name) exception('支付参数缺少:请前往后台设置->系统设置-> 填写 网站名称');
+        return MiniProgramService::jsPay($openid, $orderInfo['order_id'], $orderInfo['pay_money'], 'member', StoreOrder::getSubstrUTf8($site_name . ' - ' . $bodyContent, 30));
+    }
+
+    /**
+     * 微信公众号JS支付
+     * @param $orderId
+     * @param string $field
+     * @return array|string
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public static function wxMemberPay($orderId, $field = 'order_id')
+    {
+        if (is_string($orderId))
+            $orderInfo = MemberCheck::where($field, $orderId)->find();
+        else
+            $orderInfo = $orderId;
+        if (!$orderInfo || !isset($orderInfo['paid'])) exception('支付订单不存在!');
+        if ($orderInfo['paid']) exception('支付已支付!');
+        if ($orderInfo['pay_money'] <= 0) exception('该支付无需支付!');
+        $openid = WechatUser::uidToOpenid($orderInfo['uid'], 'openid');
+        $bodyContent = '申请会员';
+        $site_name = sys_config('site_name');
+        if (!$bodyContent && !$site_name) exception('支付参数缺少:请前往后台设置->系统设置-> 填写 网站名称');
+        return WechatService::jsPay($openid, $orderInfo['order_id'], $orderInfo['pay_money'], 'member', StoreOrder::getSubstrUTf8($site_name . ' - ' . $bodyContent, 30));
+    }
+
+    /**
+     * 微信h5支付
+     * @param $orderId
+     * @param string $field
+     * @return array|string
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public static function h5MemberPay($orderId, $field = 'order_id')
+    {
+        if (is_string($orderId))
+            $orderInfo = MemberCheck::where($field, $orderId)->find();
+        else
+            $orderInfo = $orderId;
+        if (!$orderInfo || !isset($orderInfo['paid'])) exception('支付订单不存在!');
+        if ($orderInfo['paid']) exception('支付已支付!');
+        if ($orderInfo['pay_money'] <= 0) exception('该支付无需支付!');
+        $bodyContent = '参与投票';
+        $site_name = sys_config('site_name');
+        if (!$bodyContent && !$site_name) exception('支付参数缺少:请前往后台设置->系统设置-> 填写 网站名称');
+        return WechatService::paymentPrepare(null, $orderInfo['order_id'], $orderInfo['pay_money'], 'member', StoreOrder::getSubstrUTf8($site_name . ' - ' . $bodyContent, 30), '', 'MWEB');
+    }
+
     /**
      * 用户确认收货
      * @param $order

+ 16 - 0
crmeb/repositories/PaymentRepositories.php

@@ -3,6 +3,7 @@
 namespace crmeb\repositories;
 
 use app\admin\model\vote\VoteOrder;
+use app\models\member\MemberCheck;
 use app\models\store\StoreOrder;
 use app\models\user\UserRecharge;
 
@@ -59,6 +60,21 @@ class PaymentRepositories
         }
     }
 
+    /**
+     * 订单支付成功之后
+     * @param string|null $order_id 订单id
+     * @return bool
+     */
+    public static function wechatMember(string $order_id = null)
+    {
+        try {
+            if (MemberCheck::be(['order_id' => $order_id, 'paid' => 1])) return true;
+            return MemberCheck::paySuccess($order_id);
+        } catch (\Exception $e) {
+            return false;
+        }
+    }
+
     /**
      * 订单支付成功之后
      * @param string|null $order_id 订单id