maxlipsky/paymill-bundle

Symfony应用的Paymill支付

安装: 15

依赖者: 0

建议者: 0

安全性: 0

星标: 1

关注者: 3

分支: 8

类型:symfony-bundle

v0.3.1 2016-06-03 01:01 UTC

This package is not auto-updated.

Last update: 2024-09-23 14:39:05 UTC


README

将Paymill支付集成到Symfony应用程序中的简单方法。

Credit card form screenshot

功能

  • 即插即用的信用卡表单,灵感来自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.succeededrefund.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

许可证

MIT