Wxpay.php 14.2 KB
<?php

namespace app\api\controller;

use app\common\controller\Api;
use addons\epay\library\Service;
use think\Db;
use Yansongda\Pay\Pay;
use app\admin\model\User;
use app\admin\model\Pplate;
use app\admin\model\Ptube;
use think\Validate;
use Exception;
/**
 * 支付相关接口
 */
class Wxpay extends Api
{
    protected  $noNeedLogin = ['notify'];
    protected $noNeedRight = ['notify'];
    protected $user_id = '';//token存贮user_id
    protected $order_status = [];//订单状态
    public function _initialize()
    {
        parent::_initialize();
        $this->user_id = $this->auth->getUserId();
    }

    /**
     * @ApiTitle    (数板套餐列表)
     * @ApiSummary  (数板数管套餐列表)
     * @ApiMethod   (GET)
     * @ApiRoute    (/api/wxpay/getPlateMealList)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiParams   (name="page", type="inter", required=true, description="页码")
     *
     * @ApiReturn ({
        "code": 1,
        "msg": "成功",
        "time": "1553838039",
        "data":[
            {
            "id": 1,//套餐id
            "name": "数板模块30天礼包",//套餐名称
            "introduce": "购买指定数板模块使用权限",//套餐简介
            "money": "60.00",//套餐价格
            "duration": 30天//套餐天数
            },
            {
            "id": 2,
            "name": "数板模块10天礼包",
            "introduce": "购买指定数板模块使用权限",
            "money": "10.00",
            "duration": 10
            },
            ]
        })
     */
    public function getPlateMealList(){
        if($this->request->isGet()){
            $page = $this->request->get('page');
            //验证表数据
            $rule = config('site.pages');
            $validate = new Validate($rule['rule'],$rule['msg']);
            if (!$validate->check(['page'=>$page])) {
                $this->error($validate->getError());
            }

            $limit = config('site.page_limit');

            $res = Db::name('meal')
                ->where('type',0)
                ->field('id,name,introduce,money,duration')
                ->page($page,$limit)
                ->select();
            foreach($res as &$value){
                $value['duration'] = $value['duration'].'天';
            }
            $this->success('成功', $res);
        }else{
            $this->error('请求方式错误');
        }
    }

    /**
     * @ApiTitle    (数管套餐列表)
     * @ApiSummary  (数管套餐列表)
     * @ApiMethod   (GET)
     * @ApiRoute    (/api/wxpay/getTubeMealList)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiParams   (name="page", type="inter", required=true, description="页码")
     *
     * @ApiReturn ({
            "code": 1,
            "msg": "成功",
            "time": "1553838039",
            "data":[
                {
                "id": 1,//套餐id
                "name": "数板模块30天礼包",//套餐名称
                "introduce": "购买指定数板模块使用权限",//套餐简介
                "money": "60.00",//套餐价格
                "is_day":0(0:按天计算时长,1:按次数计算时长)
                "duration": 30天(次)//套餐时长
                },
                {
                "id": 2,
                "name": "数板模块10天礼包",
                "introduce": "购买指定数板模块使用权限",
                "money": "10.00",
                "is_day":0(0:按天计算时长,1:按次数计算时长)
                "duration": 30天(次)//套餐时长
                },
            ]
            })
     */
    public function getTubeMealList(){
        if($this->request->isGet()){
            $page = $this->request->get('page');
            //验证表数据
            $rule = config('site.pages');
            $validate = new Validate($rule['rule'],$rule['msg']);
            if (!$validate->check(['page'=>$page])) {
                $this->error($validate->getError());
            }

            $limit = config('site.page_limit');
            $res = Db::name('meal')
                ->where('type',1)
                ->field('id,name,introduce,money,duration,is_day')
                ->page($page,$limit)
                ->select();
            foreach($res as &$value){
                if($value['is_day'] == 0){
                    $value['duration'] = $value['duration'].'天';
                }else{
                    $value['duration'] = $value['duration'].'次';
                }
            }
            $this->success('成功', $res);
        }else{
            $this->error('请求方式错误');
        }
    }

