<?php
|
|
namespace app\api\controller\order;
|
|
use app\api\model\order\Cart as CartModel;
|
use app\api\model\order\Order as OrderModel;
|
use app\api\service\order\settled\MasterOrderSettledService;
|
use app\api\controller\Controller;
|
use app\api\model\settings\Message as MessageModel;
|
use app\api\service\pay\PayService;
|
use app\common\enum\order\OrderTypeEnum;
|
use app\common\library\helper;
|
use app\api\model\settings\Setting as SettingModel;
|
use app\api\model\user\UserAddress;
|
use app\common\model\app\App as AppModel;
|
use app\common\model\user\User as UserModel;
|
|
/**
|
* 普通订单
|
*/
|
class Order extends Controller
|
{
|
/**
|
* 订单确认-立即购买
|
*/
|
public function buy()
|
{
|
// 立即购买:获取订单商品列表
|
$params = json_decode($this->postData()['params'], true);
|
|
$user = $this->getUser();
|
/*if($user["user_id"] == 4269){
|
$user = UserModel::detail(660);
|
}*/
|
|
$params['user_id'] = $user['user_id'];
|
$supplierData = OrderModel::getOrderProductListByNow($params);
|
// 实例化订单service
|
$orderService = new MasterOrderSettledService($user, $supplierData, $params);
|
// 获取订单信息
|
$orderInfo = $orderService->settlement();
|
// 订单结算提交
|
if ($orderService->hasError()) {
|
return $this->renderError($orderService->getError());
|
}
|
if ($this->request->isGet()) {
|
// 如果来源是小程序, 则获取小程序订阅消息id.获取支付成功,发货通知.
|
$template_arr = MessageModel::getMessageByNameArr($params['pay_source'], ['order_pay_user', 'order_delivery_user']);
|
//是否显示店铺信息
|
$store_open=SettingModel::getStoreOpen();
|
// 是否开启支付宝支付
|
$show_alipay = PayService::isAlipayOpen($params['pay_source'], $user['app_id']);
|
$balance = $user['balance'];
|
|
if(!empty($user['address_default'])){
|
$detailAddress =$user['address_default']->toArray();
|
}
|
$addressStr=empty($detailAddress)?'':$detailAddress['region']['province'].$detailAddress['region']['city'].$detailAddress['region']['region'].$detailAddress['detail'];
|
$addressZb = empty($addressStr)?array('lng'=>'','lat'=>'') : ($detailAddress['longitude'] ? array('lng' => $detailAddress['longitude'], 'lat' => $detailAddress['latitude']) : $this->getAddress($addressStr));
|
|
return $this->renderSuccess('', compact('orderInfo', 'template_arr', 'store_open', 'show_alipay' , 'balance','addressZb','addressStr'));
|
}
|
|
// 创建订单
|
$order_id = $orderService->createOrder($orderInfo);
|
if (!$order_id) {
|
return $this->renderError($orderService->getError() ?: '订单创建失败');
|
}
|
// 返回订单信息
|
return $this->renderSuccess('', [
|
'order_id' => $order_id, // 订单号
|
]);
|
}
|
|
/**
|
* 订单确认-立即购买
|
*/
|
public function cart()
|
{
|
// 立即购买:获取订单商品列表
|
if ($this->request->isGet()) {
|
$params = json_decode($this->postData()['params'], true);
|
}else{
|
$params = json_decode($this->postData()['params'], true);
|
}
|
$user = $this->getUser();
|
// 商品结算信息
|
$CartModel = new CartModel();
|
// 购物车商品列表
|
$supplierData = $CartModel->getList($user, $params['cart_ids']);
|
// 实例化订单service
|
$orderService = new MasterOrderSettledService($user, $supplierData, $params);
|
// 获取订单信息
|
$orderInfo = $orderService->settlement();
|
if ($this->request->isGet()) {
|
// 如果来源是小程序, 则获取小程序订阅消息id.获取支付成功,发货通知.
|
$template_arr = MessageModel::getMessageByNameArr($params['pay_source'], ['order_pay_user', 'order_delivery_user']);
|
//是否显示店铺信息
|
$store_open=SettingModel::getStoreOpen();
|
// 是否开启支付宝支付
|
$show_alipay = PayService::isAlipayOpen($params['pay_source'], $user['app_id']);
|
$balance = $user['balance'];
|
|
if(!empty($user['address_default'])){
|
$detailAddress =$user['address_default']->toArray();
|
}
|
$addressStr=empty($detailAddress)?'':$detailAddress['region']['province'].$detailAddress['region']['city'].$detailAddress['region']['region'].$detailAddress['detail'];
|
$addressZb = empty($addressStr)?array('lng'=>'','lat'=>'') : ($detailAddress['longitude'] ? array('lng' => $detailAddress['longitude'], 'lat' => $detailAddress['latitude']) : $this->getAddress($addressStr));
|
|
return $this->renderSuccess('', compact('orderInfo', 'template_arr','store_open', 'show_alipay', 'balance','addressZb','addressStr'));
|
}
|
// 订单结算提交
|
if ($orderService->hasError()) {
|
return $this->renderError($orderService->getError());
|
}
|
// 创建订单
|
$order_id = $orderService->createOrder($orderInfo);
|
if (!$order_id) {
|
return $this->renderError($orderService->getError() ?: '订单创建失败');
|
}
|
// 移出购物车中已下单的商品
|
$CartModel->clearAll($user, $params['cart_ids']);
|
// 返回订单信息
|
return $this->renderSuccess('', [
|
'order_id' => $order_id, // 订单号
|
]);
|
}
|
//输入地址获取经纬度(腾讯地图)
|
function getAddress($address) {
|
header("Content-type:text/html;charset=utf-8");
|
$ak = 'LS7BZ-NHSWK-CWOJQ-AJC7Y-H5HE2-UGBWR';//你腾讯地图的k值
|
$address = $address;
|
$url = "http://apis.map.qq.com/ws/geocoder/v1/?address={$address}&key={$ak}";
|
$json = file_get_contents($url);
|
|
$data = json_decode($json,TRUE);
|
|
return $data['result']['location'];//获取地址的 经纬度
|
|
// ["lng"] => float(113.6401)//经度
|
|
// ["lat"] => float(34.72468)//纬度
|
|
|
}
|
/*
|
* 获取两个坐标点的距离
|
*/
|
private static function getDistance($ulon, $ulat, $slon, $slat)
|
{
|
// 地球半径
|
$R = 6378137;
|
// 将角度转为狐度
|
$radLat1 = deg2rad($ulat);
|
$radLat2 = deg2rad($slat);
|
$radLng1 = deg2rad($ulon);
|
$radLng2 = deg2rad($slon);
|
// 结果
|
$s = acos(cos($radLat1) * cos($radLat2) * cos($radLng1 - $radLng2) + sin($radLat1) * sin($radLat2)) * $R;
|
// 精度
|
$s = round($s * 10000) / 10000;
|
return round($s);
|
}
|
/**
|
* 订单支付
|
*/
|
public function pay()
|
{
|
$params = $this->postData();
|
$user = $this->getUser();
|
$payDetail = OrderModel::orderInfo($params['order_id'], $user);
|
if ($this->request->isGet()) {
|
// 开启的支付类型
|
$payTypes = AppModel::getPayType($payDetail['app_id'], $params['pay_source']);
|
// 支付金额
|
$payPrice = $payDetail['payPrice'];
|
$balance = $user['balance'];
|
return $this->renderSuccess('', compact('payTypes', 'payPrice', 'balance'));
|
}
|
$OrderModel = new OrderModel;
|
$payInfo = $OrderModel->OrderPay($user, $params);
|
if (!$payInfo) {
|
return $this->renderError($OrderModel->getError() ?: '订单支付失败');
|
}
|
return $this->renderSuccess('', [
|
'order_id' => $payInfo['order_id'], // 订单id
|
'pay_type' => $payInfo['payType'], // 支付方式
|
'payment' => $payInfo['payment'], // 支付参数
|
'order_type' => OrderTypeEnum::MASTER, //订单类型
|
'use_balance' => $payInfo['use_balance']// 是否使用余额
|
]);
|
|
}
|
}
|