SDK di pagamento (V3)

Indirizzo del progetto

https://github.com/yansongda/pay

Installazione

composer require yansongda/pay ~3.0

Utilizzo

Nota: La seguente documentazione è redatta con l'ambiente sandbox di Alipay. In caso di domande, vi preghiamo di farcelo sapere!

File di configurazione

Supponiamo di avere il seguente file di configurazione config/payment.php

<?php
/**
 * @desc File di configurazione del pagamento
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '_force' => true, // Attenzione, questo deve essere true
    'alipay' => [
        'default' => [
            // Obbligatorio - app_id assegnato da Alipay
            'app_id' => '20160909004708941',
            // Obbligatorio - chiave privata dell'app stringa o percorso
            'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
            // Obbligatorio - percorso del certificato pubblico dell'app
            'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
            // Obbligatorio - percorso del certificato pubblico di Alipay
            'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
            // Obbligatorio - percorso del certificato root di Alipay
            'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
            // Facoltativo - URL di callback sincrono
            'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
            // Facoltativo - URL di callback asincrono
            'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
            // Facoltativo - id del fornitore di servizi in modalità fornitore di servizi, utilizzato quando mode è Pay::MODE_SERVICE
            'service_provider_id' => '',
            // Facoltativo - predefinito in modalità normale. Opzioni: MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // Obbligatorio - numero di commerciante, in modalità fornitore di servizi è il numero del commerciante del fornitore
            'mch_id' => '',
            // Obbligatorio - chiave segreta del commerciante
            'mch_secret_key' => '',
            // Obbligatorio - chiave privata del commerciante stringa o percorso
            'mch_secret_cert' => '',
            // Obbligatorio - percorso del certificato pubblico del commerciante
            'mch_public_cert_path' => '',
            // Obbligatorio
            'notify_url' => 'https://yansongda.cn/wechat/notify',
            // Facoltativo - app_id del pubblico
            'mp_app_id' => '2016082000291234',
            // Facoltivo - app_id della mini app
            'mini_app_id' => '',
            // Facoltativo - app_id dell'app
            'app_id' => '',
            // Facoltativo - app_id per combinare
            'combine_app_id' => '',
            // Facoltativo - numero di commerciante per combinazione
            'combine_mch_id' => '',
            // Facoltativo - app_id del sottopubblico in modalità fornitore di servizi
            'sub_mp_app_id' => '',
            // Facoltativo - app_id del sottoproduzione in modalità fornitore di servizi
            'sub_app_id' => '',
            // Facoltativo - app_id della sotto mini app in modalità fornitore di servizi
            'sub_mini_app_id' => '',
            // Facoltativo - id del sottocommerciante in modalità fornitore di servizi
            'sub_mch_id' => '',
            // Facoltativo - percorso del certificato pubblico di WeChat, opzionale, si consiglia vivamente di configurare questo parametro in modalità php-fpm
            'wechat_public_cert_path' => [
                '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
            ],
            // Facoltativo - predefinito in modalità normale. Opzioni: MODE_NORMAL, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'logger' => [
        'enable' => false,
        'file' => runtime_path().'/logs/alipay.log',
        'level' => 'debug', // Si consiglia di impostare il livello su info in produzione e debug in sviluppo
        'type' => 'single', // opzionale, può essere giornaliero.
        'max_file' => 30, // opzionale, valido quando il tipo è giornaliero, predefinito 30 giorni
    ],
    'http' => [ // opzionale
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // Per ulteriori opzioni di configurazione, fare riferimento a [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
    ]
];

Nota: Non è stato definito un percorso per i certificati, l'esempio sopra è collocato nella directory payment del framework

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

Inizializzazione

Chiama direttamente il metodo config per inizializzare

// Ottieni il file di configurazione config/payment.php
$config = config('payment');
Pay::config($config);

Nota: Se si utilizza la modalità sandbox di Alipay, ricordarsi di attivare il file di configurazione 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,, questa opzione è predefinita in modalità normale.

Pagamento (web)

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

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

    // 2. Pagamento web
    $order = [
        'out_trade_no' => time(),
        'total_amount' => '8888.88',
        'subject' => 'pagamento webman',
        '_method' => 'get' // Usa il metodo get per reindirizzare
    ];
    return Pay::alipay()->web($order)->getBody()->getContents();
}

Callback asincrono

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

/**
 * @desc: Notifica asincrona di “Alipay”
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. Inizializza la configurazione
    Pay::config(config('payment'));

    // 2. Gestione della callback di Alipay
    $result = Pay::alipay()->callback($request->post());

    // ===================================================================================================
    // Si prega di verificare il trade_status e altre logiche; solo quando lo stato della notifica della transazione è TRADE_SUCCESS o TRADE_FINISHED, Alipay considererà il pagamento del compratore come riuscito.
    // 1. Il commerciante deve verificare se out_trade_no in questi dati di notifica corrisponde all'ordine creato nel sistema del commerciante;
    // 2. Verifica se total_amount corrisponde davvero all'importo reale di questo ordine (cioè l'importo al momento della creazione dell'ordine del commerciante);
    // 3. Verifica che seller_id (o seller_email) nella notifica corrisponda all'operatore di out_trade_no;
    // 4. Verifica che app_id corrisponda al commerciante stesso.
    // 5. Altre logiche aziendali
    // ===================================================================================================

    // 5. Gestione della callback di Alipay
    return new Response(200, [], 'success');
}

Nota: Non utilizzare return Pay::alipay()->success(); per rispondere al callback di Alipay, poiché potrebbero sorgere problemi con i middleware. Pertanto, è necessario utilizzare la classe di risposta di webman support\Response; per rispondere ad Alipay.

Callback sincrono

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

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

Maggiori contenuti

Visita la documentazione ufficiale https://pay.yansongda.cn/docs/v3/