Browse Source

问诊下订单,支付订单,回调

lizhen_gitee 11 months ago
parent
commit
32d168dcc5

+ 88 - 0
application/api/controller/Notify.php

@@ -97,6 +97,94 @@ class Notify extends Api
         return true;
     }
 
+    //充值金币 异步回调对外方法
+    public function wenzhen_notify_base(){
+
+        //验签
+        $paytype = input('paytype','wechat');
+        $notify_file = $this->notify_log_start($paytype);
+        $pay = Service::checkNotify($paytype);
+        if (!$pay) {
+            echo '签名错误';
+            exit;
+        }
+
+        //验证,拿订单号等信息
+        $data = $pay->verify();
+        $out_trade_no = $data['out_trade_no'];
+        //订单查询
+        $info = Db::name('pay_order')->where('out_trade_no',$out_trade_no)->find();
+
+        if(empty($info)){
+            echo $pay->success();
+            exit;
+        }
+
+        if($info['order_status'] != 0)
+        {
+            echo $pay->success();
+            exit;
+        }
+        //你可以在此编写订单逻辑
+        $rs = $this->wenzhen_notify_do($out_trade_no);
+        if($rs === false){
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }else{
+            //不论结果都应返回success
+            echo $pay->success();
+            exit;
+        }
+
+        //默认
+        echo $pay->success();
+        exit;
+    }
+
+    //充值金币 逻辑
+    private function wenzhen_notify_do($out_trade_no){
+
+        Db::startTrans();
+        $orderInfo = Db::name('pay_order')->where(['out_trade_no' => $out_trade_no])->lock(true)->find();
+        if (empty($orderInfo)) {
+            Db::rollback();
+            return false;
+        }
+
+        if($orderInfo['order_status'] != 0){
+            Db::rollback();
+            return false;
+        }
+
+        $nowtime = time();
+
+        //逻辑开始
+        $order_update = [
+            'pay_out_trade_no' => $out_trade_no,
+            'pay_type' => $orderInfo['pay_type'],
+            'pay_time' => $nowtime,
+        ];
+        $update_rs = Db::name('wenzhen_order')->where('id',$orderInfo['table_id'])->update($order_update);
+        if($update_rs===false)
+        {
+            Db::rollback();
+            return false;
+        }
+        //逻辑结束
+
+        //状态
+        $ros = Db::name('pay_order')->where(['out_trade_no' => $out_trade_no])->update(['order_status'=>1,'notifytime'=>$nowtime]);
+        if($ros === false) {
+            Db::rollback();
+            return false;
+        }
+
+        //默认提交
+        Db::commit();
+        return true;
+    }
+
 ////////////////////////////////////////////////////////////////////////
     //充值VIP 异步回调对外方法
     public function vip_notify_base(){

+ 163 - 0
application/api/controller/Wenzhen.php

@@ -0,0 +1,163 @@
+<?php
+
+namespace app\api\controller;
+
+use app\common\controller\Api;
+use think\Db;
+use addons\epay\library\Service;
+/**
+ * 问诊订单
+ */
+class Wenzhen extends Api
+{
+    protected $noNeedLogin = '';
+    protected $noNeedRight = '*';
+
+    //创建订单
+    public function create_order(){
+        $member_id = input('member_id',0);
+        $doctor_id = input('doctor_id',0);
+        $ordertype = input('ordertype',0);
+        $book_time = input('book_time',0);
+
+
+        $member_disease = input('member_disease','');
+        $member_images  = input('member_images','');
+
+        $auth_id = $this->auth->id;
+        $order_no = createUniqueNo('W',$auth_id);
+
+        //成员信息
+        $member_info = Db::name('user_member')->where('user_id',$auth_id)->where('id',$member_id)->find();
+        if(empty($member_info)){
+            $this->error('不存在的就诊者');
+        }
+
+        //医生信息
+        $doctor_info = Db::name('doctor_info')->where('doctor_id',$doctor_id)->find();
+        if(empty($doctor_info)){
+            $this->error('不存在的医生');
+        }
+
+        //ordertype
+        if(!in_array($ordertype,[1,2])){
+            $this->error();
+        }
+
+        //价格
+        $price = 0;
+        if($ordertype == 1){
+            if($doctor_info['typing_switch'] != 1){
+                $this->error('该医生未开通图文问诊');
+            }
+            $price = $doctor_info['typing_price'];
+        }
+        if($ordertype == 2){
+            if($doctor_info['video_switch'] != 1){
+                $this->error('该医生未开通视频问诊');
+            }
+            $price = $doctor_info['video_price'];
+        }
+        if($price <= 0){
+            $this->error('价格为零');
+        }
+
+         //订单数据
+        $order_data = [
+            'order_no'   => $order_no,
+            'user_id'    => $auth_id,
+            'member_id'  => $member_id,
+            'doctor_id'  => $doctor_id,
+            'ordertype'  => $ordertype,
+            'total_fee'  => $price,
+            'book_time'  => strtotime($book_time),
+            'createtime' => time(),
+            'status'     => 0,
+        ];
+
+        Db::startTrans();
+
+        //下单
+        $order_id = Db::name('wenzhen_order')->insertGetId($order_data);
+        if(!$order_id){
+            Db::rollback();
+            $this->error('下单失败');
+        }
+
+        //订单附表,就诊人信息
+        $member_data = $member_info;
+        unset($member_data['id']);
+        $member_data['order_id']       = $order_id;
+        $member_data['member_id']      = $member_info['id'];
+        $member_data['member_disease'] = $member_disease;
+        $member_data['member_images']  = $member_images;
+
+        $order_member_id = Db::name('wenzhen_order_member')->insertGetId($member_data);
+        if(!$order_member_id){
+            Db::rollback();
+            $this->error('下单失败');
+        }
+
+        //
+        Db::commit();
+        $this->success('下单成功',$order_id);
+    }
+
+    //支付订单
+    public function pay_order(){
+        $order_id = input('order_id',0);
+        $pay_type = input('pay_type','wechat');
+
+        //pay_type
+        if(!in_array($pay_type,['wechat','alipay'])){
+            $this->error();
+        }
+
+        //订单详情
+        $wenzhen_order = Db::name('wenzhen_order')->where('user_id',$this->auth->id)->where('id',$order_id)->find();
+        if(empty($wenzhen_order)){
+            $this->error('不存在的订单');
+        }
+        if($wenzhen_order['status'] != 0){
+            $this->error('该订单不能支付');
+        }
+
+        //创建订单
+        $platform = 'app';
+        $data = [];
+        $data['user_id'] = $this->auth->id;
+        $data['out_trade_no'] = createUniqueNo('W',$this->auth->id);
+        $data['order_amount'] = $wenzhen_order['total_fee'];
+        $data['createtime'] = time();
+
+        $data['pay_type'] = $pay_type;
+        $data['platform'] = $platform;
+        $data['order_status'] = 0;
+        $data['table_name'] = 'wenzhen_order';
+        $data['table_id'] = $order_id;
+        $data['args'] = '';
+
+        $orderid = Db::name('pay_order')->insertGetId($data);
+
+        $openid = '';
+        //下单
+        $params = [
+            'type'         => $pay_type,
+            'orderid'      => $data['out_trade_no'],
+            'title'        => '支付订单',
+            'amount'       => $data['order_amount'],
+            'method'       => $platform,
+            'openid'       => $openid,
+            'notifyurl' => config('pay_notify_url').'/api/notify/wenzhen_notify_base/paytype/'.$pay_type,
+            'returnurl' => '',
+        ];
+
+        $res = Service::submitOrder($params);
+
+        if($pay_type == 'wechat'){
+            $this->success('success',json_decode($res,true));
+        }else{
+            $this->success('success',$res);
+        }
+    }
+}

+ 2 - 2
application/extra/site.php

@@ -76,11 +76,11 @@ return array (
   'min_takecash_money' => '1',
   'max_takecash_money' => '10000',
   'takecash_plat_bili' => '6',
-  'wenzhen_video_serverrule' => '服务说明:
+  'wenzhen_video_serverrule' => '视频问诊服务说明:
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。',
-  'wenzhen_typing_serverrule' => '服务说明:
+  'wenzhen_typing_serverrule' => '图文问诊服务说明:
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。
 1、选择本服务后,您可在咨询医生前提交初诊时的诊断结果,一段说明文字和6张图片以描述您的病情信息,为了保证咨询质量请务必填写真实信息。',