header("openid"); if (!$wechat_id) { $wechat_id = $request->input("openid"); } $order_id = $request->input("order_id"); $order_type = $request->input("order_type"); $order = CommonController::getRecord($order_type, $order_id); // 先判断微信交易是否失效,失效的话需要重新生成份新的系统内部订单,再重新统一下单 if ($wechat_id && $order) { // 判断微信交易是否失效 if(Carbon::now()->subHour()->gt($order->created_at)) { $order_new = clone $order; $order_new->id = null; $order_new->exists = false; $order_new->save(); $order->delete(); $order_id = $order_new->id; } $out_trade_no = $order_type . "_" . $order_id; $app = app('wechat.payment'); $result = $app->order->unify([ 'body' => '玥子轩家政', 'out_trade_no' => $out_trade_no, 'total_fee' => $order->price * 100, 'trade_type' => 'JSAPI', 'openid' => $wechat_id, 'notify_url' => 'https://wechat.sotype.com/api/payments/wechat-notify', 'time_expire' => Carbon::now()->addHour()->format('YmdHis') ]); if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { //第二次签名 //$result = $app->jssdk->appConfig($result['prepay_id']); //$config = $app->configForAppPayment($result['prepay_id']); $config = $app->jssdk->sdkConfig($result['prepay_id']); return response()->json([ "status" => 0, "code" => "success", "msg" => $config, "out_trade_no" => $out_trade_no ]); } else { return response()->json([ "status" => -1, "message" => '微信支付签名失败:' . var_export($result, 1) ]); } } } /** * 支付成功回调函数 * @param Request $request * @return mixed */ public function notify(Request $request) { $app = app('wechat.payment'); $response = $app->handlePaidNotify(function($message, $fail){ // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单 list($order_type, $order_id) = spilt("_", $message['out_trade_no']); $order = CommonController::getRecord($order_type, $order_id); if (!$order || $order->paid_at) { // 如果订单不存在 或者 订单已经支付过了 return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了 } ///////////// <- 建议在这里调用微信的【订单查询】接口查一下该笔订单的情况,确认是已经支付 ///////////// /*$app = app('wechat.payment'); $order_result = $app->order->queryByOutTradeNumber($message['out_trade_no']); if($order_result && $order_result['return_code'] === 'SUCCESS') { // 如果支付成功 if($order_result["trade_state"] != "SUCCESS") { $order->status = -1; } else { } }*/ if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态 // 用户是否支付成功 if (array_get($message, 'result_code') === 'SUCCESS') { $order->paid_at = time(); // 更新支付时间为当前时间 $order->status = 2; // 用户支付失败 } elseif (array_get($message, 'result_code') === 'FAIL') { $order->status = -1; } } else { return $fail('通信失败,请稍后再通知我'); } $order->save(); // 保存订单 return true; // 返回处理完成 }); return $response; } }