Card.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. <?php
  2. namespace app\controller\api;
  3. use app\extra\basic\Base;
  4. use app\extra\tools\CodeExtend;
  5. use app\middleware\WxMiddleware;
  6. use app\model\saas\SaasCombo;
  7. use app\model\saas\SaasUser;
  8. use app\model\saas\SaasUserBuy;
  9. use app\model\saas\SaasUserLog;
  10. use LinFly\Annotation\Route\Controller;
  11. use LinFly\Annotation\Route\Middleware;
  12. use LinFly\Annotation\Route\Route;
  13. use support\Request;
  14. use support\Response;
  15. #[Controller(prefix: "/wx_api/card"),Middleware(WxMiddleware::class)]
  16. class Card extends Base
  17. {
  18. #[Route(path: "data",methods: "get")]
  19. public function getCardData(Request $request): Response
  20. {
  21. try {
  22. $param = $this->_valid([
  23. "shop.require" => "参数错误"
  24. ]);
  25. if (!is_array($param)) return error($param);
  26. $memberCard = (new SaasUser)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->with(["shop" => function($query){
  27. $query->field("shop_id,shop_name,user_card_price,user_card");
  28. }])->findOrEmpty();
  29. if ($memberCard->isEmpty()) return success("",[],2);
  30. $memberCard['balance'] = format_money($memberCard['balance']/100,2);
  31. $memberCard['end_at'] = date("Y-m-d",strtotime($memberCard['create_at']));
  32. $isRecharge = (new SaasUserBuy)->where("shop_id",$param['shop'])->where("openid",$request->user['openid'])->where("status",1)->sum("money");
  33. if ($memberCard['shop']['user_card'] == 2) { // 自定义套餐
  34. $cardPrice = array_values($memberCard['shop']['user_card_price']);
  35. } else {
  36. $cardPrice = (new SaasCombo)->where("type",2)->select();
  37. }
  38. $cardPrice = array_filter($cardPrice, function($item) use ($isRecharge) {
  39. if ($isRecharge > 0) {
  40. return $item['is_first'] != '1'; // 注意:这里使用松散比较,因为数据中有字符串'1'
  41. } else {
  42. return $item;
  43. }
  44. });
  45. foreach ($cardPrice as $key=>$val) {
  46. $cardPrice[$key] = $val;
  47. $cardPrice[$key]['money'] = $val['money'];
  48. $cardPrice[$key]['old_money'] = $val['old_money'];
  49. }
  50. $memberCard['card'] = array_values($cardPrice);
  51. return success("ok",$memberCard->toArray());
  52. } catch (\Throwable $throwable) {
  53. echo getDateFull()."==会员卡报错\n";
  54. echo $throwable->getLine()."\n";
  55. echo $throwable->getFile()."\n";
  56. return error($throwable->getMessage());
  57. }
  58. }
  59. /**
  60. * 会员卡消费明细
  61. * @param Request $request
  62. * @return Response
  63. */
  64. #[Route(path: "log",methods: "get")]
  65. public function getOrderList(Request $request): Response
  66. {
  67. try {
  68. $param = $this->_valid([
  69. "page.require" => "参数错误",
  70. "size.require" => "参数错误",
  71. "shop.require" => "参数错误",
  72. "card.require" => "参数错误"
  73. ]);
  74. if (!is_array($param)) return error($param);
  75. $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
  76. $resp = (new SaasUserLog)->where($map)->order("create_at desc")->paginate([
  77. "list_rows" => $param['size'],
  78. "page" => $param['page']
  79. ]);
  80. return success("ok",$resp->toArray());
  81. } catch (\Throwable $throwable) {
  82. return error($throwable->getMessage());
  83. }
  84. }
  85. /**
  86. * 下单
  87. * @param Request $request
  88. * @return Response|void|null
  89. */
  90. #[Route(path: "create",methods: "post")]
  91. public function createOrder(Request $request)
  92. {
  93. try {
  94. $param = $this->_valid([
  95. "card.require" => "参数错误",
  96. "shop.require" => "参数错误"
  97. ],"post");
  98. if (!is_array($param)) return error($param);
  99. $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
  100. $card = (new SaasUser)->where($map)->with(['shop' => function($query){
  101. $query->field("shop_id,shop_name");
  102. }])->findOrEmpty();
  103. if ($card->isEmpty()) return error("尚未开通会员卡");
  104. $orderSn = strtoupper(CodeExtend::random(12,3));
  105. $buyCard = json_decode($param['card'],true);
  106. $state = (new SaasUserBuy)->insertGetId([
  107. "openid" => $request->user['openid'],
  108. "order_sn" => $orderSn,
  109. "shop_id" => $param['shop'],
  110. "card_no" => $card['card_no'],
  111. "money" => $buyCard['money'] * 100,
  112. "total_money" => $buyCard['money'] * 100 + $buyCard['old_money'] * 100,
  113. "remark" => "赠送金额".$buyCard['old_money']
  114. ]);
  115. if ($state) {
  116. $wechat = new \WeChat\Pay($this->getWxConfig());
  117. $options = [
  118. 'body' => $card['shop']['shop_name']."-会员卡充值",
  119. 'out_trade_no' => $orderSn."-".CodeExtend::random(8),
  120. "attach" => $orderSn,
  121. 'total_fee' => $buyCard['money'] * 100,
  122. 'openid' => $request->user['openid'],
  123. 'trade_type' => 'JSAPI',
  124. 'notify_url' => 'https://panel.huiyinduo.cn/notify/recharge',
  125. 'spbill_create_ip' => $request->getRealIp(),
  126. ];
  127. // 生成预支付码
  128. $result = $wechat->createOrder($options);
  129. // 创建JSAPI参数签名
  130. $resp = $wechat->createParamsForJsApi($result['prepay_id']);
  131. return success("ok",$resp);
  132. }
  133. return error("发起充值失败");
  134. } catch (\Throwable $throwable) {
  135. return error($throwable->getMessage());
  136. }
  137. }
  138. #[Route(path: "del",methods: "post")]
  139. public function delCard(Request $request): Response
  140. {
  141. try {
  142. $param = $this->_valid([
  143. "shop.require" => "参数错误"
  144. ],"post");
  145. if (!is_array($param)) return error($param);
  146. $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
  147. $card = (new SaasUser)->where($map)->findOrEmpty();
  148. if ($card->isEmpty()) return error("会员卡不存在");
  149. $state = $card->delete();
  150. if ($state) return success("注销成功");
  151. return error("注销失败");
  152. } catch (\Throwable $throwable) {
  153. return error($throwable->getMessage());
  154. }
  155. }
  156. /**
  157. * 小程序配置
  158. * @return array
  159. */
  160. protected function getWxConfig(): array
  161. {
  162. return [
  163. 'token' => 'test',
  164. 'appid' => sConf("wechat.mini_appid"),
  165. 'appsecret' => sConf("wechat.mini_secret"),
  166. 'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
  167. // 配置商户支付参数(可选,在使用支付功能时需要)
  168. 'mch_id' => sConf("wechat.mch_id"),
  169. 'mch_key' => sConf("wechat.mch_key")
  170. ];
  171. }
  172. }