wx_share finish
parent
6e9d4633a8
commit
f2bb712dd5
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Actions\Order;
|
||||||
|
|
||||||
|
use App\Models\Order;
|
||||||
|
use App\Services\Payment\WxpayService;
|
||||||
|
use Dcat\Admin\Grid\RowAction;
|
||||||
|
|
||||||
|
class RowWxShareFinish extends RowAction
|
||||||
|
{
|
||||||
|
protected $title = '解冻资金';
|
||||||
|
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$order = Order::findOrFail($this->primaryKey);
|
||||||
|
$service = new WxpayService();
|
||||||
|
$sn = serial_number();
|
||||||
|
$result = $service->finishShare($order->out_trade_no, $sn);
|
||||||
|
if (data_get($result, 'return_code') != 'SUCCESS') {
|
||||||
|
return $this->response()->error(data_get($result, 'return_msg'));
|
||||||
|
}
|
||||||
|
if (data_get($result, 'result_code') != 'SUCCESS') {
|
||||||
|
return $this->response()->error(data_get($result, 'err_code') . ':' . data_get($result, 'err_code_des'));
|
||||||
|
}
|
||||||
|
$attributes = ['finish_sn' => $sn, 'status' => 'Y'];
|
||||||
|
$order->update($order->wx_share ? array_merge($order->wx_share, $attributes) : $attributes);
|
||||||
|
return $this->response()->success('成功!');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function confirm()
|
||||||
|
{
|
||||||
|
return ['确定要解冻资金?', '解冻资金后将无法进行分账'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ namespace App\Admin\Controllers;
|
||||||
use App\Admin\Actions\Grid\Exports\ShippingOrder as ExportShippingOrder;
|
use App\Admin\Actions\Grid\Exports\ShippingOrder as ExportShippingOrder;
|
||||||
use App\Admin\Actions\Grid\KuaidiInfo;
|
use App\Admin\Actions\Grid\KuaidiInfo;
|
||||||
use App\Admin\Actions\Grid\OrderSetTag;
|
use App\Admin\Actions\Grid\OrderSetTag;
|
||||||
|
use App\Admin\Actions\Order\RowWxShareFinish;
|
||||||
use App\Admin\Actions\Show\OrderConsigneeInfo;
|
use App\Admin\Actions\Show\OrderConsigneeInfo;
|
||||||
use App\Admin\Actions\Show\OrderCreatePackage;
|
use App\Admin\Actions\Show\OrderCreatePackage;
|
||||||
use App\Admin\Actions\Show\OrderPay;
|
use App\Admin\Actions\Show\OrderPay;
|
||||||
|
|
@ -253,24 +254,30 @@ class OrderController extends AdminController
|
||||||
$filter->like('pay_sn')->width(3);
|
$filter->like('pay_sn')->width(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
$grid->tools(function (Grid\Tools $tools) {
|
$user = Admin::user();
|
||||||
if (Admin::user()->can('dcat.admin.orders.export_shipping_orders')) {
|
$grid->tools(function (Grid\Tools $tools) use ($user) {
|
||||||
|
if ($user->can('dcat.admin.orders.export_shipping_orders')) {
|
||||||
$tools->append(new ExportShippingOrder());
|
$tools->append(new ExportShippingOrder());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Admin::user()->can('dcat.admin.orders.export_order_products')) {
|
if ($user->can('dcat.admin.orders.export_order_products')) {
|
||||||
$tools->append(new ExportProduct());
|
$tools->append(new ExportProduct());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
$grid->actions(function (Grid\Displayers\Actions $actions) use ($user) {
|
||||||
if (Admin::user()->can('dcat.admin.orders.show')) {
|
$row = $actions->row;
|
||||||
|
if ($user->can('dcat.admin.orders.show')) {
|
||||||
$actions->disableView(false);
|
$actions->disableView(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Admin::user()->can('dcat.admin.orders.tags')) {
|
if ($user->can('dcat.admin.orders.tags')) {
|
||||||
$actions->append(new OrderSetTag());
|
$actions->append(new OrderSetTag());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data_get($row->wx_share, 'status') != 'Y') {
|
||||||
|
$actions->append(new RowWxShareFinish());
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$grid->footer(function ($collection) use ($grid) {
|
$grid->footer(function ($collection) use ($grid) {
|
||||||
|
|
|
||||||
|
|
@ -189,7 +189,7 @@ class OrderController extends AdminController
|
||||||
$show->field('cost_price')->as(fn ($value) => bcdiv($value, 100, 2));
|
$show->field('cost_price')->as(fn ($value) => bcdiv($value, 100, 2));
|
||||||
$show->field('profit_price')->as(fn () => round(($this->total_amount - $this->cost_price) / 100, 2, PHP_ROUND_HALF_DOWN));
|
$show->field('profit_price')->as(fn () => round(($this->total_amount - $this->cost_price) / 100, 2, PHP_ROUND_HALF_DOWN));
|
||||||
$show->field('vip_discount_amount')->as(fn ($v) => bcdiv($v, 100, 2))->prepend('- ¥');
|
$show->field('vip_discount_amount')->as(fn ($v) => bcdiv($v, 100, 2))->prepend('- ¥');
|
||||||
|
|
||||||
// 优惠券
|
// 优惠券
|
||||||
$show->field('user_coupon_id')->as(fn() => data_get($this->userCoupon, 'coupon_name'));
|
$show->field('user_coupon_id')->as(fn() => data_get($this->userCoupon, 'coupon_name'));
|
||||||
$show->field('coupon_discount_amount')->as(fn($value) => bcdiv($value, 100, 2))->prepend('- ¥');
|
$show->field('coupon_discount_amount')->as(fn($value) => bcdiv($value, 100, 2))->prepend('- ¥');
|
||||||
|
|
@ -199,11 +199,11 @@ class OrderController extends AdminController
|
||||||
$show->field('total_amount')->as(fn($value) => bcdiv($value, 100, 2))->prepend('¥');
|
$show->field('total_amount')->as(fn($value) => bcdiv($value, 100, 2))->prepend('¥');
|
||||||
$show->field('sales_value');
|
$show->field('sales_value');
|
||||||
$show->field('order_status')->as(fn() => $this->order_status)->using($this->statusMap)->dot($this->statusColor);
|
$show->field('order_status')->as(fn() => $this->order_status)->using($this->statusMap)->dot($this->statusColor);
|
||||||
$show->field('pay_way')->as(fn() => $this->pay_way?->mallText())->circleDot(PayWay::colors());
|
$show->field('pay_way')->as(fn() => $this->pay_way?->text())->circleDot(PayWay::colors());
|
||||||
$show->field('created_at');
|
$show->field('created_at');
|
||||||
$show->field('pay_at');
|
$show->field('pay_at');
|
||||||
$show->field('completed_at');
|
$show->field('completed_at');
|
||||||
|
|
||||||
if ($model->source_type == Desk::class) {
|
if ($model->source_type == Desk::class) {
|
||||||
$show->field('desk_id')->as(fn() => data_get($model->source, 'name'));
|
$show->field('desk_id')->as(fn() => data_get($model->source, 'name'));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,7 @@ enum PayWay: string {
|
||||||
static::WxpayH5->value => '#21b978',
|
static::WxpayH5->value => '#21b978',
|
||||||
static::WxpayJsApi->value => '#21b978',
|
static::WxpayJsApi->value => '#21b978',
|
||||||
static::WxpayMiniProgram->value => '#21b978',
|
static::WxpayMiniProgram->value => '#21b978',
|
||||||
|
static::WxPayShare->value => '#21b978',
|
||||||
// 支付宝
|
// 支付宝
|
||||||
static::AlipayApp->value => '#3085d6',
|
static::AlipayApp->value => '#3085d6',
|
||||||
];
|
];
|
||||||
|
|
|
||||||
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
namespace App\Listeners;
|
namespace App\Listeners;
|
||||||
|
|
||||||
|
use App\Enums\PayWay;
|
||||||
use App\Models\Order;
|
use App\Models\Order;
|
||||||
use App\Services\DistributeService;
|
use App\Services\DistributeService;
|
||||||
|
use App\Services\Payment\WxpayService;
|
||||||
use Exception;
|
use Exception;
|
||||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
use Illuminate\Queue\InteractsWithQueue;
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
|
@ -33,9 +35,27 @@ class OrderDistribute
|
||||||
try {
|
try {
|
||||||
DB::beginTransaction();
|
DB::beginTransaction();
|
||||||
$service = new DistributeService();
|
$service = new DistributeService();
|
||||||
$service->storeByOrder($order);
|
$profits = $service->storeByOrder($order);
|
||||||
DB::commit();
|
DB::commit();
|
||||||
|
|
||||||
|
// 如果没有提成记录
|
||||||
|
if ($profits->count() <= 0 && in_array($order->pay_way, [PayWay::WxpayApp, PayWay::WxpayH5, PayWay::WxpayJsApi, PayWay::WxpayMiniProgram])) {
|
||||||
|
// 解冻资金
|
||||||
|
$sn = serial_number();
|
||||||
|
$result = (new WxpayService())->finishShare($order->out_trade_no, $sn);
|
||||||
|
if (data_get($result, 'return_code') != 'SUCCESS') {
|
||||||
|
logger()->error('微信分账-解冻资金失败', $result);
|
||||||
|
}
|
||||||
|
else if (data_get($result, 'result_code') != 'SUCCESS') {
|
||||||
|
logger()->error('微信分账-解冻资金失败', $result);
|
||||||
|
} else {
|
||||||
|
$attributes = ['finish_sn' => $sn, 'status' => 'Y'];
|
||||||
|
$order->update($order->wx_share ? array_merge($order->wx_share, $attributes) : $attributes);
|
||||||
|
}
|
||||||
|
}
|
||||||
} catch (Exception $e) {
|
} catch (Exception $e) {
|
||||||
|
logger('添加提成记录失败');
|
||||||
|
logger()->error($e);
|
||||||
DB::rollBack();
|
DB::rollBack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -59,6 +59,7 @@ class Order extends Model
|
||||||
'profit_paid' => 'datetime',
|
'profit_paid' => 'datetime',
|
||||||
'status' => 'int',
|
'status' => 'int',
|
||||||
'is_change' => 'bool',
|
'is_change' => 'bool',
|
||||||
|
'wx_share' => 'json',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -100,6 +101,7 @@ class Order extends Model
|
||||||
'cost_price',
|
'cost_price',
|
||||||
'profit_paid',
|
'profit_paid',
|
||||||
'point_discount_amount',
|
'point_discount_amount',
|
||||||
|
'wx_share',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -241,6 +241,9 @@ class DistributeService
|
||||||
|
|
||||||
$result = (new WxpayService())->share($order->out_trade_no, $sn, $receivers);
|
$result = (new WxpayService())->share($order->out_trade_no, $sn, $receivers);
|
||||||
|
|
||||||
|
$attributes = ['share_sn' => $sn, 'status' => 'N'];
|
||||||
|
$order->update($order->wx_share ? array_merge($order->wx_share, $attributes) : $attributes);
|
||||||
|
|
||||||
$status = data_get($result, 'status');
|
$status = data_get($result, 'status');
|
||||||
if ($status == 'FINISHED') {
|
if ($status == 'FINISHED') {
|
||||||
$this->success($list, $result);
|
$this->success($list, $result);
|
||||||
|
|
|
||||||
|
|
@ -1267,6 +1267,9 @@ class OrderService
|
||||||
PayWay::WxpayMiniProgram => 'mini_program',
|
PayWay::WxpayMiniProgram => 'mini_program',
|
||||||
default => 'default',
|
default => 'default',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 更新订单冻结状态
|
||||||
|
$order->update(['wx_share' => $order->wx_share ? array_merge($order->wx_share, ['status' => 'Y']) : ['status' => 'Y']]);
|
||||||
} elseif ($payLog->isAlipay()) {
|
} elseif ($payLog->isAlipay()) {
|
||||||
$params = [
|
$params = [
|
||||||
'subject' => app_settings('app.app_name').'-商城订单',
|
'subject' => app_settings('app.app_name').'-商城订单',
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,10 @@ namespace App\Services\Payment;
|
||||||
use App\Enums\WxpayTradeType;
|
use App\Enums\WxpayTradeType;
|
||||||
use App\Exceptions\WeChatPayException;
|
use App\Exceptions\WeChatPayException;
|
||||||
use EasyWeChat\Factory;
|
use EasyWeChat\Factory;
|
||||||
|
use EasyWeChat\Kernel\Exceptions\InvalidArgumentException;
|
||||||
|
use EasyWeChat\Kernel\Exceptions\InvalidConfigException;
|
||||||
use EasyWeChat\Payment\Application;
|
use EasyWeChat\Payment\Application;
|
||||||
|
use GuzzleHttp\Exception\GuzzleException;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
|
|
||||||
class WxpayService
|
class WxpayService
|
||||||
|
|
@ -154,6 +157,31 @@ class WxpayService
|
||||||
return $app->profit_sharing->query($transaction_id, $share_sn);
|
return $app->profit_sharing->query($transaction_id, $share_sn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信支付-完结分账, 解冻订单剩余资金
|
||||||
|
*
|
||||||
|
* @param string $transaction_id 微信支付流水号
|
||||||
|
* @param string $out_trade_sn 分账订单号, 自动生成
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function finishShare(string $transaction_id, string $out_trade_sn)
|
||||||
|
{
|
||||||
|
$app = $this->payment();
|
||||||
|
// 服务商模式 (子商户)
|
||||||
|
$appId = config('wechat.payment.sub.app_id');
|
||||||
|
$mchId = config('wechat.payment.sub.mch_id');
|
||||||
|
|
||||||
|
if ($appId && $mchId) {
|
||||||
|
$app->setSubMerchant($mchId, $appId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $app->profit_sharing->markOrderAsFinished([
|
||||||
|
'transaction_id' => $transaction_id,
|
||||||
|
'out_order_no' => $out_trade_sn,
|
||||||
|
'description' => '订单分账完结, 解冻资金'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据商户订单号退款
|
* 根据商户订单号退款
|
||||||
*
|
*
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class AddWxShareToOrders extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('orders', function (Blueprint $table) {
|
||||||
|
// status: Y/N, 分账状态, Y: 开始分账, N: 已经完结(解冻资金)
|
||||||
|
// share_sn: 20230xxxxx, 分账订单号
|
||||||
|
// finish_sn: 20230xxxxx, 完结分账订单号
|
||||||
|
$table->json('wx_share')->nullable()->comment('微信分账信息');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('orders', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['wx_share']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace Tests\Feature;
|
namespace Tests\Feature;
|
||||||
|
|
||||||
|
use App\Enums\PayWay;
|
||||||
use App\Services\DistributeService;
|
use App\Services\DistributeService;
|
||||||
use App\Services\Payment\WxpayService;
|
use App\Services\Payment\WxpayService;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
@ -17,18 +18,8 @@ class ExampleTest extends TestCase
|
||||||
*/
|
*/
|
||||||
public function test_example()
|
public function test_example()
|
||||||
{
|
{
|
||||||
// $order = Order::findOrFail(3146);
|
$result = ['status' => 'N', 'sn' => '21322132'];
|
||||||
// try {
|
dump($result ? array_merge($result, ['status' => 'Y']) : ['status' => 'Y']);
|
||||||
// DB::beginTransaction();
|
|
||||||
// (new DistributeService())->wechatShare($order);
|
|
||||||
// $order->update(['profit_paid' => now()]);
|
|
||||||
// DB::commit();
|
|
||||||
// } catch (\Exception $e) {
|
|
||||||
// DB::rollBack();
|
|
||||||
// report($e);
|
|
||||||
// }
|
|
||||||
$result = (new WxpayService())->queryShare('4200002029202310133548206841', '20231013084421898946');
|
|
||||||
dump($result);
|
|
||||||
$this->assertTrue(true);
|
$this->assertTrue(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue