123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- <?php
- /**
- * Author: luzheng.liu
- * Time: 2020/12/24 13:44
- */
- namespace app\common\service;
- use app\api\controller\Order;
- use app\api\exception\ApiException;
- use app\api\model\OrderModel;
- use app\api\model\ProductModel;
- use app\api\model\UserModel;
- use app\api\model\WriteOffModel;
- use app\common\until\Until;
- use GuzzleHttp\Client;
- use think\console\command\Help;
- use think\facade\Cache;
- use think\facade\Config;
- class OrderService {
- public $userName = 'heshen';
- public $passwd = 'heshenit@0563';
- public function payOrder($input) {
- $orderSn = Until::createSn();
- $productInfo = (new ProductModel())::where(['id' => $input['productId']])->find();
- $userInfo = (new UserModel())::where(['id' => Until::$userId])->find();
- $userInfo = Until::modelToArray($userInfo);
- if (empty($userInfo)) {
- throw new ApiException('无此用户');
- }
- $model = new OrderModel();
- try {
- $userId = Until::$userId;
- $orderType = 1;
- if (Until::$isAdmin) {
- $userId = 0;
- $orderType = 2;
- }
- $model->startTrans();
- $orderMoney = $productInfo['current_price'] * (int)abs($input['num']);
- $orderId = $model->insertGetId([
- 'order_sn' => $orderSn,
- 'order_money' => $orderMoney,
- 'product_id' => $input['productId'],
- 'store_id' => $input['storeId'],
- 'appointment_time' => $input['appointmentTime'],
- 'end_time' => $input['endTime'],
- 'mobile' => $input['mobile'],
- 'status' => 1,
- 'order_type' => $orderType,
- 'user_id' => $userId,
- ]);
- (new WriteOffModel())->insertGetId([
- 'write_off_code' => '',
- 'order_id' => $orderId,
- 'write_off_status' => 1,
- ]);
- $model->commit();
- } catch (\Exception $e) {
- $model->rollback();
- throw new ApiException($e->getMessage());
- }
- //{attach string支付主体的标识
- //mark string商品信息
- //money integer($int32)金额,分为单位
- //openId string小程序的openid
- //orderId string订单号
- //payCode string支付标识
- //username string用户名
- //}
- if (!Until::$isAdmin) {
- $otherData = [
- 'openId' => $userInfo['open_id'],
- 'attach' => 'storeId:'.$input['storeId'],
- 'money' => $orderMoney * 100,
- 'mark' => '购买了'.$productInfo['product_name'],
- 'orderId' => $orderSn,
- 'username' => $userInfo['name'],
- 'payCode' => strtoupper($this->userName),
- ];
- $wxOrderInfo = $this->createOrderForOther($otherData);
- $order = [
- 'nonceStr' => $wxOrderInfo['nonceStr'],
- 'package' => $wxOrderInfo['pack'],
- 'paySign' => $wxOrderInfo['paySign'],
- 'timeStamp' => $wxOrderInfo['timeStamp'],
- 'signType' => $wxOrderInfo['signType'],
- 'orderSn' => $orderSn,
- 'orderId' => $orderId
- ];
- }
- return $order;
- }
- public function payAgain(int $orderId) {
- $model = new OrderModel();
- $info = $model::where(['id' => $orderId])->find();
- $productInfo = (new ProductModel())::where(['id' => $info['product_id']])->find();
- if ($info['status'] === OrderModel::IS_PAY) {
- throw new ApiException('订单已支付');
- }
- $userInfo = (new UserModel())::where(['id' => Until::$userId])->find();
- if (empty($userInfo)) {
- throw new ApiException('无此用户');
- }
- $paySn = Until::createSn();
- $model::where(['id' => $orderId])->update(['pay_sn' => $paySn]);
- $otherData = [
- 'openId' => $userInfo['open_id'],
- 'attach' => 'storeId:'.$info['store_id'],
- 'money' => $info['order_money'] * $info['num'] * 100,
- 'mark' => '购买了'.$productInfo['product_name'] ?? '',
- 'orderId' => $paySn,
- 'username' => $userInfo['name'],
- 'payCode' => strtoupper($this->userName),
- ];
- $wxOrderInfo = $this->createOrderForOther($otherData);
- $order = [
- 'nonceStr' => $wxOrderInfo['nonceStr'],
- 'package' => $wxOrderInfo['pack'],
- 'paySign' => $wxOrderInfo['paySign'],
- 'timeStamp' => $wxOrderInfo['timeStamp'],
- 'signType' => $wxOrderInfo['signType'],
- 'orderSn' => $info['order_sn'],
- 'orderId' => $orderId
- ];
- return $order;
- }
- public function getPayToken() {
- // var_dump('获取token'.time());
- $key = 'payToken' . $this->userName;
- $token = Cache::get($key);
- if (empty($token)) {
- $token = $this->getAuthPay();
- Cache::set($key, $token,'7100');
- // var_dump('接口获取token结束'.time());
- return $token;
- }
- // var_dump('缓存获取token结束'.time());
- return $token;
- }
- public function getAuthPay() {
- $client = new Client();
- $time = Until::msectime();
- $res = $client->request('Post',
- Config::get('domain')."api/auth/create", [
- 'json' => [
- 'username' => $this->userName,
- "password" => $this->passwd,
- 'timestamp' => $time,
- 'sign' => md5($this->userName . $time . $this->passwd)
- ]
- ]);
- $info = json_decode((string)$res->getBody(), true);
- if ($info['code'] != 200) {
- throw new ApiException($info['msg']);
- }
- return $info['data']['token'];
- }
- public function createOrderForOther(array $data) {
- // var_dump('start'.time());
- $client = new Client();
- $res = $client->request('Post',
- Config::get('domain')."api/supers/wx-pay/gateway-no-order", [
- 'json' => $data,
- 'headers' => [
- 'API-TOKEN-V1' => $this->getPayToken()
- ]
- ]);
- $info = json_decode((string)$res->getBody(), true);
- if ($info['code'] != 200) {
- throw new ApiException($info['msg']);
- }
- // var_dump('end'.time());
- return $info['data'];
- }
- public function notify(string $orderSn) {
- $model = new OrderModel();
- $rs = $model::where(['order_sn' => $orderSn])->find();
- if (empty($rs) || $rs['status'] === 2) {
- return;
- }
- // var_dump($rs);
- $model::where(['order_sn' => $orderSn])->update(['status' => 2,'pay_time' => date('Y-m-d H:i:s')]);
- $model::where(['pay_sn' => $orderSn])->update(['status' => 2,'pay_time' => date('Y-m-d H:i:s')]);
- $wModel = new WriteOffModel();
- $code = $this->changeCode();
- $wModel::where(['order_id' => $rs['id']])->update([
- 'write_off_code' => $code,
- 'over_time' => date('Y-m-d H:i:s', time() + 5 * 60),
- ]);
- }
- public function changeCode() {
- $wModel = new WriteOffModel();
- $codeList = $wModel::where(['write_off_status' => WriteOffModel::NO_WRITE_OFF])->field('write_off_code')->select();
- $codeList = Until::modelToArray($codeList);
- $codeArr = [];
- foreach ($codeList as $v) {
- $codeArr[] = $v['write_off_code'];
- }
- $code = $this->makeUniqCode($codeArr);
- return $code;
- }
- public function makeUniqCode(array $codeList) {
- $code = random_int(10000, 99999);
- if (in_array($code, $codeList)) {
- $this->makeUniqCode($codeList);
- }
- return $code;
- }
- }
|