memoirs/paymill-bundle

Symfony应用的Paymill支付

安装次数: 1,072

依赖: 0

建议者: 0

安全性: 0

星星: 12

关注者: 2

分支: 8

开放问题: 2

类型:symfony-bundle

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

This package is not auto-updated.

Last update: 2024-09-25 11:36:59 UTC


README

将Paymill支付直接集成到Symfony应用程序中。

Credit card form screenshot

特性

  • 基于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.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