123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- <?php
- /**
- * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
- * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
- * @author pillar<ltmn@qq.com>
- * 商城购物车
- */
- namespace app\fastshop\controller\api\v3;
- use app\fastshop\controller\api\Base;
- use app\fastshop\model\Item;
- use app\fastshop\model\Fare;
- use app\fastshop\model\Config;
- use app\fastshop\model\Shopping;
- use app\fastshop\model\ShoppingCache;
- use app\common\facade\WechatPay;
- use app\common\model\SystemMemberPayment;
- use app\common\model\SystemUserAddress;
- use app\common\model\SystemMemberBank;
- use think\facade\Request;
- use filter\Filter;
- class Cart extends Base{
- public function initialize() {
- parent::initialize();
- $this->isUserAuth();
- }
-
- /**
- * 购物车编辑
- */
- public function edit(){
- $data['item_id'] = Request::param('item_id/d',0);
- $data['buy_num'] = Request::param('buy_num/d',1);
- $data['sign'] = Request::param('sign');
- $rel = $this->apiSign($data);
- if($rel['code'] == 200){
- if($data['buy_num'] > 5){
- return enjson(403,'超过最大购买商品数');
- }
- //检测SPU是否存在或下架
- $spu = Item::where(['id' => $data['item_id'],'is_sale'=>2])->find();
- if(empty($spu)){
- return enjson(403,'商品已下降');
- }
- $cart[$data['item_id']] = $data['buy_num'];
- return enjson(200,'成功',$cart);
- }
- return enjson($rel['code'],'签名验证失败');
- }
- /**
- * 读取购物车产品列表
- */
- public function cartItem(){
- if(request()->isPost()){
- $cart = Request::param('cart/a',[]);
- if (empty($cart)) {
- return enjson(204,'没有宝贝');
- }
- $ids = ids(array_keys($cart),true);
- //查找商品SPU
- $item = Item::where(['is_sale'=>2,'id' => $ids,'member_miniapp_id' => $this->miniapp_id])
- ->field('id,category_id,name,sell_price,market_price,points,repoints,weight,img')
- ->select();
- if(empty($item)){
- return enjson(403,'没有宝贝');
- }else{
- $data = [];
- foreach ($item as $value) {
- $num = abs(intval($cart[$value['id']]));
- $num = $num <= 0 ? 1: $num;
- $data[$value['id']] = [
- 'id' => $value['id'],
- 'num' => $num,
- 'amount' => money($value['sell_price'] * $num), //单个商品价格的总价
- 'market_price' => money($value['market_price']),
- 'sell_price' => money($value['sell_price']),
- 'weight' => $value['weight'],
- 'points' => $value['points'],
- 'repoints' => $value['repoints'],
- 'name' => $value['name'],
- 'img' => $value['img']
- ];
- }
- $amount = Fare::realAmount($data,$this->miniapp_id);
- return enjson(200,'成功',['item' => $data,'amount' => $amount]);
- }
- }
- }
- /**
- * ################################
- * 判断是否支付了
- */
- public function isPay($order_no){
- $order_no = Filter::filter_escape($order_no);
- $order = Shopping::where(['order_no' => $order_no,'paid_at' => 0])->field('id,order_no,paid_no,order_amount')->find();
- if(empty($order)){
- return enjson(204);
- }
- return enjson();
- }
- /**
- * 微信商城支付
- * @param string $no
- * @return void
- */
- public function doPay(){
- $param = [
- 'address' => Request::param('address/d',0),
- 'ids' => Request::param('ids/s','','htmlspecialchars_decode'),
- 'ucode' => Request::param('ucode'),
- 'buytype' => Request::param('buytype','wepay'),
- 'sign' => Request::param('sign')
- ];
- $validate = $this->validate($param,'Cart.add_order');
- if(true !== $validate){
- return enjson(403,$validate);
- }
- $rel = $this->apiSign($param);
- if($rel['code'] != 200){
- return enjson(403,'签名失败');
- }
- $cart = (array)ids(json_decode($param['ids'],true),true); //购买的产品ID和数量
- $ids = ids(array_keys($cart),true); //购买的产品ID
- if (empty($ids)){
- return enjson(403,'购物车是空的');
- }
- if (empty($ids[0])){
- return enjson(403,'购物车是空的');
- }
- //读取发货地址
- $address = SystemUserAddress::where(['user_id'=>$this->user->id,'id' =>$param['address']])->find();
- if(empty($address)){
- return enjson(403,'请选择收货地址');
- }
- //支付接口
- $payment = SystemMemberPayment::where(['apiname'=>'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
- if(empty($payment)){
- return enjson(403,'未开通微信支付功能');
- }
- //读取订单
- $item = Item::where(['is_sale'=>2,'id' => $ids,'member_miniapp_id' => $this->miniapp_id])->field('id,sell_price,market_price,points,repoints,weight,name,img')->select();
- if($item->isEmpty()){
- return enjson(403,'没有宝贝');
- }
- $data = [];
- foreach ($item as $value) {
- $num = abs(intval($cart[$value['id']]));
- $num = $num <= 0 ? 1: $num;
- $data[$value['id']] = [
- 'id' => $value['id'],
- 'num' => $num,
- 'amount' => money($value['sell_price'] * $num), //单个商品价格的总价
- 'market_price' => money($value['market_price']),
- 'sell_price' => money($value['sell_price']),
- 'weight' => $value['weight'],
- 'points' => $value['points'],
- 'repoints' => $value['repoints'],
- 'name' => $value['name'],
- 'img' => $value['img'],
- ];
- }
- $amount = Fare::realAmount($data,$this->miniapp_id);
- $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
- if($param['buytype'] == 'point'){
- if($config->payment_type_shop == 0){
- return json(['code'=>403,'msg'=>"未开通余额支付功能"]);
- }
- $point_fee = money($amount['order_amount']*($config->payment_point_shop/100)); //积分付款
- if ($point_fee <= 0) {
- $param['buytype'] = 'wepay'; //如果积分付款为零0转换为正常的微信全额支付
- $order_amount = money($amount['order_amount']);
- }else{
- $order_amount = money($amount['order_amount'] - $point_fee);
- $order_amount = $order_amount <= 0 ? 1 : $order_amount; //如果是100%积分设置最低付款金额
- //判断积分够不够
- $rel = model('Bank')->isPay($this->user->id,$point_fee,$config->payment_type_shop);
- if(!$rel){
- return json(['code'=>403,'msg'=>"余额不足,请选择其它支付渠道"]);
- }
- }
- }else{
- $order_amount = $amount['order_amount'];
- }
- $order_amount = $order_amount <= 0 ? 1 :$order_amount;
- //判断云收银台
- if($config->is_pay_types == 1 && $config->goodpay_tax > 0){
- $goodpay_tax = $order_amount*$config->goodpay_tax/100;
- $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
- if($bank_rel){
- return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
- }
- }
- $order_no = $this->user->invite_code.order_no(); //生成的订单号
- $order['payment_id'] = $payment['id']; //支付ID
- $order['express_name'] = $address['name'];
- $order['express_phone'] = $address['telphone'];
- $order['express_address'] = $address['address'];
- $order['order_amount'] = $amount['order_amount'];
- $order['real_amount'] = $amount['real_amount'];
- $order['real_freight'] = $amount['real_freight'];
- $order['order_no'] = $order_no;
- $order['member_miniapp_id'] = $this->miniapp_id;
- $order['user_id'] = $this->user->id;
- $order['order_starttime'] = time();
- $order_id = Shopping::insertGetId($order);
- if(empty($order_id)){
- return enjson(403,'创建订单失败');
- }
- //保存订单产品到缓存数据表
- foreach ($data as $key => $value) {
- $item_data[$key]['order_no'] = $order_no;
- $item_data[$key]['item_id'] = $value['id'];
- $item_data[$key]['buy_price'] = $value['sell_price'];
- $item_data[$key]['buy_nums'] = $value['num'];
- $item_data[$key]['name'] = $value['name'];
- $item_data[$key]['img'] = $value['img'];
- }
- ShoppingCache::insertAll($item_data);
- //支付方式
- if($config->is_pay_types == 1){
- //云收银台
- $pay_coinfig = json_decode($payment->config);
- $ispay = [
- 'name' => $this->miniapp->appname.'购买商品',
- 'mchid' => $pay_coinfig->mch_id,
- 'total_fee' => $order_amount*100,
- 'order_no' => $order_no,
- 'note' => $this->miniapp_id,
- 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/goodpay/shop',$this->miniapp_id) : api(3,'fastshop/goodpay/shopPoint',$this->miniapp_id),
- 'publickey' => uuid(1)
- ];
- $paydata = $this->makeSign($ispay,$pay_coinfig->key);
- }else{
- //去请求微信支付接口
- $payparm = [
- 'openid' => $this->user->miniapp_uid,
- 'miniapp_id' => $this->miniapp_id,
- 'name' => $this->miniapp->appname.'购买商品',
- 'order_no' => $order_no,
- 'total_fee' => $order_amount*100,
- 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/notify/shop',$this->miniapp_id) : api(3,'fastshop/notify/shopPoint',$this->miniapp_id),
- ];
- $ispay = WechatPay::orderPay($payparm);
- if($ispay['code'] == 0){
- return enjson(403,$ispay['msg']);
- }
- $paydata = $ispay['data'];
- }
- return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
- }
-
- /**
- * 重新支付
- * @param string $no
- * @return void
- */
- public function retryPay(){
- $param = [
- 'order_no' => Request::param('order_no'),
- 'buytype' => Request::param('buytype','wepay'),
- 'sign' => Request::param('sign')
- ];
- $rel = $this->apiSign($param);
- if($rel['code'] != 200){
- return enjson(403,'签名失败');
- }
- $order = Shopping::where(['order_no' => $param['order_no'],'member_miniapp_id' => $this->miniapp_id,'paid_at' => 0])->find();
- if(empty($order)){
- return enjson(403,'未找到当前订单信息');
- }
- //支付接口
- $payment = SystemMemberPayment::where(['apiname'=>'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
- if(empty($payment)){
- return enjson(403,'未开通微信支付功能');
- }
- //支付方式
- $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
- if($param['buytype'] == 'point'){
- $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
- if($config->payment_type_shop == 0){
- return json(['code'=>403,'msg'=>"未开通余额支付功能"]);
- }
- $point_fee = money($order->order_amount*($config->payment_point_shop/100)); //积分付款
- if ($point_fee <= 0) {
- $param['buytype'] = 'wepay'; //如果积分付款为零0转换为正常的微信全额支付
- $order_amount = money($order->order_amount);
- }else{
- $order_amount = money($order->order_amount - $point_fee);
- $order_amount = $order_amount <= 0 ? 1 : $order_amount; //如果是100%积分设置最低付款金额
- //判断积分够不够
- $rel = model('Bank')->isPay($this->user->id,$point_fee,$config->payment_type_shop);
- if(!$rel){
- return json(['code'=>403,'msg'=>"余额不足,请选择其它支付渠道"]);
- }
- }
- }else{
- $order_amount = $order->order_amount;
- }
- $order_amount = $order_amount <= 0 ? 1 :$order_amount;
- if($config->is_pay_types == 1){
- if($config->goodpay_tax > 0){
- $goodpay_tax = $order_amount*$config->goodpay_tax/100;
- $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
- if($bank_rel){
- return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
- }
- }
- $pay_coinfig = json_decode($payment->config);
- //云收银台
- $ispay = [
- 'name' => $this->miniapp->appname.'购买商品',
- 'mchid' => $pay_coinfig->mch_id,
- 'total_fee' => $order_amount*100,
- 'order_no' => $order->order_no,
- 'note' => $this->miniapp_id,
- 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/goodpay/shop',$this->miniapp_id) : api(3,'fastshop/goodpay/shopPoint',$this->miniapp_id),
- 'publickey' => uuid(1)
- ];
- $paydata = $this->makeSign($ispay,$pay_coinfig->key);
- }else{
- //去请求微信支付接口
- $payparm = [
- 'openid' => $this->user->miniapp_uid,
- 'miniapp_id' => $this->miniapp_id,
- 'name' => $this->miniapp->appname.'购买商品',
- 'order_no' => $order->order_no,
- 'total_fee' => $order_amount*100,
- 'notify_url' => api(3,'fastshop/notify/shop',$this->miniapp_id),
- 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/notify/shop',$this->miniapp_id) : api(3,'fastshop/notify/shopPoint',$this->miniapp_id),
- ];
- $ispay = WechatPay::orderPay($payparm);
- if($ispay['code'] == 0){
- return enjson(403,$ispay['msg']);
- }
- $paydata = $ispay['data'];
- }
- return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
- }
-
- /**
- * 关闭订单
- */
- public function closeorder(){
- $rule = [
- 'order_no' => Request::param('order_no'),
- 'sign' => Request::param('sign')
- ];
- $rel = $this->apiSign($rule);
- if($rel['code'] == 200){
- $condition['order_no'] = $rule['order_no'];
- $condition['user_id'] = $this->user->id;
- $condition['is_del'] = 0;
- $rel = Shopping::where($condition)->update(['is_del' => 1]);
- if(empty($rel)){
- return enjson(403,'关闭失败');
- }
- return enjson(200,'成功关闭');
- }
- return enjson(204,'签名失败');
- }
- /**
- * 签收订单
- */
- public function signOrder($order_no){
- $rule = [
- 'order_no' => Request::param('order_no'),
- 'sign' => Request::param('sign')
- ];
- $rel = $this->apiSign($rule);
- if($rel['code'] == 200){
- $condition['order_no'] = Filter::filter_escape($order_no);
- $condition['user_id'] = $this->user->id;
- $condition['is_del'] = 0;
- $condition['paid_at'] = 1;
- $condition['express_status'] = 1;
- $rel = Shopping::where($condition)->update(['status' => 1]);
- if(empty($rel)){
- return enjson(403,'未找到当前订单');
- }
- return enjson(200,'订单签收成功');
- }
- return enjson(204,'签名失败');
- }
- /**
- * ######################################
- * 小程序端用户的订单列表
- * 我的产品列表
- */
- public function order(){
- $rule = [
- 'types' => Request::param('types',0),
- 'page' => Request::param('page',0),
- 'sign' => Request::param('sign')
- ];
- $rel = $this->apiSign($rule);
- if($rel['code'] != 200){
- return enjson(403,'签名失败');
- }
- $condition['user_id'] = $this->user->id;
- $condition['is_del'] = 0;
- switch ($rule['types']) {
- case 1:
- $condition['paid_at'] = 1;
- $condition['express_status'] = 0;
- break;
- case 2:
- $condition['paid_at'] = 1;
- $condition['express_status'] = 1;
- $condition['status'] = 0;
- break;
- case 3:
- $condition['paid_at'] = 1;
- $condition['status'] = 1;
- break;
- default:
- $condition['paid_at'] = 0;
- break;
- }
- $order = Shopping::where($condition)->order('id desc')->paginate(10);
- if(empty($order)) {
- return enjson(204,'没有订单');
- }
- $data = Shopping::orderData($order);
- return enjson(200,'成功',$data);
- }
- /**
- * 读取购物车预览
- */
- public function review(){
- $param = [
- 'order_no' => Request::param('order_no'),
- 'sign' => Request::param('sign')
- ];
- $rel = $this->apiSign($param);
- if($rel['code'] != 200){
- return enjson(403,$rel['msg']);
- }
- $condition['user_id'] = $this->user->id;
- $condition['is_del'] = 0;
- $condition['order_no'] = $param['order_no'];
- $order = Shopping::where($condition)->order('id desc')->select();
- if(empty($order)) {
- return enjson(204,'没有订单');
- }
- return enjson(200,'成功',Shopping::orderData($order));
- }
- }
|