    /**
     * @ApiTitle    (套餐详情)
     * @ApiSummary  (套餐详情)
     * @ApiMethod   (GET)
     * @ApiRoute    (/api/wxpay/orderPayDetail)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiParams   (name="id", type="inter", required=true, description="套餐id")
     *
     *
     * @ApiReturn ({
        "code": 1,
        "msg": "成功",
        "time": "1553838039",
        "data":{
            "id": 1,//套餐id
            "name": "数板模块30天礼包",//套餐名称
            "is_day": "0",//数管是否按照天数(0:是,1:否)
            "type": 0,//适用功能(0:数板功能,1:数管功能)
            "introduce": "购买指定数板模块使用权限",//套餐描述
            "money": "60.00",//套餐金额
            "duration": 30,//套餐详情(is_day,0:30天使用权限,1:30次使用权限)
            }
        })
     */
    public function orderPayDetail(){
        if($this->request->isGet()){
            $id = $this->request->get('id');
            $rule = config('site.get_id');
            $validate = new Validate($rule['rule'],$rule['msg']);
            if (!$validate->check(['id'=>$id])) {
                $this->error($validate->getError());
            }
            $res = Db::name('meal')
                ->where('id',$id)
                ->field('id,name,type,is_day,introduce,money,duration')
                ->find();
            $this->success('成功',$res);
        }else{
            $this->error('请求方式错误');
        }
    }

    /**
     * @ApiTitle    (购买套餐)
     * @ApiSummary  (购买套餐)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/wxpay/pay)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiParams   (name="openid", type="string", required=true, description="小程序openid")
     * @ApiParams   (name="type", type="inter", required=true, description="类型(0:数板,1:数管)")
     * @ApiParams   (name="number", type="string", required=false, description="设备编号(类型为数板传此字段)")
     * @ApiParams   (name="m_id", type="inter", required=true, description="套餐id")
     *
     *
     * @ApiReturn ({code: 0, msg: "成功", time: "1554176100", data: null})
     */
    public function pay(){
        if($this->request->isPost()){
            //创建支付对象
            $pay = Pay::wechat(Service::getConfig('wechat'));
            $data = $this->request->post();
            $rule = config('site.pay');
            $validate = new Validate($rule['rule'],$rule['msg']);
            if (!$validate->check($data)) {
                $this->error($validate->getError());
            }

            //根据套餐id查询套餐信息
            $res_meal = Db::name('meal')
                ->where(['id'=>$data['m_id'],'type'=>$data['type']])
                ->field('id,name,money,duration,is_day')
                ->find();
            if(!$res_meal){
                $this->error('该套餐不存在');
            }
            $time = time();
            $arr['m_id'] = $res_meal['id'];
            $arr['m_name'] = $res_meal['name'];

            if($data['type'] == 0){
                //数板
                if(empty($data['number'])){
                    $this->error('设备编号不能为空');
                }
                //查看是否有该设备
                $res_equip = Db::name('equipment')
                    ->where('number',$data['number'])
                    ->field('id,number,status')
                    ->find();
                if(!$res_equip){
                    $this->error('该设备编号不存在');
                }

                $arr['e_id'] = $res_equip['id'];
                $arr['e_number'] = $res_equip['number'];

                //判断是否有套餐,是否结束
                $res_plate = Db::name('pplate')
                    ->where('e_id',$res_equip['id'])
                    ->where('is_pay',0)
                    ->field('id,end_time')
                    ->order('id desc')
                    ->find();
                if($res_plate){
                    if($res_plate['end_time'] < $time){
                        $start_time = $time;
                    }else{
                        $start_time = $res_plate['end_time'];
                    }
                }else{
                    $start_time = $time;
                }
                $arr['start_time'] = $start_time;
                $arr['end_time'] = $start_time+$res_meal['duration']*86400;

            }else{
                //数管
                //判断是否有套餐,是否结束
                $res_tube = Db::name('ptube')
                    ->where(['uid'=>$this->user_id,'is_pay'=>0])
                    ->field('id,end_time,frequency,is_day')
                    ->order('id desc')
                    ->find();
                if($res_tube){
                    if($res_meal['is_day'] == 0){
                        //按照天数
                        if($res_tube['end_time'] < $time){
                            $start_time = $time;
                        }else{
                            $start_time = $res_tube['end_time'];
                        }
                        $arr['start_time'] = $start_time;
                        $arr['end_time'] = $start_time+$res_meal['duration']*86400;

                    }else{
                        //按照次数
                        if($res_tube['frequency'] == 0){
                            $arr['frequency'] = $res_meal['duration'];
                        }else{
                            $arr['frequency'] = $res_tube['frequency']+$res_meal['duration'];
                        }
                        $arr['is_day'] = 1;
                    }
                }else{
                    if($res_meal['is_day'] == 0){
                        $start_time = $time;
                        //按照天数
                        $arr['start_time'] = $start_time;
                        $arr['end_time'] = $start_time+$res_meal['duration']*86400;
                    }else{
                        //按照次数
                        $arr['is_day'] = 1;
                        $arr['frequency'] = $res_meal['duration'];
                    }
                }

            }

            $arr['pay_money'] = $res_meal['money'];
            //构建订单信息
            $pay_order_sn = $this->auth->genPayOrderSn();//支付订单号
            $arr['pay_order_sn'] = $pay_order_sn;
            $arr['uid'] = $this->user_id;

            $order = [
                'out_trade_no' => $pay_order_sn,//支付订单号
                'body' => '钢聚人电商有限公司',
                'total_fee' => 1,
//                'total_fee' => floatval($res_meal['money'])*100,//单位:分
                'openid' => $data['openid'],
                'notify_url' => url('api/Wxpay/notify','','',true),
            ];

            //创建数板或数管订单
            if($data['type'] == 0){
                //数板
                $plateModel = new Pplate();
                $plateModel->create($arr);
            }else{
                //数管
                $tubeModel = new Ptube();
                $tubeModel->create($arr);
            }
            //跳转或输出
//            ['pay_setting'=>$pay->miniapp($order),'type'=>$data['type'],'pay_order_sn'=>$pay_order_sn];
            $this->success('成功',['pay_setting'=>$pay->miniapp($order),'type'=>$data['type'],'pay_order_sn'=>$pay_order_sn]);

        }else{
            $this->error('请求方式错误');
        }
    }

