Group.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. /**
  3. * @copyright Copyright (c) 2017 https://www.sapixx.com All rights reserved.
  4. * @license Licensed (http://www.apache.org/licenses/LICENSE-2.0).
  5. * @author pillar<ltmn@qq.com>
  6. * 商城小程序公共API服务
  7. */
  8. namespace app\fastshop\controller\api\v3;
  9. use app\fastshop\controller\api\Base;
  10. use app\fastshop\model\Group as AppGroup;
  11. use app\fastshop\model\Fare;
  12. use app\fastshop\model\Config;
  13. use app\fastshop\model\Shopping;
  14. use app\fastshop\model\ShoppingCache;
  15. use app\common\facade\WechatPay;
  16. use app\common\model\SystemMemberPayment;
  17. use app\common\model\SystemUserAddress;
  18. use app\common\model\SystemMemberBank;
  19. class Group extends Base{
  20. /**
  21. * 读取团购产品
  22. */
  23. public function index(){
  24. $param = [
  25. 'page' => $this->request->param('page/d'),
  26. 'sign' => $this->request->param('sign')
  27. ];
  28. $rel = $this->apiSign($param);
  29. if($rel['code'] != 200){
  30. return enjson(403,'签名失败');
  31. }
  32. $list = AppGroup::where(['member_miniapp_id'=>$this->miniapp_id])->order('id desc')->paginate(5,true);
  33. if(empty($list)){
  34. return enjson(204);
  35. }
  36. $data = [];
  37. foreach ($list as $key => $value) {
  38. $data[$key]['id'] = $value->id;
  39. $data[$key]['img'] = $value->item->img;
  40. $data[$key]['name'] = $value->item->name;
  41. $data[$key]['amount'] = $value->amount;
  42. $data[$key]['hao_people'] = $value->hao_people;
  43. $data[$key]['uids'] = count(json_decode($value->uids,true));
  44. }
  45. return enjson(200,'成功',$data);
  46. }
  47. /**
  48. * 关注的商家店铺商品
  49. */
  50. public function item(){
  51. $param = [
  52. 'id' => $this->request->param('id/d'),
  53. 'sign' => $this->request->param('sign')
  54. ];
  55. $rel = $this->apiSign($param);
  56. if($rel['code'] != 200){
  57. return enjson(403,'签名失败');
  58. }
  59. $rel = AppGroup::where(['member_miniapp_id'=>$this->miniapp_id])->where(['id' => $param['id']])->find();
  60. $data = [];
  61. if(!empty($rel)){
  62. $data['face'] = [];
  63. if(!empty($rel->uids)){
  64. $data['face'] = model('SystemUser')->where(['id' => json_decode($rel->uids,true)])->field('face')->select()->toArray();
  65. }
  66. $data['group_price'] = money($rel->amount);
  67. $data['sale_price'] = money($rel->item->sell_price);
  68. $data['hao_people'] = $rel->hao_people;
  69. $data['img'] = $rel->item->img."?x-oss-process=style/500";
  70. $data['imgs'] = empty($rel->item->imgs) ? [] : json_decode($rel->item->imgs,true);
  71. $data['name'] = $rel->item->name;
  72. $data['content'] = $rel->item->content;
  73. return json(['code'=>200,'msg'=>'成功','data' => $data]);
  74. }
  75. }
  76. /**
  77. * 下单购买关注好店的商品
  78. * @return void
  79. */
  80. public function cartItem(){
  81. $this->isUserAuth();
  82. if(request()->isPost()){
  83. $param = [
  84. 'cart' => $this->request->param('cart/d',0),
  85. 'sign' => $this->request->param('sign')
  86. ];
  87. $rel = $this->apiSign($param);
  88. if($rel['code'] != 200){
  89. return enjson(403,'签名失败');
  90. }
  91. if(empty($param['cart'])){
  92. return json(['code'=>204,'msg'=>'购物车中没有宝贝','url'=>'/pages/store/like']);
  93. }
  94. $rel = AppGroup::where(['id' => $param['cart']])->find();
  95. if(empty($rel)){
  96. return json(['code'=>403,'msg'=>'活动已下架']);
  97. }
  98. $item['name'] = $rel->item->name;
  99. $item['img'] = $rel->item->img;
  100. $item['sale_price'] = money($rel->amount);
  101. $amount = Fare::realAmount(['amount' =>money($rel->amount),'weight' => $rel->item->weight],$this->miniapp_id);
  102. if(empty($rel)){
  103. return json(['code'=>204,'msg'=>'没有内容了','url'=>'/pages/store/like']);
  104. }else{
  105. return json(['data'=>['item'=>$item,'amount' => $amount],'code'=>200,'msg'=>'成功']);
  106. }
  107. }
  108. }
  109. /**
  110. * 微信商城支付
  111. * @param string $no
  112. * @return void
  113. */
  114. public function doPay(){
  115. $param = [
  116. 'address' => $this->request->param('address/d',0),
  117. 'ids' => $this->request->param('ids/d'),
  118. 'ucode' => $this->request->param('ucode'),
  119. 'buytype' => $this->request->param('buytype','wepay'),
  120. 'sign' => $this->request->param('sign')
  121. ];
  122. $rel = $this->apiSign($param);
  123. if($rel['code'] != 200){
  124. return enjson(403,'签名失败');
  125. }
  126. $validate = $this->validate($param,'Cart.add_order');
  127. if(true !== $validate){
  128. return enjson(403,$validate);
  129. }
  130. if (empty($param['ids'])){
  131. return enjson(403,'购物车是空的');
  132. }
  133. //读取发货地址
  134. $address = SystemUserAddress::where(['user_id'=>$this->user->id,'id' =>$param['address']])->find();
  135. if(empty($address)){
  136. return enjson(403,'请选择收货地址');
  137. }
  138. //支付接口
  139. $payment = SystemMemberPayment::where(['apiname'=>'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
  140. if(empty($payment)){
  141. return enjson(403,'未开通微信支付功能');
  142. }
  143. $group = AppGroup::where(['id' => $param['ids']])->find();
  144. if(empty($group)){
  145. return json(['code'=>403,'msg'=>'团购商品已下架']);
  146. }
  147. $order_no = $this->user->invite_code.order_no(); //生成的订单号
  148. $amount = Fare::realAmount([['amount' => $group->amount,'weight' => $group->item->weight,'num' =>1]],$this->miniapp_id);
  149. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  150. if($param['buytype'] == 'point'){
  151. if($config->payment_type_shop == 0){
  152. return json(['code'=>403,'msg'=>"未开通余额支付功能"]);
  153. }
  154. $point_fee = money($amount['order_amount']*($config->payment_point_shop/100)); //积分付款
  155. if ($point_fee <= 0) {
  156. $param['buytype'] = 'wepay'; //如果积分付款为零0转换为正常的微信全额支付
  157. $order_amount = money($amount['order_amount']);
  158. }else{
  159. $order_amount = money($amount['order_amount'] - $point_fee);
  160. $order_amount = $order_amount <= 0 ? 1 : $order_amount; //如果是100%积分设置最低付款金额
  161. //判断积分够不够
  162. $rel = model('Bank')->isPay($this->user->id,$point_fee,$config->payment_type_shop);
  163. if(!$rel){
  164. return json(['code'=>403,'msg'=>"余额不足,请选择其它支付渠道"]);
  165. }
  166. }
  167. }else{
  168. $order_amount = $amount['order_amount'];
  169. }
  170. $order_amount = $order_amount <= 0 ? 1 :$order_amount;
  171. //判断云收银台
  172. if($config->is_pay_types == 1 && $config->goodpay_tax > 0){
  173. $goodpay_tax = $param['money']*$config->goodpay_tax/100;
  174. $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
  175. if($bank_rel){
  176. return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
  177. }
  178. }
  179. $order['payment_id'] = $payment['id']; //支付ID
  180. $order['express_name'] = $address['name'];
  181. $order['express_phone'] = $address['telphone'];
  182. $order['express_address'] = $address['address'];
  183. $order['order_amount'] = $amount['order_amount'];
  184. $order['real_amount'] = $amount['real_amount'];
  185. $order['real_freight'] = $amount['real_freight'];
  186. $order['order_no'] = $order_no;
  187. $order['member_miniapp_id'] = $this->miniapp_id;
  188. $order['user_id'] = $this->user->id;
  189. $order['order_starttime'] = time();
  190. $order_id = Shopping::insert($order);
  191. if(empty($order_id)){
  192. return enjson(403,'创建订单失败');
  193. }
  194. //保存订单产品到缓存数据表
  195. $item_data['order_no'] = $order_no;
  196. $item_data['item_id'] = $group->item->id;
  197. $item_data['buy_price'] = $amount['order_amount'];
  198. $item_data['buy_nums'] = 1;
  199. $item_data['name'] = $group->item->name;
  200. $item_data['img'] = $group->item->img;
  201. ShoppingCache::insert($item_data);
  202. //支付方式
  203. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  204. if($config->is_pay_types == 1){
  205. $pay_coinfig = json_decode($payment->config);
  206. //云收银台
  207. $ispay = [
  208. 'name' => $this->miniapp->appname.'购买商品',
  209. 'mchid' => $pay_coinfig->mch_id,
  210. 'total_fee' => $order_amount*100,
  211. 'order_no' => $order_no,
  212. 'note' => $this->miniapp_id,
  213. 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/goodpay/shop',$this->miniapp_id) : api(3,'fastshop/goodpay/shopPoint',$this->miniapp_id),
  214. 'publickey' => uuid(1)
  215. ];
  216. $paydata = $this->makeSign($ispay,$pay_coinfig->key);
  217. }else{
  218. //去请求微信支付接口
  219. $payparm = [
  220. 'openid' => $this->user->miniapp_uid,
  221. 'miniapp_id' => $this->miniapp_id,
  222. 'name' => $this->miniapp->appname.'购买商品',
  223. 'order_no' => $order_no,
  224. 'total_fee' => $order_amount*100,
  225. 'notify_url' => api(3,'fastshop/notify/shop',$this->miniapp_id),
  226. 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/notify/shop',$this->miniapp_id) : api(3,'fastshop/notify/shopPoint',$this->miniapp_id),
  227. ];
  228. $ispay = WechatPay::orderPay($payparm);
  229. if($ispay['code'] == 0){
  230. return enjson(403,$ispay['msg']);
  231. }
  232. $paydata = $ispay['data'];
  233. }
  234. return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
  235. }
  236. }