From dbfd86b6fecd6159ca21f771948f746b601196c4 Mon Sep 17 00:00:00 2001 From: liapples Date: Thu, 9 Sep 2021 19:12:37 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BB=B7=E6=A0=BC=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/SharePayController.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/SharePayController.php b/app/Http/Controllers/Api/SharePayController.php index ff6f8f1..f6aa8f2 100644 --- a/app/Http/Controllers/Api/SharePayController.php +++ b/app/Http/Controllers/Api/SharePayController.php @@ -44,6 +44,13 @@ class SharePayController extends Controller $order->pay_user_id = $this->user_id; $order->save(); + //如果已经付定金或首付款,则仅支付尾款 TODO 还有定金支付 + /*if ($order->status == Status::PAY_EARNEST) { + $price = $order->price - $order->paid_money; + } else { + $price = $this->calc($order->price, $order->num, $order->pay_type, $ap); + }*/ + $config = config('wechat.payment.default'); $config = array_merge($config, [ 'app_id' => 'wxb35ef055a4dd8ad4', @@ -56,7 +63,7 @@ class SharePayController extends Controller $result = $app->order->unify([ 'body' => $order->title, 'out_trade_no' => $order->order_no . '-' . $order->status, //后面加status,主要是为了方便微信支付回调时区分定金(首付款)和尾款支付 - 'total_fee' => 1, //TODO 测试暂时注释 round($price * 100), //支付金额单位为分 + 'total_fee' => round($order->price * 100), //支付金额单位为分 'notify_url' => route('wxpay_notify', ['agent_id' => $this->agent_id]), // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'trade_type' => 'JSAPI', 'openid' => $openid, From 2c1f1e51bbb3e430f7b1912982ff40b249f27898 Mon Sep 17 00:00:00 2001 From: liapples Date: Thu, 9 Sep 2021 19:40:46 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=B0=8F=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/WxpayController.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/WxpayController.php b/app/Http/Controllers/Api/WxpayController.php index d81c449..626bec9 100644 --- a/app/Http/Controllers/Api/WxpayController.php +++ b/app/Http/Controllers/Api/WxpayController.php @@ -38,7 +38,7 @@ class WxpayController // 请求成功 if ($message['return_code'] === 'SUCCESS') { //主要是为了区分定金支付和尾款支付,订单号带有-status后缀,分割后前面才是真正的订单号 - list($order_no, $status) = explode('-', $message['out_trade_no']); + $order_no = explode('-', $message['out_trade_no'])[0]; $order = Order::query() ->where(['order_no' => $order_no]) ->first(); @@ -164,7 +164,7 @@ class WxpayController // 请求成功 if ($message['return_code'] === 'SUCCESS') { //主要是为了区分定金支付和尾款支付,订单号带有-status后缀,分割后前面才是真正的订单号 - list($order_no, $status) = explode('-', $message['out_trade_no']); + $order_no = explode('-', $reqInfo['out_trade_no'])[0]; $order = Order::query() ->where(['order_no' => $order_no]) ->first(); From 282836c674f8ff461412d5b93d82024f3c155548 Mon Sep 17 00:00:00 2001 From: liapples Date: Thu, 9 Sep 2021 20:14:32 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E9=80=80=E6=AC=BE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/AdminAgent/Extensions/Grid/AuditRefund.php | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/app/AdminAgent/Extensions/Grid/AuditRefund.php b/app/AdminAgent/Extensions/Grid/AuditRefund.php index d7275ab..465f334 100644 --- a/app/AdminAgent/Extensions/Grid/AuditRefund.php +++ b/app/AdminAgent/Extensions/Grid/AuditRefund.php @@ -78,10 +78,24 @@ class AuditRefund extends RowAction // 参数分别为:微信订单号、商户退款单号、订单金额、退款金额、其他参数 foreach ($log as $k=>$v) { $refund_no = $order->refund_info['refund_no'] . '-' . $v['id']; - $app->refund->byTransactionId($v->transaction_id, $refund_no, $v->money, $v->money, $config); + $money = intval(0 - $v->money * 100); + $result = $app->refund->byTransactionId($v->transaction_id, $refund_no, $money, $money); + + //存入UserMoneyLog + if (isset($result['return_code'], $result['result_code']) && $result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') { + UserMoneyLog::query()->insert([ + 'user_id' => $order->user_id, + 'agent_id' => $order->agent_id, + 'money' => $result['refund_fee'] / 100, + 'order_id' => $order->id, + 'type' => 2, + 'desc' => DB::raw("LEFT('退款:{$order->title}', 250)"), + 'transaction_id' => $result['transaction_id'], + 'created_at' => now(), //模型没有updated_at,无法自动写入时间 + ]); + } } - //退款回调之后再存入UserMoneyLog DB::commit(); return $this->response()->success("操作成功,已向微信申请退款,款项将原路退还")->refresh(); From d693ac61d4f5fd155bf33a8eac0fff5fe72aafc3 Mon Sep 17 00:00:00 2001 From: liapples Date: Fri, 10 Sep 2021 09:23:18 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/AdminAgent/Extensions/Grid/AuditRefund.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/AdminAgent/Extensions/Grid/AuditRefund.php b/app/AdminAgent/Extensions/Grid/AuditRefund.php index 465f334..d7da635 100644 --- a/app/AdminAgent/Extensions/Grid/AuditRefund.php +++ b/app/AdminAgent/Extensions/Grid/AuditRefund.php @@ -93,12 +93,14 @@ class AuditRefund extends RowAction 'transaction_id' => $result['transaction_id'], 'created_at' => now(), //模型没有updated_at,无法自动写入时间 ]); + } else { + return $this->response()->error("操作失败,失败原因:" . ($result['return_msg']??'未知'))->refresh(); } } DB::commit(); - return $this->response()->success("操作成功,已向微信申请退款,款项将原路退还")->refresh(); + return $this->response()->success("操作成功,款项将原路退还")->refresh(); } catch (\Exception $e) { DB::rollBack(); return $this->response()->error($e->getMessage()); From 7b8d5a99d6135855e3bcb6e784a09bbe6ecb3ef9 Mon Sep 17 00:00:00 2001 From: liapples Date: Fri, 10 Sep 2021 09:28:59 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E6=B8=85=E7=A9=BA=E6=A0=B8=E9=94=80?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/AdminAgent/Extensions/Grid/AuditRefund.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/AdminAgent/Extensions/Grid/AuditRefund.php b/app/AdminAgent/Extensions/Grid/AuditRefund.php index d7da635..fb23e37 100644 --- a/app/AdminAgent/Extensions/Grid/AuditRefund.php +++ b/app/AdminAgent/Extensions/Grid/AuditRefund.php @@ -51,6 +51,7 @@ class AuditRefund extends RowAction if (!$order) { return $this->response()->error("退款订单不存在或已处理过了")->refresh(); } + $order->verify_code = ''; //清空核销码 $order->status = OrderStatus::REFUNDED; $order->save(); @@ -98,7 +99,6 @@ class AuditRefund extends RowAction } } - DB::commit(); return $this->response()->success("操作成功,款项将原路退还")->refresh(); } catch (\Exception $e) { From 8e11b266cf4306fffd2441c5c2e4d421db52d4c0 Mon Sep 17 00:00:00 2001 From: liapples Date: Fri, 10 Sep 2021 09:32:59 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E6=81=A2=E5=A4=8D=E4=BB=B7=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/OrderController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php index 17c39e6..1be7923 100644 --- a/app/Http/Controllers/Api/OrderController.php +++ b/app/Http/Controllers/Api/OrderController.php @@ -366,7 +366,7 @@ class OrderController extends Controller $result = $app->order->unify([ 'body' => $order->title, 'out_trade_no' => $order->order_no . '-' . $order->status, //后面加status,主要是为了方便微信支付回调时区分定金(首付款)和尾款支付 - 'total_fee' => 1, //TODO 测试暂时注释 round($price * 100), //支付金额单位为分 + 'total_fee' => round($price * 100), //支付金额单位为分 'notify_url' => route('wxpay_notify', ['agent_id' => $this->agent_id]), // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'trade_type' => 'JSAPI', 'openid' => $openid, From 2e4b4c63f624a07d8c4d28acd2964ba3ad6c6cd2 Mon Sep 17 00:00:00 2001 From: liapples Date: Fri, 10 Sep 2021 09:59:41 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=B7=E6=A0=BC?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/OrderController.php | 10 ++-- .../Controllers/Api/SharePayController.php | 49 +++++++++++++++---- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/Api/OrderController.php b/app/Http/Controllers/Api/OrderController.php index 1be7923..1f13f90 100644 --- a/app/Http/Controllers/Api/OrderController.php +++ b/app/Http/Controllers/Api/OrderController.php @@ -432,19 +432,19 @@ class OrderController extends Controller * 计算最终价格(扣除优惠券之后的价格) * $price:原价;$coupon:优惠券;$num:产品数量;$pay_type:支付方式 * @param float $price - * @param int $num + * @param float $num * @param int $pay_type - * @param Model $agent_product + * @param AgentProduct $agent_product * @return float */ - private function calc($price, $num, $pay_type, $agent_product) + private function calc(float $price, float $num, int $pay_type, AgentProduct $agent_product): float { + /** 修改需要同步修改sharePay里面的 */ //根据支付方式计算价格 if (in_array($pay_type, [PayType::DEPOSIT_PAY, PayType::EARNEST_PAY, PayType::DOWN_PAYMENT])) { if ($pay_type == PayType::DEPOSIT_PAY && $agent_product->deposit && $agent_product->deposit_timeout) { return $agent_product->deposit; - } - if ($pay_type == PayType::EARNEST_PAY && $agent_product->earnest && $agent_product->earnest_timeout) { + } else if ($pay_type == PayType::EARNEST_PAY && $agent_product->earnest && $agent_product->earnest_timeout) { return $agent_product->earnest; } } diff --git a/app/Http/Controllers/Api/SharePayController.php b/app/Http/Controllers/Api/SharePayController.php index f6aa8f2..10aa215 100644 --- a/app/Http/Controllers/Api/SharePayController.php +++ b/app/Http/Controllers/Api/SharePayController.php @@ -2,8 +2,10 @@ namespace App\Http\Controllers\Api; use App\Common\OrderStatus as Status; +use App\Common\PayType; use App\Http\Controllers\Controller; use App\Models\Agent; +use App\Models\AgentProduct; use App\Models\Order; use App\Models\User; use EasyWeChat\Factory; @@ -36,20 +38,23 @@ class SharePayController extends Controller $openid = $user_info['openid']; $this->agent_id = $user_info['agent_id']; - $order = Order::query()->whereIn('status', [Status::UNPAID, Status::PAY_EARNEST])->find($order_id); + $order = Order::with(['agentProduct']) + ->whereRaw('`timeout` >= NOW()') + ->whereIn('status', [Status::UNPAID, Status::PAY_EARNEST]) + ->find($order_id); if (!$order) { - return $this->error('订单不存在或已支付'); + return $this->error('订单已支付或已超时'); } $order->pay_user_id = $this->user_id; $order->save(); - //如果已经付定金或首付款,则仅支付尾款 TODO 还有定金支付 - /*if ($order->status == Status::PAY_EARNEST) { + //如果已经付定金或首付款,则仅支付尾款 + if ($order->status == Status::PAY_EARNEST) { $price = $order->price - $order->paid_money; } else { - $price = $this->calc($order->price, $order->num, $order->pay_type, $ap); - }*/ + $price = $this->calc($order->price, $order->num, $order->pay_type, $order->agent_product); + } $config = config('wechat.payment.default'); $config = array_merge($config, [ @@ -63,7 +68,7 @@ class SharePayController extends Controller $result = $app->order->unify([ 'body' => $order->title, 'out_trade_no' => $order->order_no . '-' . $order->status, //后面加status,主要是为了方便微信支付回调时区分定金(首付款)和尾款支付 - 'total_fee' => round($order->price * 100), //支付金额单位为分 + 'total_fee' => round($price * 100), //支付金额单位为分 'notify_url' => route('wxpay_notify', ['agent_id' => $this->agent_id]), // 支付结果通知网址,如果不设置则会使用配置里的默认地址 'trade_type' => 'JSAPI', 'openid' => $openid, @@ -78,10 +83,36 @@ class SharePayController extends Controller return $result; } + $jump_appid = Agent::where('id', $order->agent_id)->value('appid'); + $jssdk = $app->jssdk; - $goback_appid = Agent::where('id', $order->agent_id)->value('appid'); $payConfig = $jssdk->bridgeConfig($result['prepay_id'], false) + - ['id' => $order->id, 'order_no' => $order->order_no, 'jump_appid' => $goback_appid]; // 返回数组 + ['id' => $order->id, 'order_no' => $order->order_no, 'jump_appid' => $jump_appid]; // 返回数组 return $this->success($payConfig); } + + /** + * 计算最终价格 + * @param float $price 订单价格 + * @param float $num 购买数量 + * @param int $pay_type 支付方式 + * @param AgentProduct $agent_product 代理商产品 + * @return float + */ + private function calc(float $price, float $num, int $pay_type, AgentProduct $agent_product): float + { + /** 修改需要同步修改Order里面的 */ + //根据支付方式计算价格 + if (in_array($pay_type, [PayType::DEPOSIT_PAY, PayType::EARNEST_PAY, PayType::DOWN_PAYMENT])) { + if ($pay_type == PayType::DEPOSIT_PAY && $agent_product->deposit && $agent_product->deposit_timeout) { + return $agent_product->deposit; + } else if ($pay_type == PayType::EARNEST_PAY && $agent_product->earnest && $agent_product->earnest_timeout) { + return $agent_product->earnest; + } + } + + $total_price = $price * $num; + + return round($total_price, 2); + } }