merchant_id = $app->merchant_id; $order->app_id = $app->app_id; $order->order_no = $this->generateOrderNo(); $order->out_order_no = $params['out_order_no']; $order->amount = $params['amount']; $order->currency = $params['currency']; $order->redirect_url = $params['redirect_url']; $order->notify_url = $params['notify_url']; $order->direct_pay = $params['direct_pay'] ?? 0; $order->show_pc_pay_url = $params['show_pc_pay_url'] ?? 0; $order->o_number = $params['o_number'] ?? ''; $order->pos_no = $params['pos_no'] ?? ''; $order->status = Order::STATUS_PREPARE; $order->save(); return $order; } private function generateOrderNo() { $now = time(); $key = RedisKey::getGenerateOrderNoKey($now); $incrId = Redis::incr($key); $incrId = '' . $incrId; Redis::expire($key, 5*60); $padLength = 6 - strlen($incrId); $incrId = str_pad($incrId, $padLength, '0', STR_PAD_LEFT); return date('YmdHis', $now) . $incrId; } public function updateOrderResult(Order $order, Result $result) { if ($result->isSuccess()) { $order->pay_order_no = $result->get('order_no'); $order->pay_url = $result->get('pay_url'); $order->status = Order::STATUS_WAIT_PAY; } else { $order->error_code = $result->get('error_code'); $order->error_msg = $result->get('error_msg'); $order->status = Order::STATUS_FAILED; } $order->save(); } public function jsapiPay(App $app, array $params) { $order = Order::where('app_id', $app->app_id)->where('out_order_no', $params['out_order_no'])->first(); if ($order) { throw new BusinessException('订单重复'); } $order = $this->createOrder($app, $params); $result = Api::makeJSAPIOrder( $order->order_name, $order->order_no, $order->currency, $order->amount, 'http://146.70.113.165:9501/payment/notify', 'http://146.70.113.165:9501/payment/page?order_no=' . $order->order_no ); $this->updateOrderResult($order, $result); return $order; } public function notify($params) { if (Signer::verify($params)) { return 'SIGN FAIL'; } if ($params['return_code'] != 'SUCCESS') { return 'STATUS FAIL'; } $order = Order::where('order_no', $params['out_order_no'])->where('status', Order::STATUS_WAIT_PAY)->first(); $order->status = Order::STATUS_PAYED; $order->payed_at = date('Y-m-d'); $order->exchange_rate = $params['exchange_rate']; $order->cny_amount = $params['cny_amount']; $order->save(); if ($order->save()) { return 'SUCCESS'; } return 'UPDATE FAIL'; } }