SDK de paiement (V3)

Adresse du projet

https://github.com/yansongda/pay

Installation

composer require yansongda/pay ~3.0

Utilisation

Remarque : Le document ci-dessous a été rédigé en utilisant l'environnement de bac à sable d'Alipay. Si vous avez des questions, n'hésitez pas à nous le faire savoir !

Fichier de configuration

Supposons que nous avons le fichier de configuration suivant config/payment.php

<?php
/**
 * @desc Fichier de configuration de paiement
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '_force' => true, // Remarque, cela doit être true
    'alipay' => [
        'default' => [
            // Requis - app_id attribué par Alipay
            'app_id' => '20160909004708941',
            // Requis - Clé privée de l'application, chaîne ou chemin
            'app_secret_cert' => 'MIIEpAIBAAKCxxxxxxxxxxxxxxP4r3m4OUmD/+XDgCg==',
            // Requis - Chemin du certificat public de l'application
            'app_public_cert_path' => base_path().'/payment/appCertPublicKey_2016090900470841.crt',
            // Requis - Chemin du certificat public d'Alipay
            'alipay_public_cert_path' => base_path().'/payment/alipayCertPublicKey_RSA2.crt',
            // Requis - Chemin du certificat racine d'Alipay
            'alipay_root_cert_path' => base_path().'/payment/alipayRootCert.crt',
            // Optionnel - URL de retour synchronisé
            'return_url' => 'https://webman.tinywan.cn/payment/alipay-return',
            // Optionnel - URL de notification asynchrone
            'notify_url' => 'https://webman.tinywan.cn/payment/alipay-notify',
            // Optionnel - ID du fournisseur de services en mode fournisseur de services, utilisé lorsque mode est Pay::MODE_SERVICE
            'service_provider_id' => '',
            // Optionnel - Normalement, le mode est normal. Options : MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // Requis - Numéro de commerçant, numéro de commerçant fournisseur en mode fournisseur de services
            'mch_id' => '',
            // Requis - Clé secrète du commerçant
            'mch_secret_key' => '',
            // Requis - Clé privée du commerçant, chaîne ou chemin
            'mch_secret_cert' => '',
            // Requis - Chemin du certificat public du commerçant
            'mch_public_cert_path' => '',
            // Requis
            'notify_url' => 'https://yansongda.cn/wechat/notify',
            // Optionnel - app_id du compte public
            'mp_app_id' => '2016082000291234',
            // Optionnel - app_id de la mini-application
            'mini_app_id' => '',
            // Optionnel - app_id de l'application
            'app_id' => '',
            // Optionnel - app_id de la commande combinée
            'combine_app_id' => '',
            // Optionnel - Numéro de commerçant combiné
            'combine_mch_id' => '',
            // Optionnel - app_id du sous-compte public en mode fournisseur de services
            'sub_mp_app_id' => '',
            // Optionnel - app_id de la sous-application en mode fournisseur de services
            'sub_app_id' => '',
            // Optionnel - app_id de la sous-mini-application en mode fournisseur de services
            'sub_mini_app_id' => '',
            // Optionnel - Sous-numéro de commerçant en mode fournisseur de services
            'sub_mch_id' => '',
            // Optionnel - Chemin du certificat public WeChat, fortement recommandé de configurer ce paramètre en mode php-fpm
            'wechat_public_cert_path' => [
                '45F59D4DABF31918AFCEC556D5D2C6E376675D57' => __DIR__.'/Cert/wechatPublicKey.crt',
            ],
            // Optionnel - Normalement, le mode est normal. Options : MODE_NORMAL, MODE_SERVICE
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'logger' => [
        'enable' => false,
        'file' => runtime_path().'/logs/alipay.log',
        'level' => 'debug', // Il est recommandé d'ajuster le niveau à info en production et à debug en développement.
        'type' => 'single', // optionnel, peut être daily.
        'max_file' => 30, // optionnel, valide lorsque le type est daily, par défaut 30 jours
    ],
    'http' => [ // optionnel
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // Pour plus de configurations, veuillez consulter [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)
    ]
];

Remarque : Le répertoire des certificats n'est pas spécifié ; l'exemple ci-dessus se trouve dans le répertoire payment du cadre.

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

Initialisation

Appelez directement la méthode config pour initialiser

// Obtenir le fichier de configuration config/payment.php
$config = config('payment');
Pay::config($config);

Remarque : Si c'est en mode bac à sable d'Alipay, n'oubliez pas d'activer le fichier de configuration 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,, cette option est par défaut en mode normal.

Paiement (Web)

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

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

    // 2. Paiement par Web
    $order = [
        'out_trade_no' => time(),
        'total_amount' => '8888.88',
        'subject' => 'paiement webman',
        '_method' => 'get' // Utiliser la méthode get pour rediriger
    ];
    return Pay::alipay()->web($order)->getBody()->getContents();
}

Notification asynchrone

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

/**
 * @desc: Notification asynchrone de『Alipay』
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. Initialiser la configuration
    Pay::config(config('payment'));

    // 2. Traitement de retour d'Alipay
    $result = Pay::alipay()->callback($request->post());

    // ===================================================================================================
    // Veuillez vérifier trade_status et d'autres logiques, Alipay ne reconnaît le paiement du client comme réussi que lorsque l'état de notification de transaction est TRADE_SUCCESS ou TRADE_FINISHED.
    // 1. Le commerçant doit vérifier si out_trade_no dans ces données de notification correspond au numéro de commande créé dans le système du commerçant ;
    // 2. Vérifiez si total_amount correspond bien au montant réel de la commande (c'est-à-dire le montant au moment de la création de la commande par le commerçant) ;
    // 3. Vérifiez si seller_id (ou seller_email) dans la notification correspond à l'opérateur du document out_trade_no;
    // 4. Vérifiez si app_id correspond au commerçant lui-même.
    // 5. Autres logiques commerciales
    // ===================================================================================================

    // 5. Traitement de retour d'Alipay
    return new Response(200, [], 'success');
}

Remarque : Ne pas utiliser la méthode return Pay::alipay()->success(); pour répondre à la notification d'Alipay, car des problèmes de middleware peuvent survenir. Par conséquent, utilisez la classe de réponse webman support\Response; pour répondre à Alipay.

Notification synchronisée

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

/**
 * @desc: Notification synchronisée de『Alipay』
 * @param Request $request
 * @author Tinywan(ShaoBo Wan)
 */
public function alipayReturn(Request $request)
{
    Log::info('Notification synchronisée de『Alipay』'.json_encode($request->get()));
    return 'success';
}

Contenu supplémentaire

Visitez la documentation officielle https://pay.yansongda.cn/docs/v3/