Card.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  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. "uid" => $request->user['id'],
  108. "openid" => $request->user['openid'],
  109. "order_sn" => $orderSn,
  110. "shop_id" => $param['shop'],
  111. "card_no" => $card['card_no'],
  112. "money" => $buyCard['money'] * 100,
  113. "card_money" => $buyCard['money'] * 100 + $buyCard['old_money'] * 100,
  114. "remark" => "赠送金额".$buyCard['old_money']
  115. ]);
  116. if ($state) {
  117. $wechat = new \WeChat\Pay($this->getWxConfig());
  118. $options = [
  119. 'body' => $card['shop']['shop_name']."-会员卡充值",
  120. 'out_trade_no' => $orderSn."-".CodeExtend::random(8),
  121. "attach" => $orderSn,
  122. 'total_fee' => $buyCard['money'] * 100,
  123. 'openid' => $request->user['openid'],
  124. 'trade_type' => 'JSAPI',
  125. 'notify_url' => 'https://apiv.ujia5.com/notify/recharge',
  126. 'spbill_create_ip' => $request->getRealIp(),
  127. ];
  128. // 生成预支付码
  129. $result = $wechat->createOrder($options);
  130. // 创建JSAPI参数签名
  131. $resp = $wechat->createParamsForJsApi($result['prepay_id']);
  132. return success("ok",$resp);
  133. }
  134. return error("发起充值失败");
  135. } catch (\Throwable $throwable) {
  136. return error($throwable->getMessage());
  137. }
  138. }
  139. #[Route(path: "del",methods: "post")]
  140. public function delCard(Request $request): Response
  141. {
  142. try {
  143. $param = $this->_valid([
  144. "shop.require" => "参数错误"
  145. ],"post");
  146. if (!is_array($param)) return error($param);
  147. $map = ["openid" => $request->user['openid'],"shop_id" => $param['shop']];
  148. $card = (new SaasUser)->where($map)->findOrEmpty();
  149. if ($card->isEmpty()) return error("会员卡不存在");
  150. $state = $card->delete();
  151. if ($state) return success("注销成功");
  152. return error("注销失败");
  153. } catch (\Throwable $throwable) {
  154. return error($throwable->getMessage());
  155. }
  156. }
  157. /**
  158. * 小程序配置
  159. * @return array
  160. */
  161. protected function getWxConfig(): array
  162. {
  163. return [
  164. 'token' => 'test',
  165. 'appid' => sConf("wechat.mini_appid"),
  166. 'appsecret' => sConf("wechat.mini_secret"),
  167. 'encodingaeskey' => 'BJIUzE0gqlWy0GxfPp4J1oPTBmOrNDIGPNav1YFH5Z5',
  168. // 配置商户支付参数(可选,在使用支付功能时需要)
  169. 'mch_id' => sConf("wechat.mch_id"),
  170. 'mch_key' => sConf("wechat.mch_key")
  171. ];
  172. }
  173. }