php – 如何在使用Sylius 0.16和Payum实现非现场支付网关时完成
我一直在努力探讨如何使用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.*%字段配置正常,跳过此部分. 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 – 如果设置,这意味着我从支付回来,我应该发现无论是支付成功订单或取消/失败付款. 问题是: >如果付款成功 – 如何“关闭”订单(将购物车转换为订单,将付款标记为已捕获等?) 到目前为止,我发现Payum(和PayumBundle)非常混乱,我已经成功地实现使用OmniPay下一天2个异地网关(在其他非Sylius相关的项目),但似乎无法来解决这个Payum事情. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |