Store.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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\Fare;
  11. use app\fastshop\model\EntrustList;
  12. use app\fastshop\model\Shopping;
  13. use app\fastshop\model\ShoppingCache;
  14. use app\fastshop\model\Config;
  15. use app\fastshop\model\Store as AppStore;
  16. use app\fastshop\model\Bank;
  17. use app\common\facade\WechatPay;
  18. use app\common\model\SystemMemberPayment;
  19. use app\common\model\SystemUserAddress;
  20. use app\common\model\SystemMemberBank;
  21. use think\facade\Request;
  22. class Store extends Base{
  23. public function initialize() {
  24. parent::initialize();
  25. $this->isUserAuth();
  26. }
  27. /**
  28. * 我的宝贝
  29. * @return void
  30. */
  31. public function index(){
  32. $param['page'] = Request::param('page/d');
  33. $param['types'] = Request::param('types/d',0);
  34. $param['sign'] = Request::param('sign');
  35. $rel = $this->apiSign($param);
  36. if($rel['code'] != 200){
  37. return enjson(204,'签名失败');
  38. }
  39. $condition['user_id'] = $this->user->id;
  40. switch ($param['types']) {
  41. case 1:
  42. $condition['is_under'] = 0;
  43. $condition['is_rebate'] = 0;
  44. break;
  45. case 2:
  46. $condition['is_under'] = 1;
  47. $condition['is_rebate'] = 1;
  48. break;
  49. default:
  50. $condition['is_rebate'] = 0;
  51. $condition['is_under'] = 1;
  52. break;
  53. }
  54. $lists = EntrustList::with(['Item'=> function($query) {
  55. $query->field('id,name,img');
  56. }])->where($condition)->order('id desc')->paginate(10,true);
  57. $data = [];
  58. foreach ($lists as $key => $value) {
  59. $data[$key]['id'] = $value->id;
  60. $data[$key]['item'] = $value->item;
  61. $data[$key]['status_text'] = EntrustList::status($value);
  62. $data[$key]['create_time'] = date('Y-m-d H:i',$value->create_time);
  63. $data[$key]['is_under'] = $value->is_under;
  64. $data[$key]['is_rebate'] = $value->is_rebate;
  65. $data[$key]['rebate'] = money($value->rebate/100);
  66. $data[$key]['entrust_price'] = $value->entrust_price;
  67. }
  68. if(empty($data)){
  69. return enjson(204,'无内容');
  70. }
  71. return enjson(200,'成功',$data);
  72. }
  73. /**
  74. * 判断是否开通了小店
  75. * @return void
  76. */
  77. public function isopen(){
  78. if($this->user){
  79. $list = model('Store')->where(['uid' => $this->user->id])->find();
  80. if(empty($list)){
  81. return json(['code'=>204,'msg'=>'未开通']);
  82. }
  83. return json(['code'=>200,'msg'=>'已开通','data' => $list]);
  84. }
  85. }
  86. /**
  87. * 上下架宝贝
  88. * @return void
  89. */
  90. public function onUnder(){
  91. if (request()->isPost()) {
  92. $param['id'] = Request::param('id/d');
  93. $param['sign'] = Request::param('sign');
  94. $rel = $this->apiSign($param);
  95. if($rel['code'] != 200){
  96. return enjson(204,'签名失败');
  97. }
  98. $rel = EntrustList::where(['user_id' => $this->user->id,'is_rebate' => 0,'id' => $param['id']])->field('id,is_under,create_time')->find();
  99. if(empty($rel)){
  100. return json(['code'=>403,'msg'=>'您的宝贝已成交或未找到']);
  101. }
  102. if($rel->is_under == 1){
  103. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->field('lock_sale_day')->find();//读取配置
  104. if($config->lock_sale_day > 0){
  105. $days7 = $rel->create_time+$config->lock_sale_day*86400;
  106. if(time() < $days7){
  107. return json(['code'=>403,'msg'=>'您的商品未到上架时间']);
  108. }
  109. }
  110. }
  111. $msg = empty($rel->is_under) ? '宝贝已下架' : '宝贝已上架';
  112. EntrustList::where(['id' => $rel->id])->update(['is_under' => empty($rel->is_under) ? 1 : 0]);
  113. return json(['code'=>200,'msg' => $msg]);
  114. }
  115. }
  116. /**
  117. * 确认提货
  118. * @return void
  119. */
  120. public function onOrder(){
  121. if (request()->isPost()) {
  122. $param['id'] = Request::param('id/d');
  123. $param['buytype'] = Request::param('buytype/s','wepay');
  124. $param['sign'] = Request::param('sign');
  125. $rel = $this->apiSign($param);
  126. if($rel['code'] != 200){
  127. return enjson(204,'签名失败');
  128. }
  129. $rel = EntrustList::where(['user_id' => $this->user->id,'is_rebate' => 0,'id' => $param['id'],'is_under' => 1])->find();
  130. if(empty($rel)){
  131. return json(['code'=>403,'msg'=>'宝贝未找到或未下架']);
  132. }
  133. //读取发货地址
  134. $address = SystemUserAddress::where(['user_id'=>$this->user->id,'is_first' => 1])->find();
  135. if(empty($address)){
  136. return json(['code'=>403,'msg'=>'请重新选择收货地址']);
  137. }
  138. //支付接口
  139. $payment = SystemMemberPayment::where(['apiname' => 'wepay','member_miniapp_id'=>$this->miniapp_id])->find();
  140. if(empty($payment)){
  141. return json(['code'=>403,'msg'=>'未开通微信支付功能']);
  142. }
  143. $order_no = $this->user->invite_code.order_no(); //生成的订单号
  144. $amount = Fare::realAmount([['weight' =>$rel->item->weight,'amount' => 0,'num' => 1]],$this->miniapp_id);
  145. $config = Config::where(['member_miniapp_id' => $this->miniapp_id])->find();
  146. if($param['buytype'] == 'point'){
  147. if($config->payment_type_shop == 0){
  148. return json(['code'=>403,'msg'=>"未开通余额支付功能"]);
  149. }
  150. $point_fee = money($amount['order_amount']*($config->payment_point_shop/100)); //积分付款
  151. if ($point_fee <= 0) {
  152. $param['buytype'] = 'wepay'; //如果积分付款为零0转换为正常的微信全额支付
  153. $order_amount = money($amount['order_amount']);
  154. }else{
  155. $order_amount = money($amount['order_amount'] - $point_fee);
  156. $order_amount = $order_amount <= 0 ? 1 : $order_amount; //如果是100%积分设置最低付款金额
  157. //判断积分够不够
  158. $rel = Bank::isPay($this->user->id,$point_fee,$config->payment_type_shop);
  159. if(!$rel){
  160. return json(['code'=>403,'msg'=>"余额不足,请选择其它支付渠道"]);
  161. }
  162. }
  163. }else{
  164. $order_amount = $amount['order_amount'];
  165. }
  166. $order_amount = $order_amount <= 0 ? 1 :$order_amount;
  167. //判断云收银台
  168. if($config->is_pay_types == 1 && $config->goodpay_tax > 0){
  169. $goodpay_tax = $param['money']*$config->goodpay_tax/100;
  170. $bank_rel = SystemMemberBank::moneyJudge($this->miniapp->member_id,$goodpay_tax);
  171. if($bank_rel){
  172. return ['code'=>0,'message'=>'官方帐号余额不足,请联系管理员'];
  173. }
  174. }
  175. $order_no = $this->user->invite_code.order_no(); //生成的订单号
  176. $order = [
  177. 'payment_id' => $payment['id'],
  178. 'express_name' => $address['name'],
  179. 'express_phone' => $address['telphone'],
  180. 'express_address' => $address['address'],
  181. 'order_amount' => $amount['order_amount'],
  182. 'real_amount' => $amount['real_amount'],
  183. 'real_freight' => $amount['real_freight'],
  184. 'order_no' => $order_no,
  185. 'member_miniapp_id' => $this->miniapp_id,
  186. 'user_id' => $this->user->id,
  187. 'paid_at' => 0,
  188. 'order_starttime' => time(),
  189. ];
  190. $order_id = Shopping::insert($order);
  191. if(empty($order_id)){
  192. return enjson(403,'创建订单失败');
  193. }
  194. //保存订单产品到缓存数据表
  195. ShoppingCache::insert(['order_no' => $order_no,'item_id' => $rel->item->id,'buy_price' => 0,'buy_nums' => 1,'name' => $rel->item->name,'img' => $rel->item->img]);
  196. //支付方式
  197. if($config->is_pay_types == 1){
  198. $pay_coinfig = json_decode($payment->config);
  199. $ispay = [
  200. 'name' => $this->miniapp->appname.'购买商品',
  201. 'mchid' => $pay_coinfig->mch_id,
  202. 'total_fee' => $order_amount*100,
  203. 'order_no' => $order_no,
  204. 'note' => $this->miniapp_id,
  205. 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/goodpay/resetSale',$this->miniapp_id) : api(3,'fastshop/goodpay/resetSalePoint',$this->miniapp_id),
  206. 'publickey' => uuid(1)
  207. ];
  208. $paydata = $this->makeSign($ispay,$pay_coinfig->key);
  209. }else{
  210. $payparm = [
  211. 'openid' => $this->user->miniapp_uid,
  212. 'miniapp_id' => $this->miniapp_id,
  213. 'name' => $this->miniapp->appname.'购买商品',
  214. 'order_no' => $order_no,
  215. 'total_fee' => $order_amount*100,
  216. 'notify_url' => api(3,'fastshop/notify/shop',$this->miniapp_id),
  217. 'notify_url' => $param['buytype'] == 'wepay'? api(3,'fastshop/notify/resetSale',$this->miniapp_id) : api(3,'fastshop/notify/resetSalePoint',$this->miniapp_id),
  218. ];
  219. $ispay = WechatPay::orderPay($payparm);
  220. if($ispay['code'] == 0){
  221. return enjson(403,$ispay['msg']);
  222. }
  223. $paydata = $ispay['data'];
  224. }
  225. $rel->is_rebate = 1;
  226. $rel->is_under = 1;
  227. $rel->save();
  228. return enjson(200,'成功',['type' => $config->is_pay_types,'order' => $paydata]);
  229. }
  230. }
  231. /**
  232. * 开通小店
  233. * @return void
  234. */
  235. public function regStore(){
  236. if (request()->isPost()) {
  237. $param['store_name'] = Request::param('store_name/s');
  238. $param['sign'] = Request::param('sign');
  239. $rel = $this->apiSign($param);
  240. if($rel['code'] != 200){
  241. return enjson(403,'签名失败');
  242. }
  243. $store = AppStore::where(['uid' => $this->user->id])->find();
  244. if(!empty($store)){
  245. return json(['code'=>403,'msg'=>'已开通小店不用重复申请']);
  246. }
  247. $data = [
  248. 'name' => $param['store_name'],
  249. 'uid' => $this->user->id,
  250. 'update_time' => time(),
  251. ];
  252. if (empty($data['name'])) {
  253. return json(['code'=>403,'msg'=>'必须输入小店名称']);
  254. }
  255. $rel = AppStore::insert($data);
  256. if($rel){
  257. return json(['code'=>200,'msg'=>'小店开通成功']);
  258. }
  259. return json(403);
  260. }
  261. }
  262. }