OrderService.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. /**
  3. * Author: luzheng.liu
  4. * Time: 2020/12/24 13:44
  5. */
  6. namespace app\common\service;
  7. use app\api\controller\Order;
  8. use app\api\exception\ApiException;
  9. use app\api\model\OrderModel;
  10. use app\api\model\ProductModel;
  11. use app\api\model\UserModel;
  12. use app\api\model\WriteOffModel;
  13. use app\common\until\Until;
  14. use GuzzleHttp\Client;
  15. use think\console\command\Help;
  16. use think\facade\Cache;
  17. use think\facade\Config;
  18. class OrderService {
  19. public $userName = 'heshen';
  20. public $passwd = 'heshenit@0563';
  21. public function payOrder($input) {
  22. $orderSn = Until::createSn();
  23. $productInfo = (new ProductModel())::where(['id' => $input['productId']])->find();
  24. $userInfo = (new UserModel())::where(['id' => Until::$userId])->find();
  25. $userInfo = Until::modelToArray($userInfo);
  26. if (empty($userInfo)) {
  27. throw new ApiException('无此用户');
  28. }
  29. $model = new OrderModel();
  30. try {
  31. $userId = Until::$userId;
  32. $orderType = 1;
  33. if (Until::$isAdmin) {
  34. $userId = 0;
  35. $orderType = 2;
  36. }
  37. $model->startTrans();
  38. $orderMoney = $productInfo['current_price'] * (int)abs($input['num']);
  39. $orderId = $model->insertGetId([
  40. 'order_sn' => $orderSn,
  41. 'order_money' => $orderMoney,
  42. 'product_id' => $input['productId'],
  43. 'store_id' => $input['storeId'],
  44. 'appointment_time' => $input['appointmentTime'],
  45. 'end_time' => $input['endTime'],
  46. 'mobile' => $input['mobile'],
  47. 'status' => 1,
  48. 'order_type' => $orderType,
  49. 'user_id' => $userId,
  50. ]);
  51. (new WriteOffModel())->insertGetId([
  52. 'write_off_code' => '',
  53. 'order_id' => $orderId,
  54. 'write_off_status' => 1,
  55. ]);
  56. $model->commit();
  57. } catch (\Exception $e) {
  58. $model->rollback();
  59. throw new ApiException($e->getMessage());
  60. }
  61. //{attach string支付主体的标识
  62. //mark string商品信息
  63. //money integer($int32)金额,分为单位
  64. //openId string小程序的openid
  65. //orderId string订单号
  66. //payCode string支付标识
  67. //username string用户名
  68. //}
  69. if (!Until::$isAdmin) {
  70. $otherData = [
  71. 'openId' => $userInfo['open_id'],
  72. 'attach' => 'storeId:'.$input['storeId'],
  73. 'money' => $orderMoney * 100,
  74. 'mark' => '购买了'.$productInfo['product_name'],
  75. 'orderId' => $orderSn,
  76. 'username' => $userInfo['name'],
  77. 'payCode' => strtoupper($this->userName),
  78. ];
  79. $wxOrderInfo = $this->createOrderForOther($otherData);
  80. $order = [
  81. 'nonceStr' => $wxOrderInfo['nonceStr'],
  82. 'package' => $wxOrderInfo['pack'],
  83. 'paySign' => $wxOrderInfo['paySign'],
  84. 'timeStamp' => $wxOrderInfo['timeStamp'],
  85. 'signType' => $wxOrderInfo['signType'],
  86. 'orderSn' => $orderSn,
  87. 'orderId' => $orderId
  88. ];
  89. }
  90. return $order;
  91. }
  92. public function payAgain(int $orderId) {
  93. $model = new OrderModel();
  94. $info = $model::where(['id' => $orderId])->find();
  95. $productInfo = (new ProductModel())::where(['id' => $info['product_id']])->find();
  96. if ($info['status'] === OrderModel::IS_PAY) {
  97. throw new ApiException('订单已支付');
  98. }
  99. $userInfo = (new UserModel())::where(['id' => Until::$userId])->find();
  100. if (empty($userInfo)) {
  101. throw new ApiException('无此用户');
  102. }
  103. $paySn = Until::createSn();
  104. $model::where(['id' => $orderId])->update(['pay_sn' => $paySn]);
  105. $otherData = [
  106. 'openId' => $userInfo['open_id'],
  107. 'attach' => 'storeId:'.$info['store_id'],
  108. 'money' => $info['order_money'] * $info['num'] * 100,
  109. 'mark' => '购买了'.$productInfo['product_name'] ?? '',
  110. 'orderId' => $paySn,
  111. 'username' => $userInfo['name'],
  112. 'payCode' => strtoupper($this->userName),
  113. ];
  114. $wxOrderInfo = $this->createOrderForOther($otherData);
  115. $order = [
  116. 'nonceStr' => $wxOrderInfo['nonceStr'],
  117. 'package' => $wxOrderInfo['pack'],
  118. 'paySign' => $wxOrderInfo['paySign'],
  119. 'timeStamp' => $wxOrderInfo['timeStamp'],
  120. 'signType' => $wxOrderInfo['signType'],
  121. 'orderSn' => $info['order_sn'],
  122. 'orderId' => $orderId
  123. ];
  124. return $order;
  125. }
  126. public function getPayToken() {
  127. // var_dump('获取token'.time());
  128. $key = 'payToken' . $this->userName;
  129. $token = Cache::get($key);
  130. if (empty($token)) {
  131. $token = $this->getAuthPay();
  132. Cache::set($key, $token,'7100');
  133. // var_dump('接口获取token结束'.time());
  134. return $token;
  135. }
  136. // var_dump('缓存获取token结束'.time());
  137. return $token;
  138. }
  139. public function getAuthPay() {
  140. $client = new Client();
  141. $time = Until::msectime();
  142. $res = $client->request('Post',
  143. Config::get('domain')."api/auth/create", [
  144. 'json' => [
  145. 'username' => $this->userName,
  146. "password" => $this->passwd,
  147. 'timestamp' => $time,
  148. 'sign' => md5($this->userName . $time . $this->passwd)
  149. ]
  150. ]);
  151. $info = json_decode((string)$res->getBody(), true);
  152. if ($info['code'] != 200) {
  153. throw new ApiException($info['msg']);
  154. }
  155. return $info['data']['token'];
  156. }
  157. public function createOrderForOther(array $data) {
  158. // var_dump('start'.time());
  159. $client = new Client();
  160. $res = $client->request('Post',
  161. Config::get('domain')."api/supers/wx-pay/gateway-no-order", [
  162. 'json' => $data,
  163. 'headers' => [
  164. 'API-TOKEN-V1' => $this->getPayToken()
  165. ]
  166. ]);
  167. $info = json_decode((string)$res->getBody(), true);
  168. if ($info['code'] != 200) {
  169. throw new ApiException($info['msg']);
  170. }
  171. // var_dump('end'.time());
  172. return $info['data'];
  173. }
  174. public function notify(string $orderSn) {
  175. $model = new OrderModel();
  176. $rs = $model::where(['order_sn' => $orderSn])->find();
  177. if (empty($rs) || $rs['status'] === 2) {
  178. return;
  179. }
  180. // var_dump($rs);
  181. $model::where(['order_sn' => $orderSn])->update(['status' => 2,'pay_time' => date('Y-m-d H:i:s')]);
  182. $model::where(['pay_sn' => $orderSn])->update(['status' => 2,'pay_time' => date('Y-m-d H:i:s')]);
  183. $wModel = new WriteOffModel();
  184. $code = $this->changeCode();
  185. $wModel::where(['order_id' => $rs['id']])->update([
  186. 'write_off_code' => $code,
  187. 'over_time' => date('Y-m-d H:i:s', time() + 5 * 60),
  188. ]);
  189. }
  190. public function changeCode() {
  191. $wModel = new WriteOffModel();
  192. $codeList = $wModel::where(['write_off_status' => WriteOffModel::NO_WRITE_OFF])->field('write_off_code')->select();
  193. $codeList = Until::modelToArray($codeList);
  194. $codeArr = [];
  195. foreach ($codeList as $v) {
  196. $codeArr[] = $v['write_off_code'];
  197. }
  198. $code = $this->makeUniqCode($codeArr);
  199. return $code;
  200. }
  201. public function makeUniqCode(array $codeList) {
  202. $code = random_int(10000, 99999);
  203. if (in_array($code, $codeList)) {
  204. $this->makeUniqCode($codeList);
  205. }
  206. return $code;
  207. }
  208. }