Zahlungs-SDK (V3)

Projektadresse

https://github.com/yansongda/pay

Installation

composer require yansongda/pay ~3.0

Benutzung

Hinweis: Die folgende Dokumentation ist auf die Sandbox-Umgebung von Alipay ausgerichtet. Bei Fragen bitte umgehend Feedback geben!

Konfigurationsdatei

Angenommen, es gibt folgende Konfigurationsdatei config/payment.php

<?php
/**
 * @desc Zahlungs-Konfigurationsdatei
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '_force' => true, // Hinweis, dies muss true sein
    'alipay' => [
        'default' => [
            // Pflichtfeld - vom Alipay zugewiesene app_id
            'app_id' => '20160909004708941',
            // Pflichtfeld - private Anwendungsschlüssel, String oder Pfad
            'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
            // Pflichtfeld - Pfad zum öffentlichen Anwendungszertifikat
            'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
            // Pflichtfeld - Pfad zum öffentlichen Alipay-Zertifikat
            'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
            // Pflichtfeld - Pfad zum Alipay-Wurzelzertifikat
            'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
            // Optional - Synchrone Rückrufadresse
            'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
            // Optional - Asynchrone Rückrufadresse
            'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
            // Optional - Anbieter-ID im Anbieter-Modus, wenn mode auf Pay::MODE_SERVICE gesetzt ist
            'service_provider_id' => '',
            // Optional - Standardmäßig im Normalmodus. Optionen: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // Pflichtfeld - Händler-ID, im Anbieter-Modus die Händler-ID des Anbieters
            'mch_id' => '',
            // Pflichtfeld - Händlergeheimschlüssel
            'mch_secret_key' => '',
            // Pflichtfeld - privater Händler-Schlüssel, String oder Pfad
            'mch_secret_cert' => '',
            // Pflichtfeld - Pfad zum öffentlichen Händlerzertifikat
            'mch_public_cert_path' => '',
            // Pflichtfeld
            'notify_url' => 'https://yansongda.cn/wechat/notify',
            // Optional - app_id des öffentlichen Kontos
            'mp_app_id' => '2016082000291234',
            // Optional - app_id der Mini-App
            'mini_app_id' => '',
            // Optional - app_id der App
            'app_id' => '',
            // Optional - app_id des kombinierten Apps
            'combine_app_id' => '',
            // Optional - kombinierten Händler-ID
            'combine_mch_id' => '',
            // Optional - app_id des Unterkontos im Anbieter-Modus
            'sub_mp_app_id' => '',
            // Optional - app_id der Unter-App im Anbieter-Modus
            'sub_app_id' => '',
            // Optional - app_id der Unter-Mini-App im Anbieter-Modus
            'sub_mini_app_id' => '',
            // Optional - Händler-ID des Unteranbieters im Anbieter-Modus
            'sub_mch_id' => '',
            // Optional - Pfad zum öffentlichen WeChat-Zertifikat, optional, wird dringend empfohlen, diesen Parameter im php-fpm-Modus zu konfigurieren
            'wechat_public_cert_path' => [
                '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
            ],
            // Optional - Standardmäßig im Normalmodus. Optionen: MODE_NORMAL, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'logger' => [
        'enable' => false,
        'file' => runtime_path().'/logs/alipay.log',
        'level' => 'debug', // In Produktionsumgebungen wird empfohlen, den Level auf info zu ändern, in Entwicklungsumgebungen auf debug
        'type' => 'single', // optional, auch daily möglich.
        'max_file' => 30, // optional, gilt nur, wenn type auf daily gesetzt ist, standardmäßig 30 Tage
    ],
    'http' => [ // optional
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // Weitere Konfigurationsoptionen finden Sie in [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
    ]
];

Hinweis: Der Zertifikatspfad ist nicht festgelegt, das obige Beispiel ist im payment-Verzeichnis des Frameworks abgelegt.

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

Initialisierung

Direkter Aufruf der Methode config zur Initialisierung

// Konfigurationsdatei config/payment.php abrufen
$config = config('payment');
Pay::config($config);

Hinweis: Wenn Sie den Alipay-Sandbox-Modus verwenden, denken Sie daran, die Konfigurationsdatei 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX, zu aktivieren. Diese Option ist standardmäßig im Normalmodus.

Zahlung (Webseite)

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

/**
 * @param Request $request
 * @return string
 */
public function payment(Request $request)
{
    // 1. Konfiguration initialisieren
    Pay::config(config('payment'));

    // 2. Webzahlung
    $order = [
        'out_trade_no' => time(),
        'total_amount' => '8888.88',
        'subject' => 'webman payment',
        '_method' => 'get' // Mit der get-Methode umleiten
    ];
    return Pay::alipay()->web($order)->getBody()->getContents();
}

Asynchroner Rückruf

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

/**
 * @desc: „Alipay“ asynchrone Benachrichtigung
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. Konfiguration initialisieren
    Pay::config(config('payment'));

    // 2. Behandlung des Alipay-Rückrufs
    $result = Pay::alipay()->callback($request->post());

    // ===================================================================================================
    // Bitte überprüfen Sie selbst den trade_status und andere Logik, nur wenn der Handelsbenachrichtigungsstatus TRADE_SUCCESS oder TRADE_FINISHED ist, wird Alipay dies als erfolgreiche Zahlung des Käufers anerkennen.
    // 1. Der Händler muss überprüfen, ob die out_trade_no der im Händler-System erstellten Bestellnummer entspricht;
    // 2. Prüfen, ob der total_amount tatsächlich der tatsächlichen Bestellung entspricht (d.h. dem Betrag, der bei der Erstellung der Händlerbestellung angegeben wurde);
    // 3. Überprüfen, ob der seller_id (oder seller_email) in der Benachrichtigung dem entsprechenden Betreiber der out_trade_no entspricht;
    // 4. Überprüfen, ob die app_id die des Händlers ist.
    // 5. Andere geschäftliche Logik
    // ===================================================================================================

    // 5. Behandlung des Alipay-Rückrufs
    return new Response(200, [], 'success');
}

Hinweis: Verwenden Sie nicht die Rückgabe von return Pay::alipay()->success(); zur Antwort auf den Alipay-Rückruf. Wenn Sie Middleware verwenden, treten möglicherweise Probleme mit der Middleware auf. Daher müssen Sie die Webman-Antwortklasse support\Response; zur Beantwortung an Alipay verwenden.

Synchroner Rückruf

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

/**
 * @desc: „Alipay“ synchrone Benachrichtigung
 * @param Request $request
 * @author Tinywan(ShaoBo Wan)
 */
public function alipayReturn(Request $request)
{
    Log::info('„Alipay“ synchrone Benachrichtigung'.json_encode($request->get()));
    return 'success';
}

Weitere Inhalte

Besuchen Sie die offizielle Dokumentation https://pay.yansongda.cn/docs/v3/