OrderService.php 7.7 KB

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