もがき系プログラマの日常

もがき系エンジニアの勉強したこと、日常のこと、気になっている技術、備忘録などを紹介するブログです。

paypayのAPIを試した

はじめに

こんばんは。

PayPay for Developersがリリースされて、phpSDKもあるらしいので試してみました。

about.paypay.ne.jp

github.com

参考にしたサイト

dev.classmethod.jp

本題

1. PayPay for Developers登録

コチラから新規登録をします。

テストで試すだけなら無料のようです。

登録が済んだら、マーチャントID、API_KEY, API_SECRETが払い出されます。

f:id:kojirooooocks:20200824225208p:plain

f:id:kojirooooocks:20200824225219p:plain

2. SDKインストール

$ composer require paypayopa/php-sdk

3. コード

index.php

他にも設定項目がありますが、一旦これだけにしてます。

<?php

require_once './vendor/autoload.php';

$orderItems = new \Kojirock5260\PayPayExample\OrderItems();
$orderItems->add('商品A', 1, 500);
$orderItems->add('商品B', 3, 1000);
$orderItems->add('商品C', 2, 900);

$config = new \Kojirock5260\PayPayExample\Config([
    'merchantId'      => 'XXXXXXXXXXXXXXX',
    'apiKey'          => 'YYYYYYYYYYYYYY',
    'apiSecret'       => 'ZZZZZZZZZZZZZZZZZ',
    'redirectUrl'     => 'https://kojirooooocks.hatenablog.com/',
    'isAuthorization' => false,
    'production'      => false,
]);

$paypay = new \Kojirock5260\PayPayExample\PayPayAdapter($config);
$result = $paypay->createCode($orderItems, '商品A-商品B-商品C');
var_dump($result);die();

Config.php

設定値を管理するクラスです。

<?php


namespace Kojirock5260\PayPayExample;


class Config
{
    private array $parameters;

    /**
     * Config constructor.
     * @param array $parameters
     */
    public function __construct(array $parameters)
    {
        if (!$this->isValid($parameters)) {
            throw new \InvalidArgumentException('required key invalid');
        }

        $this->parameters = $parameters;
    }

    /**
     * @return string
     */
    public function merchantId(): string
    {
        return $this->parameters['merchantId'];
    }

    /**
     * @return string
     */
    public function apiKey(): string
    {
        return $this->parameters['apiKey'];
    }

    /**
     * @return string
     */
    public function apiSecret(): string
    {
        return $this->parameters['apiSecret'];
    }

    /**
     * @return string
     */
    public function redirectUrl(): string
    {
        return $this->parameters['redirectUrl'];
    }

    /**
     * @return bool
     */
    public function isAuthorization(): bool
    {
        return $this->parameters['isAuthorization'];
    }

    /**
     * @return bool
     */
    public function isProduction(): bool
    {
        return $this->parameters['production'];
    }

    /**
     * @param array $parameters
     * @return bool
     */
    private function isValid(array $parameters): bool
    {
        $keys = [
            'merchantId',
            'apiKey',
            'apiSecret',
            'redirectUrl',
            'isAuthorization',
            'production',
        ];

        foreach ($keys as $key)  {
            if (!isset($parameters[$key])) {
                return false;
            }
        }

        return true;
    }
}

OrderItems.php

購入対象の商品のデータを作成するクラスです。

<?php


namespace Kojirock5260\PayPayExample;


use PayPay\OpenPaymentAPI\Models\OrderItem;

class OrderItems
{
    /** @var OrderItem[] */
    private array $items;

    /**
     * @return array|OrderItem[]
     */
    public function items(): array
    {
        return $this->items;
    }

    /**
     * @param string $name
     * @param int $quantity
     * @param int $amount
     * @throws \Exception
     */
    public function add(string $name, int $quantity, int $amount): void
    {
        $this->items[] = (new OrderItem())
            ->setName($name)
            ->setQuantity($quantity)
            ->setUnitPrice(['amount' => $amount, 'currency' => 'JPY']);
    }

    /**
     * @return int
     */
    public function total(): int
    {
        $result = 0;
        foreach ($this->items as $item) {
            $result += $item->getQuantity() * $item->getUnitPrice()['amount'];
        }

        return $result;
    }
}

PayPayAdapter.php

PayPayAPIを実行するクラスです。

<?php


namespace Kojirock5260\PayPayExample;


use PayPay\OpenPaymentAPI\Client;
use PayPay\OpenPaymentAPI\Models\CreateQrCodePayload;

class PayPayAdapter
{
    private Config $config;

    /**
     * PayPayAdapter constructor.
     * @param Config $config
     */
    public function __construct(Config $config)
    {
        $this->config = $config;
    }

    /**
     * @param OrderItems $orderItems
     * @param string     $paymentId
     * @return mixed
     * @throws \Exception
     */
    public function createCode(OrderItems $orderItems, string $paymentId)
    {
        $client = new Client([
            'API_KEY'     => $this->config->apiKey(),
            'API_SECRET'  => $this->config->apiSecret(),
            'MERCHANT_ID' => $this->config->merchantId(),
        ], $this->config->isProduction());

        $payload = new CreateQrCodePayload();
        $payload->setOrderItems($orderItems->items());
        $payload->setMerchantPaymentId($paymentId);
        $payload->setCodeType("ORDER_QR");
        $payload->setAmount(['amount' => $orderItems->total(), 'currency' => 'JPY']);
        $payload->setRedirectType('WEB_LINK');
        $payload->setIsAuthorization($this->config->isAuthorization());
        $payload->setRedirectUrl($this->config->redirectUrl());

        return $client->code->createQRCode($payload);
    }
}

4. 実行

ターミナルで実行してみると、var_dump している箇所でいろんなデータがありますが、以下のようなデータが存在します。

$ php index.php
  'data' =>
  array(11) {
    ...
    'url' =>
    string(60) "https://qr-stg.sandbox.paypay.ne.jp/28180104LsJmN9v8wGTniY3O"
    ...

このURLが実際に作成されたQRコードを表示してくれるページです。

f:id:kojirooooocks:20200824225953p:plain

この作成されたQRの有効期限は5分間です。

ちなみに有効期限もデータとして返却されてます。

このQRを読み込むには、PayPayのテストアカウントが必要なのですが、現在はテストアカウントが公開されていないため、実際には読み込めません。

f:id:kojirooooocks:20200824230213p:plain

終わりに

コレ以上進められなかったのが残念でした...

ストアカウントの情報がアップされたらまた踏み込んで試そうと思います。

今までのコードは githubにあげておきました。

github.com

現場からは以上です。