我添加了一個新的處理器,可以計算禮品卡的金額。
services:
app.order_processing.gift_card_processor:
class: App\OrderProcessing\GiftCardProcessor
arguments:
- '@sylius.factory.adjustment'
- '@translator'
tags:
- { name: sylius.order_processor, priority: 5 }
<?php
declare(strict_types=1);
namespace App\OrderProcessing;
use App\Entity\Order\Adjustment;
use App\Entity\Order\Order;
use Sylius\Component\Order\Model\OrderInterface as BaseOrderInterface;
use Sylius\Component\Order\Processor\OrderProcessorInterface;
use Sylius\Component\Resource\Factory\FactoryInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
use Webmozart\Assert\Assert;
final class GiftCardProcessor implements OrderProcessorInterface
{
private FactoryInterface $adjustmentFactory;
private TranslatorInterface $translator;
public function __construct(
FactoryInterface $adjustmentFactory,
TranslatorInterface $translator
) {
$this->adjustmentFactory = $adjustmentFactory;
$this->translator = $translator;
}
public function process(BaseOrderInterface $order): void
{
/** @var Order $order */
Assert::isInstanceOf($order, Order::class);
// Remove all gift card adjustments, we recalculate everything from scratch.
$order->removeAdjustments(Adjustment::ORDER_GIFT_CARD_ADJUSTMENT);
foreach ($order->getGiftCardOrders() as $giftCardOrder) {
$giftCard = $giftCardOrder->getGiftCard();
$giftCardRemainingAmount = (int) $giftCard->getRemainingAmount() * 100;
$amount = $giftCardRemainingAmount > $order->getTotal() ? $order->getTotal() : $giftCardRemainingAmount;
/** @var Adjustment $adjustment */
$adjustment = $this->adjustmentFactory->createNew();
$adjustment->setType(Adjustment::ORDER_GIFT_CARD_ADJUSTMENT);
$adjustment->setAmount(-$amount);
$adjustment->setLabel($this->translator->trans('gift_card.ui.gift_card'));
$giftCard->addAdjustment($adjustment);
$giftCardOrder->setAmount($amount / 100);
$order->addAdjustment($adjustment);
}
}
}
顯示在購物車中并插入到資料庫中的總訂單金額是正確的(截圖 1 和 2)。
螢屏截圖 1 螢屏截圖 2
分條支付時出現BUG,顯示金額對應初始金額,不支持禮品卡扣減(截圖3)
螢屏截圖 3
uj5u.com熱心網友回復:
如果您使用此 Sylius 插件:flux-se/sylius-payum-stripe-plugin您必須創建代表您的禮品卡裝飾的單獨優惠券:https : //github.com/FLUX-SE/SyliusPayumStripePlugin/blob/master/src/Provider/DetailsProvider.php新的陣列成員creatediscounts就像 Stripe 檔案定義它一樣:https : //stripe.com/docs/api/checkout/sessions/create#create_checkout_session-discounts
該插件只負責鏈接到一個OrderItem或一個的默認 Sylius 調整OrderItemUnit。如果調整是鏈接的,Order那么它不會被考慮在內,因為 Stripe 只是把所有的總和line_item作為總數。Stripe 不允許訂單項出現負金額,這就是為什么優惠券是減少付款總額的唯一方法。
如果您使用以下格式標記優惠券 ID,則這是處理優惠券創建所需的 payum 擴展sprintf('GIFT_CARD_%s', $giftCard->getCode()):
<?php
declare(strict_types=1);
namespace App\GiftCard\Payum\Extension;
use FluxSE\PayumStripe\Request\Api\Resource\CreateCoupon;
use FluxSE\PayumStripe\Request\Api\Resource\RetrieveCoupon;
use FluxSE\SyliusPayumStripePlugin\Action\ConvertPaymentAction;
use Payum\Core\Extension\Context;
use Payum\Core\Extension\ExtensionInterface;
use Payum\Core\Request\Convert;
use Stripe\Exception\ApiErrorException;
use Sylius\Component\Core\Model\PaymentInterface;
final class CheckCouponsExtension implements ExtensionInterface
{
public function onPreExecute(Context $context)
{
}
public function onExecute(Context $context)
{
}
public function onPostExecute(Context $context)
{
if ($context->getException()) {
return;
}
if (false === $context->getAction() instanceof ConvertPaymentAction) {
return;
}
/** @var mixed|Convert $request */
$request = $context->getRequest();
if (false === $request instanceof Convert) {
return;
}
/** @var mixed|PaymentInterface $payment */
$payment = $request->getSource();
if (false === $payment instanceof PaymentInterface) {
return;
}
$order = $payment->getOrder();
if (null === $order) {
return;
}
$gateway = $context->getGateway();
foreach ($order->getGiftCardOrders() as $giftCardOrder) {
$giftCard = $giftCardOrder->getGiftCard();
$couponId = sprintf('GIFT_CARD_%s', $giftCard->getCode());
$retrieveCouponRequest = new RetrieveCoupon($couponId);
try {
$gateway->execute($retrieveCouponRequest);
} catch (ApiErrorException $e) {
$createCouponRequest = new CreateCoupon([
'id' => $couponId,
"amount_off" => $giftCard->getAmount()/100,
"currency" => $order->getCurrencyCode(),
"metadata" => [
'SYLIUS_GIFTCARD_ID' => $giftCard->getId(),
'SYLIUS_GIFTCARD_CODE' => $giftCard->getCode(),
],
"name" => sprintf("Gift card #%d", $giftCard->getId()),
]);
$gateway->execute($createCouponRequest);
}
}
}
}
這是服務宣告:
services:
App\GiftCard\Payum\Extension\CheckCouponsExtension:
public: true
tags:
- name: payum.extension
alias: app.extension.check_coupons
factory: stripe_checkout_session
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/354366.html
上一篇:在Symfony5的FormType中,此背景關系中不允許使用型別“App\Entity\User”的運算式
下一篇:自定義表單的多選模板
