결제 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, 모드가 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' => '',
            // 선택 사항 - 합병 앱 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' => '',
            // 선택 사항 - 위챗 공개 키 인증서 경로, 선택 사항, 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, // 선택 사항, type이 daily일 때 유효하며, 기본값은 30일
    ],
    'http' => [ // 선택 사항
        '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/