加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 如何在使用Sylius 0.16和Payum实现非现场支付网关时完成

发布时间:2020-12-13 18:00:39 所属栏目:PHP教程 来源:网络整理
导读:我一直在努力探讨如何使用Sylius(sylius / sylius-standard,v0.16)实现经典的离线支付网关. 到目前为止,我在bundle的build()方法中得到了这个: public function build(ContainerBuilder $container){ /** @var PayumExtension $payum */ $payum = $containe
我一直在努力探讨如何使用Sylius(sylius / sylius-standard,v0.16)实现经典的离线支付网关.

到目前为止,我在bundle的build()方法中得到了这个:

public function build(ContainerBuilder $container)
{
    /** @var PayumExtension $payum */
    $payum = $container->getExtension('payum');
    $payum->addGatewayFactory(new PayWayOffsiteGatewayFactory());
}

这是我的config.yml:

sylius_payment:
    gateways:
        payway_offsite: PayWay

payum:
    gateways:
        payway_offsite:
            payway_offsite:
                secret_key: %tcompayway.secret_key%
                shop_id:    %tcompayway.shop_id%
                username:   %tcompayway.username%
                password:   %tcompayway.password%
                sandbox:    %tcompayway.sandbox%

%compayway.*%字段配置正常,跳过此部分.
然后我在PayWayOffsiteGatewayFactory类中得到了这个:

class PayWayOffsiteGatewayFactory extends AbstractGatewayFactory
{
    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'payway_offsite';
    }

    /**
     * {@inheritdoc}
     */
    public function addConfiguration(ArrayNodeDefinition $builder)
    {
        parent::addConfiguration($builder);

        $builder->children()
            ->scalarNode('secret_key')->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('shop_id')->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('username')->isRequired()->cannotBeEmpty()->end()
            ->scalarNode('password')->isRequired()->cannotBeEmpty()->end()
            ->booleanNode('sandbox')->defaultTrue()->end()
            ->end();
    }

    /**
     * {@inheritDoc}
     */
    protected function getPayumGatewayFactoryClass()
    {
        return 'WebBurzaPaymentBundlePayumPayWayPayWayGatewayFactory';
    }

    /**
     * {@inheritDoc}
     */
    protected function getComposerPackage()
    {
        return 'webburza/tcompayway';
    }
}

和PayWayGatewayFactory类:

class PayWayGatewayFactory extends GatewayFactory
{
    /**
     * {@inheritDoc}
     * @throws PayumCoreExceptionInvalidArgumentException
     */
    protected function populateConfig(ArrayObject $config)
    {
        $config->defaults(array(
            'payum.factory_name'            => 'payway_offsite','payum.factory_title'           => 'PayWay Offsite','payum.action.capture'          => new CaptureOffsiteAction(),'payum.action.capture_null'     => new CaptureOffsiteNullAction(),'payum.action.status'           => new StatusAction(),'payum.action.convert_payment'  => new ConvertPaymentAction(),));

        if (false == $config['payum.api']) {
            $config['payum.default_options'] = array(
                'secret_key'    => '','shop_id'       => '','username'      => '','password'      => '','sandbox'       => true
            );
            $config->defaults($config['payum.default_options']);
            $config['payum.required_options'] = [
                'secret_key','shop_id','username','password','sandbox'
            ];

            $config['payum.api'] = function (ArrayObject $config) {

                $config->validateNotEmpty($config['payum.required_options']);

                $api = new Api([
                    'secret_key'=> $config['secret_key'],'shop_id'   => $config['shop_id'],'username'  => $config['username'],'password'  => $config['password'],'sandbox'   => $config['sandbox'],],$config['payum.http_client']);

                return $api;

            };
        }
    }
}

到目前为止,我的印象是所有这些都更不行(如果我错了,请纠正我).我设法进入了CaptureOffsiteAction的execute方法:

public function execute($captureRequest)
    {
        RequestNotSupportedException::assertSupports($this,$captureRequest);
        $model = ArrayObject::ensureArrayObject($captureRequest->getModel());

        $httpRequest = new GetHttpRequest();
        $this->gateway->execute($httpRequest);

        if ($httpRequest->method === 'POST') {
            $status = new GetHumanStatus($model);

            if (isset($httpRequest->request['pgw_transaction_id']) && $httpRequest->request['pgw_transaction_id'] > 0) {
                // mark this order id as paid,convert cart to order,etc.

            } else {
                // mark as failed/cancelled,redirect back to cart
            }
            return;

        }

        $model['successUrl'] = $captureRequest->getToken()->getTargetUrl();
        $model['failureUrl'] = $captureRequest->getToken()->getTargetUrl();
        $offsiteUrl = $this->api->getOffsiteUrl();

        $data    = $this->api->prepareOffsitePayment($model->toUnsafeArray());
        $headers = ['application/x-www-form-urlencoded'];

        throw new HttpPostRedirect(
            $offsiteUrl,$data,200,$headers
        );

    }

首先,让我们看看,如果我得到这个权利 – 一旦我开始拍摄流程(执行方法) – 事情是否按预期工作,我结束了该方法的底部,创造成功与失败的URL,准备异地支付,哈希和所有并最终通过HttpPostRedirect以正确的订单ID,价格等结束在支付网关上.这部分没关系.

支付,在返回到成功的网址后,我又在CaptureOffsiteAction最终::执行和检查pgw_transaction_id – 如果设置,这意味着我从支付回来,我应该发现无论是支付成功订单或取消/失败付款.

问题是:

>如果付款成功 – 如何“关闭”订单(将购物车转换为订单,将付款标记为已捕获等?)
>我在其他支付网关中看到还有很多其他方法 – 让我说我只对通过重定向后的非现场支付感兴趣 – StatusAction做了什么?什么时候打电话?

到目前为止,我发现Payum(和PayumBundle)非常混乱,我已经成功地实现使用OmniPay下一天2个异地网关(在其他非Sylius相关的项目),但似乎无法来解决这个Payum事情.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读