From 45788dda75b7353c7f0ef0b7fb7d17c6392a4c49 Mon Sep 17 00:00:00 2001 From: lccsw <1127794702@qq.com> Date: Tue, 10 Aug 2021 09:51:58 +0800 Subject: [PATCH] edit-api-licheb-opt --- admin/controllers/receiver/Orders.php | 2 +- api/config/wxpay.php | 19 ++ api/controllers/wxapp/app/Payment.php | 83 +++--- api/controllers/wxapp/app/Series.php | 27 +- api/controllers/wxapp/liche/Contract.php | 36 ++- api/controllers/wxapp/liche/Order.php | 20 +- api/controllers/wxapp/liche/User.php | 7 +- api/controllers/wxapp/liche/Wxnotify.php | 14 +- api/controllers/wxapp/liche/Wxnotify_v3.php | 77 +++++ api/controllers/wxapp/licheb/Cusorder.php | 52 +++- api/controllers/wxapp/licheb/Customerlogs.php | 10 +- api/controllers/wxapp/licheb/Protocol.php | 213 ++++++++++---- api/controllers/wxapp/licheb/Services.php | 54 ++++ .../WXconfig/liche_WxPay.Config.php | 2 +- api/views/wxapp/licheb/html2pdf/agent.php | 28 +- api/views/wxapp/licheb/html2pdf/car.php | 35 +-- api/views/wxapp/licheb/html2pdf/car_ck.php | 17 +- api/views/wxapp/licheb/html2pdf/car_fh.php | 32 +-- api/views/wxapp/licheb/protocol/agent.php | 28 +- api/views/wxapp/licheb/protocol/car.php | 35 +-- api/views/wxapp/licheb/protocol/car_ck.php | 17 +- api/views/wxapp/licheb/protocol/car_fh.php | 32 +-- common/composer.json | 3 +- common/composer.lock | 53 +++- common/helpers/comm_helper.php | 13 + common/libraries/Pdf.php | 1 + common/libraries/WechatPayV3.php | 90 ++++++ common/libraries/receiver/Orders_entity.php | 135 ++++++++- common/libraries/receiver/Sign_entity.php | 59 +--- .../Receiver_service_package_model.php | 13 + .../receiver/Receiver_services_model.php | 13 + .../order/Receiver_order_ckcars_model.php | 2 +- common/services/apporder/Payment_service.php | 29 +- common/vendor/bin/CertificateDownloader.php | 1 + common/vendor/composer/autoload_psr4.php | 1 + common/vendor/composer/autoload_static.php | 8 + common/vendor/composer/installed.json | 53 ++++ .../wechatpay-guzzle-middleware/.gitignore | 9 + .../wechatpay-guzzle-middleware/LICENSE | 201 ++++++++++++++ .../wechatpay-guzzle-middleware/README.md | 262 ++++++++++++++++++ .../wechatpay-guzzle-middleware/composer.json | 28 ++ .../src/Auth/CertificateVerifier.php | 70 +++++ .../src/Auth/PrivateKeySigner.php | 72 +++++ .../src/Auth/SignatureResult.php | 64 +++++ .../src/Auth/Signer.php | 33 +++ .../src/Auth/Verifier.php | 33 +++ .../src/Auth/WechatPay2Credentials.php | 147 ++++++++++ .../src/Auth/WechatPay2Validator.php | 120 ++++++++ .../src/Credentials.php | 39 +++ .../src/Util/AesUtil.php | 85 ++++++ .../src/Util/MediaUtil.php | 146 ++++++++++ .../src/Util/PemUtil.php | 108 ++++++++ .../src/Util/SensitiveInfoCrypto.php | 161 +++++++++++ .../src/Validator.php | 32 +++ .../src/WechatPayMiddleware.php | 190 +++++++++++++ .../src/WechatPayMiddlewareBuilder.php | 125 +++++++++ .../tool/CertificateDownloader.php | 218 +++++++++++++++ .../tool/README.md | 45 +++ sql/order.sql | 4 +- sql/receiver/order.sql | 4 + sql/receiver/services.sql | 28 ++ www/wxpay/AesUtil.php | 68 +++++ www/wxpay/index.php | 29 ++ 63 files changed, 3314 insertions(+), 321 deletions(-) create mode 100644 api/config/wxpay.php create mode 100644 api/controllers/wxapp/liche/Wxnotify_v3.php create mode 100644 api/controllers/wxapp/licheb/Services.php create mode 100644 common/libraries/WechatPayV3.php create mode 100644 common/models/receiver/Receiver_service_package_model.php create mode 100644 common/models/receiver/Receiver_services_model.php create mode 120000 common/vendor/bin/CertificateDownloader.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/.gitignore create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/LICENSE create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/README.md create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/composer.json create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/CertificateVerifier.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/PrivateKeySigner.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/SignatureResult.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/Signer.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/Verifier.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/WechatPay2Credentials.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Auth/WechatPay2Validator.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Credentials.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Util/AesUtil.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Util/MediaUtil.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Util/PemUtil.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Util/SensitiveInfoCrypto.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/Validator.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/WechatPayMiddleware.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/src/WechatPayMiddlewareBuilder.php create mode 100755 common/vendor/wechatpay/wechatpay-guzzle-middleware/tool/CertificateDownloader.php create mode 100644 common/vendor/wechatpay/wechatpay-guzzle-middleware/tool/README.md create mode 100644 sql/receiver/services.sql create mode 100644 www/wxpay/AesUtil.php create mode 100644 www/wxpay/index.php diff --git a/admin/controllers/receiver/Orders.php b/admin/controllers/receiver/Orders.php index fae18113..8cc2a0ee 100644 --- a/admin/controllers/receiver/Orders.php +++ b/admin/controllers/receiver/Orders.php @@ -301,7 +301,7 @@ class Orders extends HD_Controller{ $update['if_ins'] = $params['if_ins'] ? 1:0; if($params['bx_imgs']){ $imgs = explode(',',$params['bx_imgs']); - $update['bx_imgs'] = json_encode($imgs,JSON_UNESCAPED_UNICODE); + $update['ins_img'] = json_encode($imgs,JSON_UNESCAPED_UNICODE); } if($agent){ $result = $this->order_agents_model->update($update,['id'=>$agent['id']]); diff --git a/api/config/wxpay.php b/api/config/wxpay.php new file mode 100644 index 00000000..e71fa49d --- /dev/null +++ b/api/config/wxpay.php @@ -0,0 +1,19 @@ + 'wxe66f905683582780', //服应用ID + 'mchid' => '1612096731', //商户号 + 'merchantSerialNumber' => '761590F1FF6DFC2466894F96E2DE1169CE644A74', //商户号API证书序列号 + 'merchantPrivateKey' => '/home/dev28/liche/api/third_party/WXconfig/apiclient_key.pem', //商户私钥路径 + 'wechatpayCertificate' => '/home/dev28/liche/api/third_party/WXconfig/apiclient_wechatpay.pem', //微信支付平台证书路径 + 'sub_appid' => 'wx98e64c11aac45966' //子商户应用ID +]; + diff --git a/api/controllers/wxapp/app/Payment.php b/api/controllers/wxapp/app/Payment.php index 0b7e35cb..8b71a56c 100644 --- a/api/controllers/wxapp/app/Payment.php +++ b/api/controllers/wxapp/app/Payment.php @@ -28,17 +28,52 @@ class Payment extends Wxapp{ if($row['status']>1){ throw new Exception('订单已支付', API_CODE_FAIL); } - if($row['status']=1 && !$row['status_detail']!=11){ + if($row['status']=1 && $row['status_detail']!=11){ throw new Exception('订单已过期', API_CODE_FAIL); } - if($row['total_price']>0){ $url = http_host_com('api'); - $notify_url = $url."/wxapp/{$this->app_key}/wxnotify"; + $notify_url = $url."/wxapp/{$this->app_key}/wxnotify_v3"; if($this->uid<=10){ $row['total_price'] = 0.01; } - $result = $this->pay($sid, $row['total_price'], $this->session['openid'], $row['item_title'], $notify_url); + + $this->config->load('wxpay'); + $wx_config = $this->config->item('default'); + $this->load->library('WechatPayV3'); + $params = [ + 'merchantId' => $wx_config['mchid'], + 'merchantSerialNumber' => $wx_config['merchantSerialNumber'], + 'merchantPrivateKey' => $wx_config['merchantPrivateKey'], + 'wechatpayCertificate' => $wx_config['wechatpayCertificate'], + ]; + $WechatPayV3 = new WechatPayV3($params); + $n_time = time(); + $json = [ + 'sp_appid' => $wx_config['appid'], + 'sp_mchid' => $wx_config['mchid'], + 'sub_appid' => $wx_config['sub_appid'], + 'sub_mchid' => $row['mch_id'], + 'description' => $row['item_title'], + 'out_trade_no' => $row['sid'], + 'notify_url' => $notify_url, + 'settle_info' => [ + 'profit_sharing' => true + ], + 'amount' => [ + 'total' => $row['total_price']*100, + ], + 'payer' => [ + 'sub_openid' => $this->session['openid'] + ], + ]; + $noncestr = getNonceStr(20); + $resq = $WechatPayV3->unifiedOrder($json,$json['sub_appid'],$noncestr); + if(!$resq['code']){ + debug_log("[下单失败]:" . $resq['msg'], 'underorder.log','wxpay'); + throw new Exception('微信下单失败', API_CODE_FAIL); + } + $result = $resq['data']; }else{ $this->load->service('apporder/payment_service', array('app_id' => $this->app_id)); $result = $this->payment_service->after_pay($sid); @@ -46,44 +81,4 @@ class Payment extends Wxapp{ return $result; } - /** - * 支付方法 - * @param $trade_no - * @param $price - * @param $openid - * @param $body - * @param $notify_url - * @param $attach - * @param $detail - * @return bool|json数据,可直接填入js函数作为参数|mixed - * @throws WxPayException - */ - private function pay($trade_no,$price,$openid,$body,$notify_url,$attach = '',$detail = ''){ - if(!$body){return false;} - require_once APPPATH."third_party/WXconfig/liche_WxPay.Config.php"; - require_once APPPATH."third_party/WXpay/WxPay.Api.php"; - $config = new WxPayConfig(); - $wxpay = new WxPayUnifiedOrder(); - $wxpay->SetVersion('1.0'); - $wxpay->SetBody($body); //简单描述 - $attach && $wxpay->SetAttach($attach); //附加信息 - $wxpay->SetNotify_url($notify_url); - $wxpay->SetOut_trade_no($trade_no); //订单号 - $wxpay->SetTotal_fee($price * 100); //支付价格 - $wxpay->SetTime_start(date("YmdHis")); //交易起始时间 - $wxpay->SetTime_expire($out_time); //交易结束时间 - $wxpay->SetTrade_type("JSAPI"); //设置交易类型 - $wxpay->SetOpenid($openid); //openid - $detail && $wxpay->SetDetail($detail); - $return = WxPayApi::unifiedOrder($config, $wxpay); //统一支付 - if($return['result_code'] == 'SUCCESS') { - $wxpay_api = new WxPayJsApiPay(); - $jsApiParameters = WxPayApi::GetJsApiParameters($return, $config, $wxpay_api); - $jsApiParameters = json_decode($jsApiParameters, true); - return $jsApiParameters; - }else{ - throw new Exception($return['return_msg']?$return['return_msg'].$return['err_code_des']:$return['return_msg'], API_CODE_FAIL); - } - } - } diff --git a/api/controllers/wxapp/app/Series.php b/api/controllers/wxapp/app/Series.php index 4af311fc..8ac60586 100644 --- a/api/controllers/wxapp/app/Series.php +++ b/api/controllers/wxapp/app/Series.php @@ -60,7 +60,7 @@ class Series extends Wxapp{ return $list; } //获取车系属性 - public function get_attrs(){ + protected function get_attrs(){ $s_id = $this->input_param('id'); $type = $this->input_param('type'); $page = $this->input_param('page'); @@ -85,10 +85,6 @@ class Series extends Wxapp{ 'id' => $val['id'], 'title' => $val['title'] ]; - if($val['type']==1){ - $temp['price'] = $jsodnata['price']; - $temp['deposit'] = $jsodnata['deposit']; - } $lists[] = $temp; } } @@ -98,4 +94,25 @@ class Series extends Wxapp{ ]; return $data; } + + //获取车型信息信息 + protected function get_info(){ + $s_id = $this->input_param('car_id'); + $v_id = $this->input_param('v_id'); + $color_id = $this->input_param('color_id'); + $incolor_id = $this->input_param('incolor_id'); + $this->load->model('auto/auto_cars_model'); + + if(!$s_id || !$v_id || !$color_id || !$incolor_id){ + throw new Exception('参数错误', ERR_PARAMS_ERROR); + } + + $attrs = "{$color_id}_{$v_id}_{$incolor_id}"; + $car = $this->auto_cars_model->get(['attrs'=>$attrs,'s_id'=>$s_id]); + $data = [ + 'price' => $car['price_car'] ? $car['price_car'] : 0, + 'deposit' => $car['price_book'] ? $car['price_book'] : 0 + ]; + return $data; + } } diff --git a/api/controllers/wxapp/liche/Contract.php b/api/controllers/wxapp/liche/Contract.php index 2774ef98..ed1cc870 100644 --- a/api/controllers/wxapp/liche/Contract.php +++ b/api/controllers/wxapp/liche/Contract.php @@ -23,6 +23,9 @@ class Contract extends Wxapp{ $this->load->model('receiver/order/receiver_order_ckcars_model','ckcars_model'); $this->load->model('receiver/order/receiver_order_bills_model','bills_model'); $this->load->model('receiver/order/receiver_order_deliverys_model','deliverys_model'); + + $this->load->model("biz/biz_model"); + $this->load->model("sys/sys_company_model"); } protected function get(){ @@ -43,9 +46,7 @@ class Contract extends Wxapp{ list($h5_url,$title) = $this->orders_entity->get_contract_h5($id,$type,1); list($pdf2img_url,$title) = $this->orders_entity->get_contract_h5($id,$type); if(!$contract){ - $cid = create_order_no(350200,$this->app_key,2); $add_data = [ - 'cid' => $cid, 'o_id' => $id, 'type' => $type, 'c_time' => time() @@ -54,12 +55,15 @@ class Contract extends Wxapp{ if(!$con_id){ throw new Exception('创建合同失败', API_CODE_INVILD_PARAM); } + $cid = create_contract_no(350200,$con_id,$type); + $this->contracts_model->update(['cid'=>$cid],['id'=>$con_id]); //html转pdf $save_path = 'data/contracts/'.date('Ymd'); $filename = $cid.'.pdf'; $c_res = $this->pdf->html2pdf($pdf2img_url,FCPATH.$save_path,$filename); $update = [ - 'file' => $save_path.'/'.$filename + 'file' => $save_path.'/'.$filename, + 'cid' => $cid ]; $this->contracts_model->update($update,['id'=>$con_id]); }else{ @@ -91,6 +95,7 @@ class Contract extends Wxapp{ $img = $this->input_param('img'); $row = $this->contracts_model->get(['type'=>$type,'o_id'=>$id]); + $order = $this->orders_model->get(['id'=>$id],'biz_id'); if(!$row['file'] || !$img){ throw new Exception('参数错误', API_CODE_INVILD_PARAM); @@ -98,20 +103,28 @@ class Contract extends Wxapp{ if($row['status']==1){ throw new Exception('已签名', API_CODE_INVILD_PARAM); } + //获取公司印章 + $biz = $this->biz_model->get(['id'=>$order['biz_id']],'company_id'); + $company = $this->sys_company_model->get(['id'=>$biz['company_id']],'img_seal,id'); + $img_seal = $company['img_seal'] ? build_qiniu_image_url($company['img_seal']) : ''; + if(!$img_seal){ + throw new Exception('公司公章未上传', API_CODE_FAIL); + } //pdf转图片 $pdf_url = http_host_com('api').'/'.$row['file']; $this->load->library('pdf'); - $pdf = new Pdf(); + $pdf = new Pdf(); //正式 $imgs = $pdf->pdf2img($pdf_url); if(!$imgs){ throw new Exception('签名失败,图片转换失败', API_CODE_INVILD_PARAM); } $this->load->library('receiver/sign_entity'); + $sign_entity = new Sign_entity(['comp_img'=>$img_seal]); switch($type){ case 0: //整车 $sign_img = array_pop($imgs); - $res = $this->sign_entity->merge($sign_img,$img,1050,230,300); + $res = $sign_entity->merge($sign_img,$img,1070,500,230); if(!$res){ throw new Exception('签名失败', API_CODE_INVILD_PARAM); } @@ -131,7 +144,7 @@ class Contract extends Wxapp{ break; case 1: //协议 $sign_img = array_pop($imgs); - $res = $this->sign_entity->merge($sign_img,$img,1050,1600,300); + $res = $sign_entity->merge($sign_img,$img,1050,1650,300); if(!$res){ throw new Exception('签名失败', API_CODE_INVILD_PARAM); } @@ -153,7 +166,7 @@ class Contract extends Wxapp{ break; case 2: //确认信息 $sign_img = array_pop($imgs); - $res = $this->sign_entity->merge($sign_img,$img,1050,430,300); + $res = $sign_entity->merge($sign_img,$img,1050,430,450); if(!$res){ throw new Exception('签名失败', API_CODE_INVILD_PARAM); } @@ -167,10 +180,9 @@ class Contract extends Wxapp{ $result = $this->contracts_model->update($update,['id'=>$row['id']]); if($result){ $this->ckcars_model->update(['status'=>2],['o_id'=>$id]); - $this->orders_model->update(['status'=>3],['id'=>$id]); - if(!$this->bills_model->count(['o_id'=>$id])){ - $this->bills_model->add(['o_id'=>$id,'c_time'=>time()]); - } + //生成支付订单 + $this->load->library('receiver/orders_entity'); + $this->orders_entity->check_finish($id,$this->app_id,$this->session); throw new Exception('签名成功', API_CODE_SUCCESS); }else{ throw new Exception('签名失败', API_CODE_INVILD_PARAM); @@ -178,7 +190,7 @@ class Contract extends Wxapp{ break; case 3: //车辆交接 $sign_img = array_pop($imgs); - $res = $this->sign_entity->merge($sign_img,$img,400,1400,'','',false); + $res = $sign_entity->merge($sign_img,$img,1050,1500,350); if(!$res){ throw new Exception('签名失败', API_CODE_INVILD_PARAM); } diff --git a/api/controllers/wxapp/liche/Order.php b/api/controllers/wxapp/liche/Order.php index c5133dd6..958bd0e2 100644 --- a/api/controllers/wxapp/liche/Order.php +++ b/api/controllers/wxapp/liche/Order.php @@ -9,13 +9,19 @@ defined('WXAPP_APP') OR exit('No direct script access allowed'); */ require_once APPPATH . 'controllers/wxapp/Wxapp.php'; class Order extends Wxapp{ - + private $type_array = [ + 3 => '定金', + 4 => '定金', + 5 => '委托服务费', + 6 => '首付', + ]; public function __construct($inputs, $app_key){ parent::__construct($inputs, $app_key); $this->login_white = array();//登录白名单 $this->uid = $this->session['uid']; $this->load->model('apporder/order_purchase_model'); + $this->load->model('receiver/order/receiver_orders_model'); } /** @@ -34,7 +40,7 @@ class Order extends Wxapp{ if($type){ $where['status'] = $type; } - $fileds = 'id,sid,item_title,total_price,jsondata,status,status_detail'; + $fileds = 'id,sid,item_title,total_price,jsondata,status,status_detail,type'; $rows = $this->order_purchase_model->select($where,'id desc',$page,$size,$fileds); $total = $this->order_purchase_model->count($where); $list = []; @@ -63,10 +69,20 @@ class Order extends Wxapp{ ]; } } + $type_name = '金额'; + if($this->type_array[$val['type']]){ + if($val['type']==6){ + $r_order = $this->receiver_orders_model->get(['id'=>$cf_id],'payway'); + $type_name = $r_order['payway'] ? '尾款' : '首付'; + }else{ + $type_name = $this->type_array[$val['type']]; + } + } $list[] = [ 'id' => $val['id'], 'sid' => $val['sid'], 'cover' => $jsondata['cover'] ? build_qiniu_image_url($jsondata['cover']) : '', + 'type_name' => $type_name, 'title' => $val['item_title'], 'price' => $val['total_price'], 'color' => isset($car['color']['jsondata']['title']) ? $car['color']['jsondata']['title'] : "", diff --git a/api/controllers/wxapp/liche/User.php b/api/controllers/wxapp/liche/User.php index 41ed451f..c7cdadbf 100644 --- a/api/controllers/wxapp/liche/User.php +++ b/api/controllers/wxapp/liche/User.php @@ -307,7 +307,12 @@ class User extends Wxapp{ if($ckcar_row['status']){ if($val['id']==5){ $state = 2; - $progressOpt = ['title'=> '确认车辆','url'=>'/pages/mine/signContract/queRen?id='.$row['id']]; + if($ckcar_row['status']==2){ //未支付 + $title = $row['payway'] ? '去支付尾款' : '去支付首付'; + $progressOpt = ['title'=> $title,'url'=>'/pages/order/index']; + }else{ + $progressOpt = ['title'=> '确认车辆','url'=>'/pages/mine/signContract/queRen?id='.$row['id']]; + } }else{ $state = 1; } diff --git a/api/controllers/wxapp/liche/Wxnotify.php b/api/controllers/wxapp/liche/Wxnotify.php index ceb646b9..d94bb68c 100755 --- a/api/controllers/wxapp/liche/Wxnotify.php +++ b/api/controllers/wxapp/liche/Wxnotify.php @@ -7,7 +7,6 @@ */ //微信支付回调 require_once APPPATH."third_party/WXpay/WxPay.Api.php"; -require_once APPPATH."third_party/WXconfig/liche_WxPay.Config.php"; class Wxnotify extends CI_Controller{ private $log_file = 'liche_pay.log'; @@ -18,12 +17,21 @@ class Wxnotify extends CI_Controller{ parent::__construct(); $this->load->model('app/app_wxpaylog_model', 'wxpaylog_model'); $this->load->model('apporder/order_purchase_model','purchase_model'); + $input = file_get_contents("php://input"); + debug_log("[info] ". __FUNCTION__ . "# input:" . $input, $this->log_file); + //xml 转数组 + $obj = simplexml_load_string($input,"SimpleXMLElement", LIBXML_NOCDATA); + $obj_array = json_decode(json_encode($obj),true); + $mch_id = $obj_array['mch_id']; + $config_file = APPPATH."third_party/WXconfig/liche_WxPay.Config.php"; + if(!file_exists($config_file)){ + debug_log("[error] ". __FUNCTION__ . ":商户配置文件不存在", $this->log_file); + exit(); + } try{ //如果返回成功则验证签名 $config = new WxPayConfig(); $wxpay = new WxPayNotifyResults(); - $input = file_get_contents("php://input"); - debug_log("[info] ". __FUNCTION__ . "# input:" . $input, $this->log_file); $result = WxPayNotifyResults::Init($config, $input); $this->notify = $result->GetValues(); }catch (WxPayException $e){ diff --git a/api/controllers/wxapp/liche/Wxnotify_v3.php b/api/controllers/wxapp/liche/Wxnotify_v3.php new file mode 100644 index 00000000..2d49eaea --- /dev/null +++ b/api/controllers/wxapp/liche/Wxnotify_v3.php @@ -0,0 +1,77 @@ +load->model('app/app_wxpaylog_model', 'wxpaylog_model'); + $this->load->model('apporder/order_purchase_model','purchase_model'); + + $input = file_get_contents('php://input'); + debug_log("[info] ". __FUNCTION__ . "# input:" . $input, $this->log_file,$this->log_dir); + $this->notify_data = json_decode($input,true); + } + + public function index(){ + $client = new GuzzleHttp\Client(); + try { + $resp = $client->request('POST', $this->desc_url, ['form_params' => $this->notify_data]); + $result = json_decode($resp->getBody(),true); + if(!$result['code']){ //解密失败 + debug_log("[error] ". __FUNCTION__ . "# 解密失败:" . $resp->getBody(), $this->log_file,$this->log_dir); + }else{ + debug_log("[info] ". __FUNCTION__ . "# 解密成功:" . $resp->getBody(), $this->log_file,$this->log_dir); + $sid = $result['data']['out_trade_no']; + if($sid){ + debug_log("[start] ". __FUNCTION__ . ": sid:".$sid, $this->log_file,$this->log_dir); + $order = $this->purchase_model->get(array('sid'=>$sid,'app_id'=>$this->app_id)); + if(!$order){ + debug_log("[error] ". __FUNCTION__ . ":{$sid}_订单不存在", $this->log_file,$this->log_dir); + } + //执行失败 + $add = array( + 'app_id' => $this->app_id, + 'sid' => $sid?$sid:0, + 'trade_no' => $result['data']['transaction_id'], + 'notify_param' => json_encode($result['data'],JSON_UNESCAPED_UNICODE) + ); + + $ret = $this->wxpaylog_model->add($add); + if(!$ret){ + debug_log("[error] ". __FUNCTION__ . ": sql:".$this->wxpaylog_model->db->last_query(), $this->log_file,$this->log_dir); + } + if($result['data']['trade_state'] != 'SUCCESS'){ //支付失败 + debug_log("[error] ". __FUNCTION__ . ":支付失败,sid={$sid},app_id=", $this->log_file,$this->log_dir); + }else{ //支付成功 + $this->load->service('apporder/payment_service', array('app_id' => $this->app_id)); + $result = $this->payment_service->after_pay($sid,$result['data']['amount']['payer_total']/100); + if($result['code']){ + debug_log("[success] ". __FUNCTION__ . ":操作成功", $this->log_file,$this->log_dir); + }else{ + debug_log("[error] ". __FUNCTION__ . ":".$result['msg'], $this->log_file,$this->log_dir); + } + } + debug_log("[finish] ". __FUNCTION__ . ": sid:".$sid, $this->log_file,$this->log_dir); + }else{ + debug_log("[finish] ". __FUNCTION__ . ": 参数错误:".json_encode($result,JSON_UNESCAPED_UNICODE), $this->log_file,$this->log_dir); + } + } + } catch (RequestException $e) { + debug_log("[error] ". __FUNCTION__ . "# 请求失败:" . $e->getResponse(), $this->log_file,$this->log_dir); + } + echo json_encode(['code'=>'SUCCESS','message'=>'成功'],JSON_UNESCAPED_UNICODE); + } + +} diff --git a/api/controllers/wxapp/licheb/Cusorder.php b/api/controllers/wxapp/licheb/Cusorder.php index 5cbcb4aa..5c3d21e0 100644 --- a/api/controllers/wxapp/licheb/Cusorder.php +++ b/api/controllers/wxapp/licheb/Cusorder.php @@ -23,6 +23,10 @@ class Cusorder extends Wxapp{ $this->load->model('receiver/order/receiver_order_signs_model','order_signs_model'); $this->load->model('receiver/order/receiver_order_bills_model','order_bills_model'); $this->load->model('receiver/order/receiver_order_deliverys_model','order_deliverys_model'); + + $this->load->model('receiver/receiver_services_model','services_model'); + $this->load->model('receiver/receiver_service_package_model','package_model'); + $this->load->model('auto/auto_series_model'); $this->load->model('auto/auto_brand_model'); $this->load->model('auto/auto_attr_model'); @@ -47,6 +51,11 @@ class Cusorder extends Wxapp{ $price = $this->input_param('price'); $deposit = $this->input_param('deposit'); $payway = $this->input_param('payway'); + $pack_id = $this->input_param('pack_id'); + $main_type = $this->input_param('main_type'); + $ifentrust = $this->input_param('ifentrust'); + $entrust_name = $this->input_param('entrust_name'); + $entrust_idcard = $this->input_param('entrust_idcard'); $row = $this->customers_model->get(['id'=>$cus_id]); $series_row = $this->auto_series_model->get(['id'=>$car_id]); @@ -100,6 +109,16 @@ class Cusorder extends Wxapp{ 'c_time' => time() ]; $payway && $data['payway'] = 1; + $pack_id && $data['pack_id'] = $pack_id; + $main_type && $data['main_type'] = 1; + if($ifentrust){ + $data['ifentrust'] = 1; + $info_json = [ + 'entrust_name' => $entrust_name, + 'entrust_idcard' => $entrust_idcard + ]; + $data['info_json'] = json_encode($info_json,JSON_UNESCAPED_UNICODE); + } $o_id = $this->orders_model->add($data); if($o_id){ $sign_data = [ @@ -117,6 +136,7 @@ class Cusorder extends Wxapp{ protected function put(){ $id = $this->input_param('id'); $payway = $this->input_param('payway'); + $pack_id = $this->input_param('pack_id'); $row = $this->orders_model->get(['id'=>$id]); if(!$row){ throw new Exception('订单不存在', ERR_PARAMS_ERROR); @@ -125,13 +145,13 @@ class Cusorder extends Wxapp{ $result = false; $up_data = []; - if(strlen($payway)){ + if(strlen($payway)|| $pack_id){ if($row['status']>0){ throw new Exception('修改失败,已签订合同', ERR_PARAMS_ERROR); } - $up_data['payway'] = $payway; + strlen($payway) && $up_data['payway'] = $payway; + $pack_id && $up_data['pack_id'] = $pack_id; } - if($up_data){ $result = $this->orders_model->update($up_data,['id'=>$id]); } @@ -168,6 +188,11 @@ class Cusorder extends Wxapp{ $keyword = $this->input_param('keyword'); $status = $this->input_param('status'); $ismy = $this->input_param('ismy'); //是否只显示自己 + $page = $this->input_param('page'); + $size = $this->input_param('size'); + + !$page && $page = 1; + !$size && $size = 10; $where = [ 'biz_id' => $biz_id @@ -255,14 +280,28 @@ class Cusorder extends Wxapp{ } $loan_status = $loan['status']>0 ? 2 : 1; } - + $pack_title = ''; + if($row['pack_id']){ + $pack_row = $this->package_model->get(['id'=>$row['pack_id']]); + $srv_rows = ''; + $pack_row['srv_ids'] && $srv_rows = $this->services_model->select(["id in ({$pack_row['srv_ids']})"=>null],'','','','title'); + $srv_rows && $pack_title = implode('+',array_column($srv_rows,'title')); + } $car_data = [ '车辆名称' => $brand['name'].$series['name'], '车辆级别' => $version, '颜色' => $color, '车辆合同售价' => $row['price'], - '定金' => $row['deposit'] + '定金' => $row['deposit'], + '代办包' => $pack_title, + '购车主体' => $row['main_type'] ? '公司' : '个人', + '是否委托' => $row['ifentrust'] ? '是' : '否', ]; + if($row['ifentrust']){ + $info_json = json_decode($row['info_json'],true); + $car_data['委托人姓名'] = $info_json['entrust_name'] ? $info_json['entrust_name'] : ''; + $car_data['委托人身份证'] = $info_json['entrust_idcard'] ? $info_json['entrust_idcard'] : ''; + } //开票信息 $bill_status = 0; $bill_data = []; @@ -297,7 +336,8 @@ class Cusorder extends Wxapp{ 'loan_data' => $loan_data, 'bill_status' => $bill_status, 'bill_data' => $bill_data, - 'ckcar_status' => $ckcar_status + 'ckcar_status' => $ckcar_status, + 'pack_id' => $row['pack_id'] ]; return $data; } diff --git a/api/controllers/wxapp/licheb/Customerlogs.php b/api/controllers/wxapp/licheb/Customerlogs.php index e1e6d974..185d5884 100644 --- a/api/controllers/wxapp/licheb/Customerlogs.php +++ b/api/controllers/wxapp/licheb/Customerlogs.php @@ -37,11 +37,18 @@ class Customerlogs extends Wxapp{ $count = $this->customer_oplogs_model->count($where); $lists = []; if($count){ - $rows = $this->customer_oplogs_model->select($where,'id desc',$page,$size,'log,uname,type,c_time'); + $rows = $this->customer_oplogs_model->select($where,'id desc',$page,$size,'log,uname,type,c_time,imgs'); foreach($rows as $key => $val){ $record = ''; $second = 0; $content = $val['log']; + $img_json = json_decode($val['imgs'],true); + $imgs = []; + if($img_json){ + foreach($img_json as $val2){ + $imgs[] = build_qiniu_image_url($val2); + } + } if($val['type']==2){ $rec_row = $this->receiver_xz_model->get(['id'=>$val['log']],'rec_url,duration'); $content = '拨打电话'; @@ -53,6 +60,7 @@ class Customerlogs extends Wxapp{ 'content' => "【{$val['uname']}】".$content, 'record_url' => $record, 'second' => $second, + 'imgs' => $imgs, 'c_time' => date('Y.m.d',$val['c_time']) ]; } diff --git a/api/controllers/wxapp/licheb/Protocol.php b/api/controllers/wxapp/licheb/Protocol.php index 661dd1b1..686f2137 100644 --- a/api/controllers/wxapp/licheb/Protocol.php +++ b/api/controllers/wxapp/licheb/Protocol.php @@ -16,29 +16,57 @@ class Protocol extends CI_Controller{ $this->load->model('receiver/order/receiver_order_agents_model','agents_model'); $this->load->model('receiver/order/receiver_order_loans_model','loans_model'); $this->load->model('receiver/order/receiver_order_ckcars_model','ckcars_model'); + $this->load->model('receiver/receiver_service_package_model','package_model'); + $this->load->model('receiver/receiver_services_model','services_model'); + $this->load->model('auto/auto_series_model'); $this->load->model('auto/auto_brand_model'); + $this->load->model('auto/auto_cars_model'); + + $this->load->model("biz/biz_model"); + $this->load->model('area_model'); + $this->load->model("sys/sys_company_model"); $this->load->model("items/items_model"); + $this->load->model('apporder/order_purchase_model','purchase_model'); } //整车合同 public function car(){ $wxapp = $this->input->get('wxapp'); - //$id = $this->input->get('id'); - //$row = $this->orders_model->get(['id'=>$id]); - //$contract = $this->contracts_model->get(['o_id'=>$id,'type'=>0]); - //if($row){ - // $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); - // $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); - // $car_json = json_decode($row['car_json'],true); - // $color = isset($car_json['color']) ? $car_json['color']['title'] : ''; - // $version = isset($car_json['version']) ? $car_json['version']['title'] : ''; - // $row['brand_name'] = $brand['name'].$series['name'].' '.$version; - // $row['color'] = $color; - //} - //$row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); - //$row['price_rmb'] = num_to_rmb($row['price']); - //$row['cid'] = $contract['cid']; + $id = $this->input->get('id'); + $row = $this->orders_model->get(['id'=>$id]); + $contract = $this->contracts_model->get(['o_id'=>$id,'type'=>0]); + if($row){ + $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); + $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); + $car_json = json_decode($row['car_json'],true); + $row['color'] = isset($car_json['color']) ? $car_json['color']['title'] : ''; + $row['incolor'] = isset($car_json['incolor']) ? $car_json['incolor']['title'] : ''; + $row['version'] = isset($car_json['version']) ? $car_json['version']['title'] : ''; + $row['brand_name'] = $brand['name']; + $row['series_name'] = $series['name']; + //获取门店信息 + $biz = $this->biz_model->get(['id'=>$row['biz_id']]); + $city = $this->area_model->get(['county_id'=>$biz['county_id']],'city_name,county_name'); + $row['address'] = $city['city_name'].$city['county_name'].' '.$biz['address']; + $company = $this->sys_company_model->get(['id'=>$biz['company_id']]); + $row['company'] = $company; + //获取选择代办包 + $pack_row = $this->package_model->get(['id'=>$row['pack_id']],'srv_ids'); + $srv_total = count(explode(',',$pack_row['srv_ids'])); + if($srv_total==4){ + $row['give_time'] = 30; + }elseif($srv_total==3){ + $row['give_time'] = 45; + }else{ + $row['give_time'] = 60; + } + } + $row['info_json'] = json_decode($row['info_json'],true); + $row['price_rmb'] = num_to_rmb($row['price']); + $row['cid'] = $contract['cid']; + $row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); + $row['dep_price'] = number_format(5000,2); //定金 $folder = $wxapp ? 'protocol' : 'html2pdf'; $this->load->view("wxapp/licheb/{$folder}/car",$row); } @@ -46,31 +74,64 @@ class Protocol extends CI_Controller{ //代理合同 public function agent(){ $wxapp = $this->input->get('wxapp'); - //$id = $this->input->get('id'); - //$row = $this->orders_model->get(['id'=>$id]); - //$contract = $this->contracts_model->get(['o_id'=>$id,'type'=>1]); - //$row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); - //$row['cid'] = $contract['cid']; + $id = $this->input->get('id'); + $row = $this->orders_model->get(['id'=>$id]); + $contract = $this->contracts_model->get(['o_id'=>$id,'type'=>1]); + $total_price = 0; + if($row){ + //获取门店信息 + $biz = $this->biz_model->get(['id'=>$row['biz_id']]); + $company = $this->sys_company_model->get(['id'=>$biz['company_id']]); + $row['company'] = $company; + //获取服务包 + $packs = $this->package_model->get(['id'=>$row['pack_id']],'srv_ids'); + if($packs['srv_ids']){ + $row['services'] = $services = $this->services_model->select(["id in ({$packs['srv_ids']})"],'','','','title,field_name'); + } + $attrs = "{$row['cor_id']}_{$row['v_id']}_{$row['incor_id']}"; + $car = $this->auto_cars_model->get(['attrs'=>$attrs,'s_id'=>$row['s_id']]); + //获取挂牌价 + $this->load->model('sys/sys_city_model'); + $city = $this->sys_city_model->get(['city_id'=>$biz['city_id']],'fee_carno'); + $car['fee_carno'] = $city['fee_carno']; + if($services){ + foreach($services as $key=>$val){ + $field_arr = explode('.',$val['field_name']); + if($car[$field_arr[1]]){ + $total_price += $car[$field_arr[1]]; + } + } + } + } + $row['total_price'] = $total_price; + $row['info_json'] = json_decode($row['info_json'],true); + $row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); + $row['cid'] = $contract['cid']; $folder = $wxapp ? 'protocol' : 'html2pdf'; $this->load->view("wxapp/licheb/{$folder}/agent",$row); } //车辆信息确认单 public function car_ck(){ $wxapp = $this->input->get('wxapp'); - //$id = $this->input->get('id'); - //$row = $this->orders_model->get(['id'=>$id]); - //if($row){ - // $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); - // $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); - // $car_json = json_decode($row['car_json'],true); - // $version = isset($car_json['version']) ? $car_json['version']['title'] : ''; - // $row['brand_name'] = $brand['name'].$series['name'].' '.$version; - //} - //$contract = $this->contracts_model->get(['o_id'=>$id,'type'=>2]); - //$items = $this->items_model->get(['id'=>$row['item_id']],'vin'); - //$row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); - //$row['cid'] = $contract['cid']; - //$row['vin'] = $items['vin']; + $id = $this->input->get('id'); + $row = $this->orders_model->get(['id'=>$id]); + if($row){ + $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); + $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); + $car_json = json_decode($row['car_json'],true); + $version = isset($car_json['version']) ? $car_json['version']['title'] : ''; + $row['brand_name'] = $brand['name'].$series['name'].' '.$version; + //获取门店信息 + $biz = $this->biz_model->get(['id'=>$row['biz_id']]); + $company = $this->sys_company_model->get(['id'=>$biz['company_id']]); + $row['company'] = $company; + } + $contract = $this->contracts_model->get(['o_id'=>$id,'type'=>2]); + $items = $this->items_model->get(['id'=>$row['item_id']],'vin'); + $row['info_json'] = json_decode($row['info_json'],true); + $row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); + $row['cid'] = $contract['cid']; + $row['vin'] = $items['vin']; $folder = $wxapp ? 'protocol' : 'html2pdf'; $this->load->view("wxapp/licheb/{$folder}/car_ck",$row); } @@ -78,34 +139,64 @@ class Protocol extends CI_Controller{ public function car_fh(){ $this->load->model('app/licheb/app_licheb_users_model'); $wxapp = $this->input->get('wxapp'); - //$id = $this->input->get('id'); + $id = $this->input->get('id'); - //$row = $this->orders_model->get(['id'=>$id]); - //$agent = $this->agents_model->get(['o_id'=>$id]); - //$contract = $this->contracts_model->get(['o_id'=>$id,'type'=>3]); - //$items = $this->items_model->get(['id'=>$row['item_id']],'vin'); - //if($row){ - // //贷款 - // if(!$row['payway']){ - // $row['loan'] = $this->loans_model->get(['o_id'=>$id]); - // } - // $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); - // $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); - // $car_json = json_decode($row['car_json'],true); - // $info_json = json_decode($row['info_json'],true); - // $color = isset($car_json['color']) ? $car_json['color']['title'] : ''; - // $version = isset($car_json['version']) ? $car_json['version']['title'] : ''; - // $row['brand_name'] = $brand['name'].$series['name'].' '.$version; - // $row['color'] = $color; - // $row['cardid'] = $info_json['cardid']; - // //获取销售 - // $admin = $this->app_licheb_users_model->get(['id'=>$row['admin_id']],'uname'); - // $row['uname'] = $admin['uname']; - //} - //$row['agent'] = $agent; - //$row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); - //$row['cid'] = $contract['cid']; - //$row['vin'] = $items['vin']; + $row = $this->orders_model->get(['id'=>$id]); + $agent = $this->agents_model->get(['o_id'=>$id]); + $contract = $this->contracts_model->get(['o_id'=>$id,'type'=>3]); + $items = $this->items_model->get(['id'=>$row['item_id']],'vin'); + $total_price = 0; + if($row){ + //贷款 + if(!$row['payway']){ + $row['loan'] = $this->loans_model->get(['o_id'=>$id]); + } + $brand = $this->auto_brand_model->get(['id'=>$row['brand_id']],'name'); + $series = $this->auto_series_model->get(['id'=>$row['s_id']],'name'); + $car_json = json_decode($row['car_json'],true); + $row['info_json'] = $info_json = json_decode($row['info_json'],true); + $row['color'] = isset($car_json['color']) ? $car_json['color']['title'] : ''; + $row['incolor'] = isset($car_json['incolor']) ? $car_json['incolor']['title'] : ''; + $row['version'] = isset($car_json['version']) ? $car_json['version']['title'] : ''; + $row['brand_name'] = $brand['name']; + $row['series_name'] = $series['name']; + $row['cardid'] = $info_json['cardid']; + //获取门店信息 + $biz = $this->biz_model->get(['id'=>$row['biz_id']]); + $company = $this->sys_company_model->get(['id'=>$biz['company_id']]); + $row['company'] = $company; + //获取服务包 + $packs = $this->package_model->get(['id'=>$row['pack_id']],'srv_ids'); + if($packs['srv_ids']){ + $row['services'] = $services = $this->services_model->select(["id in ({$packs['srv_ids']})"],'','','','title,field_name'); + } + $attrs = "{$row['cor_id']}_{$row['v_id']}_{$row['incor_id']}"; + $car = $this->auto_cars_model->get(['attrs'=>$attrs,'s_id'=>$row['s_id']]); + //获取挂牌价 + $this->load->model('sys/sys_city_model'); + $city = $this->sys_city_model->get(['city_id'=>$biz['city_id']],'fee_carno'); + $car['fee_carno'] = $city['fee_carno']; + if($services){ + foreach($services as $key=>$val){ + $field_arr = explode('.',$val['field_name']); + if($car[$field_arr[1]]){ + $total_price += $car[$field_arr[1]]; + } + } + } + $where = [ + 'item_id' => $row['id'], + 'app_id' => 1, + 'status>' => 1 + ]; + $pay = $this->purchase_model->sum('total_price',$where); + $row['pay_price'] = $pay['total_price']; + } + $row['total_price'] = $total_price; + $row['agent'] = $agent; + $row['day'] = $contract ? date('Y年m月d日',$contract['c_time']):date('Y年m月d日'); + $row['cid'] = $contract['cid']; + $row['vin'] = $items['vin']; $folder = $wxapp ? 'protocol' : 'html2pdf'; $this->load->view("wxapp/licheb/{$folder}/car_fh",$row); } diff --git a/api/controllers/wxapp/licheb/Services.php b/api/controllers/wxapp/licheb/Services.php new file mode 100644 index 00000000..2a3cf0a4 --- /dev/null +++ b/api/controllers/wxapp/licheb/Services.php @@ -0,0 +1,54 @@ +login_white = array('get_package');//登录白名单 + $this->load->model('receiver/receiver_services_model','services_model'); + $this->load->model('receiver/receiver_service_package_model','package_model'); + } + //服务包 + protected function get_package(){ + $page = $this->input_param('page'); + $size = $this->input_param('size'); + + !$page && $page = 1; + !$size && $size = 10; + $where = [ + 'status' => 1 + ]; + $count = $this->package_model->count($where); + $list = []; + if($count){ + $rows = $this->package_model->select($where,'id asc',$page,$size); + foreach($rows as $key=>$val){ + $title = ''; + if($val['srv_ids']){ + $s_where = [ + "id in ({$val['srv_ids']})" => null + ]; + $s_rows = $this->services_model->select($s_where,'','','','id,title'); + $s_rows && $title = implode('+',array_column($s_rows,'title')); + } + $list[] = [ + 'id' => $val['id'], + 'title' => $title + ]; + } + } + $data = [ + 'list' => $list, + 'total' => $count + ]; + return $data; + } +} diff --git a/api/third_party/WXconfig/liche_WxPay.Config.php b/api/third_party/WXconfig/liche_WxPay.Config.php index bc9b9388..75af3369 100755 --- a/api/third_party/WXconfig/liche_WxPay.Config.php +++ b/api/third_party/WXconfig/liche_WxPay.Config.php @@ -10,7 +10,7 @@ class WxPayConfig const APPID = 'wx98e64c11aac45966'; const APPSECRET = 'f8eec7be1c87a1c8e40213e144821ec3'; const MCHID = '1611216095'; - const KEY = '53e08ba6735ab9777c0369e0c8ea0f7b'; + const KEY = 'd1ddc03f6178767795dc283e68a80e81'; const SIGN_TYPE = 'MD5'; const NOTIFY_URL = ''; diff --git a/api/views/wxapp/licheb/html2pdf/agent.php b/api/views/wxapp/licheb/html2pdf/agent.php index 26c63c85..a0f1619e 100644 --- a/api/views/wxapp/licheb/html2pdf/agent.php +++ b/api/views/wxapp/licheb/html2pdf/agent.php @@ -31,23 +31,21 @@
| - 品牌: + 品牌:=$brand_name?> | - 车系: + 车系:=$series_name?> | ||||||||||||||||||||
| - 车型: + 车型:=$version?> | - 车身颜色: + 车身颜色:=$color?> | ||||||||||||||||||||
| - 内饰颜色: + 内饰颜色:=$incolor?> |
@@ -68,14 +69,16 @@
车辆单价为车身单价,续航里程为300KM以上的车辆已按扣减国家补贴后的价格结算。不包含车辆购置税、车辆保险费、挂牌杂费等其他费用。乙方如需委托甲方代理上牌、委托运输等服务的,双方应另外签订《委托服务协议》。
第三条付款方式
- 乙方在签订合同时即付定金人民币: 元,定金在结算时冲抵车款。
- 乙方选择一次性付款方式 / 分期付款方式
+ 乙方在签订合同时即付定金人民币:=$dep_price?>元,定金在结算时冲抵车款。
+ 乙方选择=$row['payway']?'一次性付款方式':'分期付款方式'?>
第四条 车辆交付
- 1、交车时间:合同签订之日起 XX天内。
+ 1、交车时间:合同签订之日起 =$give_time?>天内。
+
2、提车方式:乙方自提
- 3、交车地点 : XX市XX区/县 XXXX店 先按当前门店 。
+ 3、交车地点 :=$address?>。
4、交车时里程表记录小于100公里
5、备注:如乙方购买续航里程为300KM以上车辆,上牌性质是公户或营运车辆需确保购买车辆自行驶证注册日期起1年之内行驶2万公里,且至车辆注册之日起2年内不得过户,如因违反此条约使甲方在申领国补过程中造成的损失,一切责任及后果由乙方承担。
第五条 车辆确认
diff --git a/api/views/wxapp/licheb/html2pdf/car_ck.php b/api/views/wxapp/licheb/html2pdf/car_ck.php
index 3da3ec72..e8eb9e37 100644
--- a/api/views/wxapp/licheb/html2pdf/car_ck.php
+++ b/api/views/wxapp/licheb/html2pdf/car_ck.php
@@ -8,15 +8,14 @@
车辆信息确认单
- 甲方(出卖人):(根据门店所属公司)
- 统一社会信用代码:(根据门店所属公司)
- 乙方(买受人):(用户真实姓名)
- (证件类型):证件号码
- 联系电话:(用户手机号码)
- #假如有委托人#
- 委托代理人:(委托人真实姓名)
- (证件类型):委托人证件号码
- 联系电话:(委托人手机号码)
+ 甲方(出卖人):=$company['title']?>
+ 统一社会信用代码:=$company['credit_code']?>
+ 乙方(买受人):=$name?>
+ 联系电话:=$mobile?>
+
+ 委托代理人:=$info_json['entrust_name']?>
+ 委托人身份证:=$info_json['entrust_idcard']?>
+ }?>
乙方于=date('Y年m月d日',$c_time)?>在甲方购买 =$brand_name?> 车辆 1 台,并确认车架号为:=$vin?>。乙方已对上述车辆的厂牌型号、配置等进行认真检查并验收合格无异议。
二、结算信息
- 应付款合计 50100 ,其中包含:车辆价款 50000,委托代办款项 3000
- 已付款合计 50000
+ 应付款合计 =number_format($price+$total_price,2)?> ,其中包含:车辆价款 =number_format($price,2)?>,委托代办款项 =number_format($total_price,2)?>
+ 已付款合计 =number_format($pay_price,2)?>
三、证件资料交接信息
证件信息由后台配置,销售交付时钩选才显示:
diff --git a/api/views/wxapp/licheb/protocol/agent.php b/api/views/wxapp/licheb/protocol/agent.php
index aab1655c..5db66610 100644
--- a/api/views/wxapp/licheb/protocol/agent.php
+++ b/api/views/wxapp/licheb/protocol/agent.php
@@ -12,23 +12,21 @@
委托代理服务协议
- 协议编号:(右对齐,6位地区编码+合同类型id+yymmdd+6位随机数)
- 甲方(出卖人):(根据门店所属公司)
- 统一社会信用代码:(根据门店所属公司)
- 乙方(买受人):(用户真实姓名)
- (证件类型):证件号码
- 联系电话:(用户手机号码)
- #假如有委托人#
- 委托代理人:(委托人真实姓名)
- (证件类型):委托人证件号码
- 联系电话:(委托人手机号码)
+ 协议编号:=$cid?>
+ 甲方(出卖人):=$company['title']?>
+ 统一社会信用代码:=$company['credit_code']?>
+ 乙方(买受人):=$name?>
+ 联系电话:=$mobile?>
+
+ 委托代理人:=$info_json['entrust_name']?>
+ 委托人身份证:=$info_json['entrust_idcard']?>
+ }?>
乙方为节省时间和精力,就甲乙双方《车辆买卖合同》标的的车辆,自愿委托甲方办理下列委托事项,并达成如下协议:
一、委托代办服务事项(乙方授权甲方代办下列事项)
- 代办保险服务 每个车一个价格
- 代办上牌服务 每个地级市一个价格
- 代办金融服务 (公式)
- 购买精品包
- 代办服务总价:(计算出合同总价,含保险)元, 壹千贰百叁十个肆玩万元整,保险费用由乙方直接支付给保险公司。
+
+ =$val['title']?>
+ }?>
+ 代办服务总价:=$total_price?>元,=num_to_rmb($total_price)?>,保险费用由乙方直接支付给保险公司。
二、双方特别约定
1、车牌选号若为代选号牌时,均由甲方电话通知乙方,因乙方未能及时选号等其它原因,甲方有权代理决定并不对最终选号结果负责;若为自选号牌,甲方可配合乙方上牌,但不对最终选号结果负责。
2、乙方委托甲方代办车辆挂牌服务时,乙方应事先办妥机动车车辆保险,投保险种包括但不限于车辆损失险和第三者责任险。甲方在代办服务过程中造成车辆毁损、灭失的,乙方应当先向保险公司索赔,赔付不足部分由甲方予以修复或赔偿。
diff --git a/api/views/wxapp/licheb/protocol/car.php b/api/views/wxapp/licheb/protocol/car.php
index 0c4ff0bf..9166692a 100644
--- a/api/views/wxapp/licheb/protocol/car.php
+++ b/api/views/wxapp/licheb/protocol/car.php
@@ -13,36 +13,37 @@
车辆买卖合同
合同编号:=$cid?>
- 甲方(出卖人):(根据门店所属公司)
- 统一社会信用代码:(根据门店所属公司)
- 乙方(买受人):(用户真实姓名)
- 联系电话:(用户手机号码)
- #假如有委托人#
- 委托代理人:(委托人真实姓名)
- 联系电话:(委托人手机号码)
+ 甲方(出卖人):=$company['title']?>
+ 统一社会信用代码:=$company['credit_code']?>
+ 乙方(买受人):=$name?>
+ 联系电话:=$mobile?>
+
+ 委托代理人:=$info_json['entrust_name']?>
+ 委托人身份证:=$info_json['entrust_idcard']?>
+ }?>
甲、乙双方依据《中华人民共和国合同法》及其他有关法律、法规的规定,在平等、自愿、协商一致的基础上,就买卖汽车事宜,订立本合同。
第一条 车辆基本情况
|