支払いSDK(V3)

プロジェクトアドレス

https://github.com/yansongda/pay

インストール

composer require yansongda/pay ~3.0

使用法

説明:以下は、支付宝のサンドボックス環境を前提として文書を作成しています。問題があれば、ぜひ速やかにフィードバックしてください!

設定ファイル

以下の設定ファイル config/payment.php があると仮定します。

<?php
/**
 * @desc 支払い設定ファイル
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '_force' => true, // 注意、これは必ずtrueにする必要があります
    'alipay' => [
        'default' => [
            // 必須-支付宝から割り当てられた app_id
            'app_id' => '20160909004708941',
            // 必須-アプリの秘密鍵 文字列またはパス
            'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
            // 必須-アプリの公開鍵証明書 パス
            'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
            // 必須-支付宝の公開鍵証明書 パス
            'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
            // 必須-支付宝のルート証明書 パス
            'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
            // 任意-同期コールバックアドレス
            'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
            // 任意-非同期コールバックアドレス
            'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
            // 任意-サービスプロバイダーモードでのサービスプロバイダー id、mode が Pay::MODE_SERVICE の場合に使用
            'service_provider_id' => '',
            // 任意-デフォルトは通常モード。選択肢は: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // 必須-マーチャントID、サービスプロバイダーモードの場合はサービスプロバイダーのマーチャントID
            'mch_id' => '',
            // 必須-マーチャントの秘密鍵
            'mch_secret_key' => '',
            // 必須-マーチャントの秘密鍵 文字列またはパス
            'mch_secret_cert' => '',
            // 必須-マーチャントの公開鍵証明書パス
            'mch_public_cert_path' => '',
            // 必須
            'notify_url' => 'https://yansongda.cn/wechat/notify',
            // 任意-公衆アカウントの app_id
            'mp_app_id' => '2016082000291234',
            // 任意-ミニプログラムの app_id
            'mini_app_id' => '',
            // 任意-アプリの app_id
            'app_id' => '',
            // 任意-合算用の app_id
            'combine_app_id' => '',
            // 任意-合算用のマーチャントID
            'combine_mch_id' => '',
            // 任意-サービスプロバイダーモードでのサブ公衆アカウントの app_id
            'sub_mp_app_id' => '',
            // 任意-サービスプロバイダーモードでのサブアプリの app_id
            'sub_app_id' => '',
            // 任意-サービスプロバイダーモードでのサブミニプログラムの app_id
            'sub_mini_app_id' => '',
            // 任意-サービスプロバイダーモードでのサブマーチャントID
            'sub_mch_id' => '',
            // 任意-微信の公開鍵証明書パス、optional、php-fpm モードでの設定を強く推奨
            'wechat_public_cert_path' => [
                '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
            ],
            // 任意-デフォルトは通常モード。選択肢は: MODE_NORMAL, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'logger' => [
        'enable' => false,
        'file' => runtime_path().'/logs/alipay.log',
        'level' => 'debug', // 本番環境では情報に調整することをお勧め、開発環境ではデバッグ
        'type' => 'single', // optional, dailyを選択可能。
        'max_file' => 30, // optional, typeがdailyの場合に有効、デフォルトは30日
    ],
    'http' => [ // optional
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // 詳細な設定項目については [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)を参照してください
    ]
];

注意:証明書のディレクトリは指定されていないため、上記の例ではフレームワークの payment ディレクトリに配置されています。

├── payment
│   ├── alipayCertPublicKey_RSA2.crt
│   ├── alipayRootCert.crt
│   └── appCertPublicKey_2016090900470841.crt

初期化

config メソッドを直接呼び出して初期化します。

// 設定ファイル config/payment.php を取得
$config = config('payment');
Pay::config($config);

注意:支付宝サンドボックスモードの場合、設定ファイル 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX, を必ず有効にする必要があります。このオプションはデフォルトで通常モードになっています。

支払い(ウェブ)

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @param Request $request
 * @return string
 */
public function payment(Request $request)
{
    // 1. 設定を初期化
    Pay::config(config('payment'));

    // 2. ウェブでの支払い
    $order = [
        'out_trade_no' => time(),
        'total_amount' => '8888.88',
        'subject' => 'webman payment',
        '_method' => 'get' // get方式でリダイレクト
    ];
    return Pay::alipay()->web($order)->getBody()->getContents();
}

非同期コールバック

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @desc:『支付宝』非同期通知
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. 設定を初期化
    Pay::config(config('payment'));

    // 2. 支払いのコールバック処理
    $result = Pay::alipay()->callback($request->post());

    // ===================================================================================================
    // 必ず trade_status を確認し、その他のロジックを確認する必要があります。取引通知の状態が TRADE_SUCCESS または TRADE_FINISHED の場合にのみ、支付宝は買い手の支払い成功を認めます。
    // 1、マーチャントは、この通知データの out_trade_no がマーチャントシステム内で作成した注文番号と一致するか確認する必要があります;
    // 2、total_amount が実際にこの注文の実際の金額(すなわちマーチャントが注文を作成した時の金額)であるか確認します;
    // 3、通知内の seller_id(または seller_email)が out_trade_no に該当する操作主体であるか確認します;
    // 4、app_id がそのマーチャント自身であるか確認します。
    // 5、その他のビジネスロジックの状況
    // ===================================================================================================

    // 5. 支払いのコールバック処理
    return new Response(200, [], 'success');
}

注意:プラグイン自体の return Pay::alipay()->success(); を使用して支付宝のコールバックに応答しないでください。ミドルウェアを使用しているとミドルウェアの問題が発生します。したがって、支付宝に応答するには、webman の応答クラス support\Response; を使用する必要があります。

同期コールバック

use support\Request;
use Yansongda\Pay\Pay;

/**
 * @desc: 『支付宝』同期通知
 * @param Request $request
 * @author Tinywan(ShaoBo Wan)
 */
public function alipayReturn(Request $request)
{
    Log::info('『支付宝』同期通知'.json_encode($request->get()));
    return 'success';
}

さらに詳しい内容

公式ドキュメントを訪問してください https://pay.yansongda.cn/docs/v3/