    /**
     * 微信异步通知(不需调用)
     */
    public function notify(){
        $pay = Pay::wechat(Service::getConfig('wechat'));
        try {
            $data = $pay->verify();
            //成功
            if($data['result_code'] == 'SUCCESS' && $data['return_code'] == 'SUCCESS'){

            }
        } catch (Exception $e) {
            echo "验签失败";
            return;
        }
        return $pay->success()->send();
    }

    /**
     * @ApiTitle    (支付成功调用)
     * @ApiSummary  (支付成功调用)
     * @ApiMethod   (POST)
     * @ApiRoute    (/api/wxpay/updatePayStatus)
     * @ApiHeaders  (name=token, type=string, required=true, description="请求的Token")
     *
     * @ApiParams   (name="type", type="inter", required=true, description="类型(0:数板,1:数管)")
     * @ApiParams   (name="pay_order_sn", type="string", required=false, description="支付订单号")
     *
     *
     * @ApiReturn ({code: 0, msg: "成功", time: "1554176100", data: null})
     */
    public function updatePayStatus(){
        if($this->request->isPost()){
            $data = $this->request->post();
            $rule = config('site.pay_status');
            $validate = new Validate($rule['rule'],$rule['msg']);
            if (!$validate->check($data)) {
                $this->error($validate->getError());
            }
            if($data['type'] == 0){
                //数板
                $plateModel = new Pplate();
                $res = $plateModel->where('pay_order_sn',$data['pay_order_sn'])->update(['is_pay'=>0]);
            }else{
                //数管
                $tubeModel = new Ptube();
                $res = $tubeModel->where('pay_order_sn',$data['pay_order_sn'])->update(['is_pay'=>0]);
            }
            if($res){
                $this->success('成功');
            }else{
                $this->error('失败');
            }
        }else{
            $this->error('请求方式错误');
        }
    }
}