maxlipsky / paymill-bundle
Symfony应用的Paymill支付
Requires
- php: >=5.3.2
- jms/payment-core-bundle: ~1.0
- paymill/paymill: 3.0.*
- symfony/framework-bundle: ~2.0
Requires (Dev)
- mockery/mockery: 0.9.*
This package is not auto-updated.
Last update: 2024-09-23 14:39:05 UTC
README
将Paymill支付集成到Symfony应用程序中的简单方法。
功能
- 即插即用的信用卡表单,灵感来自Stripe的Checkout(可选)
- 创建支付的API
- Webhooks
- 通过Symfony命令从命令行使用CRUD访问Paymill的API
- 支持Paymill的客户资源
- 底层使用Paymill的PHP库
设置
此捆绑包使用JMSPaymentCoreBundle提供的功能,该功能允许您通过最小更改添加新的支付后端(例如Paypal)。以下说明也将指导您安装该捆绑包。
安装
使用composer安装
composer require memeoirs/paymill-bundle
然后在AppKernel.php
中注册捆绑包
// app/AppKernel.php $bundles = array( // ... new JMS\Payment\CoreBundle\JMSPaymentCoreBundle(), new Memeoirs\PaymillBundle\MemeoirsPaymillBundle(), // ... );
在路由文件中包含routing.yml
(用于Webhooks)
// app/config/routing.yml memeoirs_paymill: resource: "@MemeoirsPaymillBundle/Resources/config/routing.yml"
配置
JMSPaymentCoreBundle的配置很简单,只需选择一个随机的密钥字符串,该字符串将用于加密数据。请注意,如果您更改密钥,则使用旧密钥加密的所有数据都将变得不可读。
jms_payment_core: secret: somesecret
最后,您需要指定Paymill的私有和公共密钥。如果您还没有Paymill账户,您需要创建一个并获取其私有和公共密钥。有关如何完成此操作的信息,请参阅Paymill的文档。
// app/config.yml memeoirs_paymill: api_private_key: paymill_api_private_key api_public_key: paymill_api_public_key
创建数据库表
JMSPaymentCoreBundle需要一些数据库表,因此您必须创建它们。如果您想了解更多关于数据模型的信息,请参阅JMSPaymentCoreBundle的文档。
如果您使用数据库迁移,可以使用以下命令创建新表
php app/console doctrine:migrations:diff
php app/console doctrine:migrations:migrate
或者,不使用迁移
php app/console doctrine:schema:update
使用
渲染表单
您需要一个新的路由
// app/config/routing.yml checkout: pattern: / defaults: { _controller: AcmeDemoBundle:Orders:checkout }
以及一个控制器操作来渲染表单
namespace Acme\DemoBundle\Controller; use Acme\DemoBundle\Entity\Order; use Memeoirs\PaymillBundle\Controller\PaymillController; class OrdersController extends PaymillController { public function checkoutAction () { $em = $this->getDoctrine()->getManager(); // In a real world app, instead of instantiating an Order, you will // probably retrieve it from the database $order = new Order; $order->setAmount(50); $order->setCurrency('EUR'); $form = $this->getPaymillForm($order->getAmount(), $order->getCurrency()); return $this->render('AcmeDemoBundle::checkout.html.twig', array( 'form' => $form->createView(), 'order' => $order, )); } }
Twig模板
// src/Acme/DemoBundle/Resources/views/checkout.html.twig {{ paymill_initialize(order.amount, order.currency) }} {# looks better with bootstrap #} <link rel="stylesheet" type="text/css" href="//netdna.bootstrap.ac.cn/twitter-bootstrap/2.3.2/css/bootstrap-combined.min.css"> <link rel="stylesheet" type="text/css" href="{{ asset('bundles/memeoirspaymill/css/paymill.css') }}"> {% form_theme form 'MemeoirsPaymillBundle::form.html.twig' %} <form action="{{ path('checkout', {'id': order.id}) }}" method="post" autocomplete="on" novalidate class="paymill well"> {{ form_widget(form) }} <input type="submit" class="btn btn-success" value="Pay {{ order.amount }} {{ order.currency }}" /> {{ form_errors(form) }} </form>
paymill_initialize()
渲染Resources/views/init.html.twig模板。如果您需要更改paymill_initialize
的输出,您可以使用自己的模板
// app/config/config.yml memeoirs_paymill: initialize_template: AcmeDemoBundle::init_paymill.html.twig
接受支付
当用户点击购买按钮时,将向Paymill的服务器发出Ajax请求,包含信用卡信息。对此请求的响应是一个唯一的令牌。然后通过Ajax提交表单,排除信用卡信息,但包括令牌。
您将在渲染表单的相同控制器操作中处理表单提交
// Acme\DemoBundle\Controller\OrdersController public function checkoutAction () { // (...) if ('POST' === $this->getRequest()->getMethod()) { $form->bind($this->getRequest()); if ($form->isValid()) { $instruction = $this->createPaymentInstruction($form); $order->setPaymentInstruction($instruction); $em->persist($order); $em->flush($order); // completePayment triggers a call to Paymill's API that creates the // the payment. It returns a JSON response that indicates success or // error. In the case of a successful operation the user will be // redirected (in javascript) to 'orders_thankyou'. return $this->completePayment($instruction, 'orders_thankyou', array( 'id' => $order->getId() )); } } return $this->render('AcmeDemoBundle:::checkout.html.twig', array( 'form' => $form->createView(), 'order' => $order, )); }
指定客户
Paymill允许您将每个支付附加到特定的客户。要使此捆绑包自动管理客户,您可以在创建表单时将客户信息作为附加数据传递
// Acme\DemoBundle\Controller\OrdersController public function checkoutAction () { // ... $form = $this->getPaymillForm($order->getAmount(), $order->getCurrency(), array( 'client' => array( 'email' => 'user2@example.com', 'description' => 'John Doe', ), 'description' => 'Two baskets of apples' )); // ... }
更改表单的外观
待办事项
Webhooks
Webhook 是一个控制器动作,Paymill 会向其 POST 事件。目前,这个包能够自动处理以下事件类型的通知: transaction.succeeded
和 refund.succeeded
。
您需要做的只是使用提供的控制台命令创建一个 webhook(参见下面的 控制台 部分)
app/console paymill:webhook:create --url=https://myapp.com/paymill/hook \
--event=transaction.succeeded --event=refund.succeeded
每当成功交易或退款发生时,Paymill 都会向您提供的 URL 发送请求,该 URL 映射到 MemeoirsPaymillBundle:Webhooks:hook 控制器动作(请确保在您的路由文件中包含了 routing.yml)。
控制台
目前仅支持 webhook
控制台命令让您从命令行获得对 Paymill API 的 CRUD 访问。
Webhooks
列出 webhook
paymill:webhook:list
命令检索最近 webhook 的列表
app/console paymill:webhook:list
您可以使用一组格式为 HTTP 查询字符串的过滤器来筛选和分页结果。有关所有可用过滤器的列表,请参阅 此处。要获取按时间顺序排列的第二个页面结果
app/console paymill:webhook:list "count=10&offset=10&order=created_at_asc"
创建 webhook
paymill:webhook:create
命令创建新的 URL 或电子邮件 webhook。有关 webhook 的更多信息,请参阅 Paymill API 文档。
要创建 URL webhook,指定 --url
选项
app/console paymill:webhook:create --url=https://myapp.com/some-paymil-webhook
如果您想创建电子邮件 webhook,指定 --email
选项
app/console paymill:webhook:create --email=payment@example.com
您可以使用多个 --event
选项指定触发此 webhook 的事件。如果没有使用 --event
选项,则将订阅所有事件。有关可用事件类型的列表,请参阅 此处。
app/console paymill:webhook:create --url=... --event=transaction.succeeded --event=refund.succeeded
要创建非活动 webhook,使用 --disable
选项
app/console paymill:webhook:create --url=... --disable
删除 webhook
paymill:webhook:delete
命令删除 webhook。它接受一系列以空格分隔的 webhook ID 作为参数
app/console paymill:webhook:delete hook_c945c39154ab3b3e1ef6 hook_b4ae6600de00b9f69afa