결제 SDK (V3)

프로젝트 주소

https://github.com/yansongda/pay

설치

composer require yansongda/pay ^3.0.0

사용

설명: 아래의 내용은 알리페이 테스트 환경을 기준으로하여 문서를 작성하였으니 문제가 있을 시에 빠르게 피드백 부탁드립니다!

구성 파일

다음과 같은 구성 파일 config/payment.php가 있다고 가정합니다.

<?php
/**
 * @desc 결제 구성 파일
 * @author Tinywan(ShaoBo Wan)
 * @date 2022/03/11 20:15
 */
return [
    '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, 모드가 Pay::MODE_SERVICE 인 경우에 사용하는 매개변수
            'service_provider_id' => '',
            // 선택 - 기본적으로 정상 모드입니다. MODE_NORMAL, MODE_SANDBOX, MODE_SERVICE로 선택할 수 있습니다
            'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,
        ]
    ],
    'wechat' => [
        'default' => [
            // 필수 - 상인 번호, 서비스 제공자 모드의 경우 서비스 제공자 상인 번호입니다
            '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' => '',
            // 선택 - 결합 상인 번호
            'combine_mch_id' => '',
            // 선택 - 서비스 제공자 모드 하위 공중 번호의 app_id
            'sub_mp_app_id' => '',
            // 선택 - 서비스 제공자 모드 하위 앱의 app_id
            'sub_app_id' => '',
            // 선택 - 서비스 제공자 모드 하위 소프트웨어의 app_id
            'sub_mini_app_id' => '',
            // 선택 - 서비스 제공자 모드 하위 상인 id
            'sub_mch_id' => '',
            // 선택 - 위챗 공개 키 인증서 경로, 선택 사항, 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', // 제안: 프로덕션 환경 레벨을 info로 조정하고, 개발 환경을 debug로 합니다
        'type' => 'single', // 선택 사항, daily로 설정하면 필수적입니다.
        'max_file' => 30, // 선택 사항, 타입이 daily일 때, 기본적으로 30 일입니다
    ],
    'http' => [ // 선택 사항
        'timeout' => 5.0,
        'connect_timeout' => 5.0,
        // 더 많은 구성 항목은 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)을 참조하십시오
    ],
    '_force' => true,
];

노트: 인증서 디렉토리는 규정되어 있지 않지만, 위의 예는 프레임워크의 payment 디렉토리에 배치되어 있는 것입니다.

초기화

config 메소드를 직접 호출하여 초기화합니다.

// 구성 파일 config/payment.php 가져오기
$config = Config::get('payment');
Pay::config($config);

노트: 알리페이 샌드박스 모드인 경우에는 반드시 구성 파일 'mode' => \Yansongda\Pay\Pay::MODE_SANDBOX,를 활성화해야 합니다. 이 옵션은 기본적으로 정상 모드로 설정되어 있습니다.

결제 (웹)

use support\Request;
use Webman\Config;
use Yansongda\Pay\Pay;

/**
 * @param Request $request
 * @return string
 */
public function payment(Request $request)
{
    // 1. 구성 파일 config/payment.php 가져오기
    $config = Config::get('payment');

    // 2. 초기화 구성
    Pay::config($config);

    // 3. 웹 결제
    $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 Webman\Config;
use Yansongda\Pay\Pay;

/**
 * @desc: 『알리페이』 비동기 통지
 * @param Request $request
 * @return Response
 */
public function alipayNotify(Request $request): Response
{
    // 1. 구성 파일 config/payment.php 가져오기
    $config = Config::get('payment');

    // 2. 초기화 구성
    Pay::config($config);

    // 3. 알리페이 콜백 처리
    $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(완소보 완)
 */
public function alipayReturn(Request $request)
{
    Log::info('『알리페이』 동기 통지' . json_encode($request->get()));
    return 'success';
}

전체 예제 코드

https://github.com/Tinywan/webman-admin/blob/main/app/controller/Test.php

더보기

공식 문서 방문 https://pay.yansongda.cn/docs/v3/