결제 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/