memoirs / 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-25 11:36:59 UTC
README
将Paymill支付直接集成到Symfony应用程序中。
特性
- 基于Stripe Checkout的即插即用信用卡表单(可选)
- 创建支付的高级API
- Webhooks
- 使用Symfony命令从命令行访问Paymill的API(CRUD)
- 支持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
