이 기사의 예에서는 ThinkPHP가 Alipay 인터페이스 기능을 구현하는 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 구체적인 분석은 다음과 같습니다.
최근 시스템 작업을 할 때 온라인 결제 기능을 구현해야 했는데요, 망설임 없이 Alipay의 인터페이스 결제 기능을 선택했습니다. 여기서는 즉시 결제 인터페이스를 사용했습니다.
1. Alipay 인터페이스 패키지를 다운로드하세요
다운로드 주소: https://b.alipay.com/order/productDetail.htm?productId=2012111200373124&tabId=4#ps-tabinfo-hash
다운로드 방법은 자세히 설명하지 않겠습니다~~
2. 인터페이스 패키지 파일을 재구성합니다. 이 단계는 매우 중요하다고 생각됩니다. 다운로드한 인터페이스 패키지 파일에는 여러 언어의 소스 코드가 있습니다.

다음 파일이 포함된 create_direct_pay_by_user-PHP-UTF-8이라는 인터페이스 파일을 선택합니다.

이미지 파일에는 Alipay와 관련된 일부 로고 사진이 포함되어 있습니다. 지금은 lib 파일이 매우 중요하며 전체 인터페이스의 핵심 클래스 파일입니다.
alipay.config.php는 관련 파라미터 설정 파일입니다
alipayapi.php는 Alipay 인터페이스 항목 파일입니다
notify_url.php는 서버 비동기 알림 페이지 파일입니다.
return_url.php는 페이지 이동 동기화 알림 파일입니다.
ThinkPHP 프레임워크 파일 아래에서 Extend를 찾아 입력한 다음 Vendor를 입력합니다. Vendor 폴더 아래에 Alipay라는 새 폴더를 만들고 Alipay를 타사 클래스 라이브러리로 도입한 다음 Alipay 인터페이스 파일에 lib 파일을 복사합니다. package.모든 파일은 총 4개로 구성되어 있습니다.
이제 위 파일의 이름을 바꾸세요.
alipay_core.function.php는 Corefunction.php로 이름이 변경되었습니다.
alipay_md5.function.php는 Md5function.php로 이름이 변경되었습니다.
alipay_notify.class.php는 Notify.php로 이름이 변경되었습니다.
alipay_submit.class.php는 Submit.php로 이름이 변경되었습니다.
그런 다음 Submit.php 파일을 열고 다음 코드를 제거하세요.
require_once("alipay_core.function.php");
require_once("alipay_md5.function.php");마찬가지로 Notify.php 파일을 열고 다음 두 코드 조각을 제거합니다. require_once("alipay_core.function.php");
require_once("alipay_md5.function.php"); 프로젝트에서 인터페이스 파일을 호출할 때 공급업체를 통해 4개의 핵심 파일을 모두 전달하기 때문에 위 두 파일에서 이 두 가지 코드를 제거해야 하는 이유는 무엇입니까? . 따라서 더 이상 가져오기가 필요하지 않습니다.
이제 Alipay 인터페이스 패키지와 관련된 핵심 클래스 라이브러리 구성이 기본적으로 완료되었습니다. 이제 프로젝트 호출을 시작하세요.
3. 프로젝트에서 Alipay 인터페이스를 호출합니다
통화는 두 단계로 나누어집니다.
1. 구성 파일의 Conf/Config.php 파일에서 Alipay 관련 매개 변수를 구성합니다
코드 복사 코드는 다음과 같습니다.//Alipay 구성 매개변수
'alipay_config'=>배열(
'partner' =>'20********50', //Alipay 인터페이스를 성공적으로 신청한 후 얻은 PID는 다음과 같습니다.
'key'=>'9t****************ie',//Alipay 인터페이스를 성공적으로 신청한 후 얻은 키는 다음과 같습니다
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strtolower('utf-8'),
'cacert'=> getcwd().'\cacert.pem',
'운송'=> 'http',
),
//위 구성 항목은 인터페이스 패키지의 alipay.config.php 파일에서 복사하여 구성합니다.
'alipay' =>배열(
//판매자 알리페이 계정입니다. 인터페이스 신청시 등록하신 알리페이 계정입니다
'seller_email'=>'pay@xxx.com',
//다음은 프로젝트 Pay 컨트롤러의 informurl 메소드에 제출된 비동기 알림 페이지 URL입니다.
'notify_url'=>'http://www.xxx.com/Pay/notifyurl',
//다음은 프로젝트 Pay 컨트롤러의 returnurl 메소드에 제출되는 페이지 이동 알림 URL입니다.
'return_url'=>'http://www.xxx.com/Pay/returnurl',
//결제 성공 후 점프하는 페이지입니다. 프로젝트의 User 컨트롤러인 myorder 메소드로 점프하고 Paid(Paid List) 매개변수를 전달합니다.
'successpage'=>'User/myorder?ordtype=payed',
//결제 실패 시 점프하는 페이지입니다. 프로젝트의 사용자 컨트롤러인 myorder 메소드로 점프하고 unpay(미지급 목록) 매개변수를 전달합니다.
'errorpage'=>'User/myorder?ordtype=unpay',
),
2. 다음과 같이 새로운 PayAction 컨트롤러 코드를 생성합니다
클래스 PayAction은 Action을 확장합니다{
//클래스 초기화 메소드에서 관련 클래스 라이브러리를 소개합니다.
공개 함수 _initialize() {
Vendor('Alipay.Corefunction')
Vendor('Alipay.Md5function')
Vendor('Alipay.Notify')
판매자('Alipay.Submit')
}
//doalipay 방식
공개 함수 doalipay(){
// require_once("alipay.config.php")
// require_once("lib/alipay_submit.class.php")
//여기서 TP의 C 함수를 통해 구성 항목 매개변수를 읽고 이를 $alipay_config에 할당합니다.
$alipay_config=C('alipay_config');
$pay_type = "1"; //결제 유형 //필수, 수정 불가
$notify_url = C('alipay.notify_url') // 서버 비동기 알림 페이지 경로
$return_url = C('alipay.return_url'); //페이지 이동 동기화 알림 페이지 경로
$seller_email = C('alipay.seller_email');//판매자의 Alipay 계정이 필요합니다
$out_trade_no = $_POST['trade_no']; // 판매자 주문 번호는 결제 페이지의 양식을 통해 전달되므로 고유해야 합니다!
$subject = $_POST['ordsubject']; //주문 이름 //필수 결제 페이지의 양식을 통과하세요
$total_fee = $_POST['ordtotal_fee'] //결제 금액 //필수 결제 페이지의 양식을 통과하세요
$body = $_POST['ordbody']; //주문 설명은 결제 페이지의 양식을 통해 전달됩니다.
$show_url = $_POST['ordshow_url']; //결제 페이지의 양식을 통해 제품 표시 주소가 전달됩니다.
$anti_phishing_key = "";//피싱방지 타임스탬프 //사용을 원하시면 클래스 파일 submit 내 query_timestamp 함수를 호출해주세요
$exter_invoke_ip = get_client_ip() //클라이언트의 IP 주소
//요청할 매개변수 배열을 구성합니다. 변경이 필요하지 않습니다.
$매개변수 = 배열(
"서비스" => "create_direct_pay_by_user",
"파트너" => Trim($alipay_config['partner']),
"결제_유형" => $결제_유형,
"notify_url" => $notify_url,
"return_url" => $return_url,
"판매자_이메일" => $판매자_이메일,
"out_trade_no" => $out_trade_no,
"주제" => $주제,
"total_fee" => $total_fee,
"본문" "본문" => $body,
"show_url" => $show_url,
"anti_phishing_key" => $anti_phishing_key,
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => 트림(strtolower($alipay_config['input_charset']))
);
//요청 생성
$alipaySubmit = 새로운 AlipaySubmit($alipay_config)
$html_text = $alipaySubmit->buildRequestForm($parameter,"post", "Confirm")
에코 $html_text;
}
함수 informurl(){
//require_once("alipay.config.php")
//require_once("lib/alipay_notify.class.php")
//여기에서는 여전히 C 함수를 사용하여 구성 항목을 읽고 이를 $alipay_config에 할당합니다
$alipay_config=C('alipay_config')
//알림 확인 결과 계산
$alipayNotify = 새로운 AlipayNotify($alipay_config)
$verify_result = $alipayNotify->verifyNotify()
If($verify_result) {
//인증 성공
//Alipay의 알림 반환 매개변수를 가져옵니다. 기술 문서의 서버 비동기 알림 매개변수 목록을 참조하세요
$ OUT_TRADE_NO = $ _post ['Out_trade_no'] //
$trade_no = $_POST['trade_no'];
$ Trade_status = $ _post ['trade_status'] // 거래 상태
$total_fee = $_POST['total_fee'];
$ Notify_id = $ _post ['notify_id'] // 인증ID를 알립니다.
$ Notify_time = $ _post ['notify_time'] // 알림 전송 시간입니다. 형식은 yyyy-MM-dd HH:mm:ss입니다.
> >
$매개변수 = 배열(
"out_trade_no" => $out_trade_no, //판매자 주문 번호
"trade_no" => $trade_no, //알리페이 거래번호
"total_fee" => $total_fee, //거래 금액
"trade_status" => $trade_status, //거래 상태
"notify_id" => $notify_id, //알림 확인 ID입니다.
"notify_time" => $notify_time, //알림 전송 시간.
"buyer_email" => $buyer_email, //구매자의 알리페이 계정
);
If($_POST['trade_status'] == 'TRADE_FINISHED') {
>
~ ~
주문 처리($parameter)
//주문 처리를 진행하고 Alipay에서 반환된 매개변수를 보냅니다.
~
~
Echo "성공" // 수정하거나 삭제하지 마세요
//확인 실패
에코 "실패"
}
함수 returnurl(){
// 헤드를 다루는 방법은 위의 두 가지 방법과 동일합니다.
$alipay_config=C('alipay_config')
$alipayNotify = new AlipayNotify($alipay_config);//알림 확인 결과 계산
$verify_result = $alipayNotify->verifyReturn()
If($verify_result) {
//인증 성공
//Alipay의 알림 반환 매개변수를 가져옵니다. 기술 문서의 페이지 점프 동기화 알림 매개변수 목록을 참조하세요
$out_trade_no = $_GET['out_trade_no']; >
$trade_no = $_GET['trade_no'] //알리페이 거래번호
$trade_status =
$total_fee = $_GET['total_fee'] //거래금액
$notify_id = $_GET['notify_id ']
$ Notify_time = $ _get ['notify_time'] // 알림 전송 시간입니다.
$buyer_email = $_GET['buyer_email']; //구매자의 알리페이 계정
$매개변수 = 배열(
"out_trade_no" => $out_trade_no, //판매자 주문 번호
"trade_no" => $trade_no, //알리페이 거래번호
"total_fee" => $total_fee, //거래 금액
"trade_status" => $trade_status, //거래 상태
"notify_id" => $notify_id, "인증ID를 알려드립니다."
"notify_time" => $notify_time, //알림 전송 시간.
"buyer_email" => $buyer_email, //구매자의 알리페이 계정
);
if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
If(!checkorderstatus($out_trade_no)){
orderhandle($parameter); //주문을 처리하고 Alipay에서 반환된 매개변수를 전송합니다.
}
$this->redirect(C('alipay.successpage'));//구성 항목에 구성된 결제 성공 페이지로 이동합니다.
}else {
echo "trade_status=".$_GET['trade_status']
$this->redirect(C('alipay.errorpage'));//구성 항목에 구성된 결제 실패 페이지로 이동
}
}else {
//확인 실패
//디버깅을 원하시면 alipay_notify.php 페이지의 verifyReturn 함수를 참고해주세요
echo "결제 실패!";
}
}
}
?>
3. 결제 처리 과정에서 사용해야 하는 여러 함수들을 프로젝트의 Common/common.php에 작성해 놓았기 때문에 해당 함수들을 수동으로 호출하지 않고도 바로 사용할 수 있습니다. :
코드 복사 코드는 다음과 같습니다.//사용자 구매 주문 기록을 저장하는 데 사용되는 주문 목록 데이터 테이블
//온라인 거래 주문 결제 처리 기능
//기능: 결제 인터페이스에서 반환된 데이터를 기반으로 주문이 성공적으로 결제되었는지 확인합니다.
//반환값: 주문이 성공적으로 결제되면 true를 반환하고, 그렇지 않으면 false를 반환합니다.
함수 checkorderstatus($ordid){
$Ord=M('주문목록')
$ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus')
If($ordstatus==1){
true를 반환합니다.
}그밖에{
false 반환;
}
}
//처리 순서 함수
//주문 상태를 업데이트하고 주문 결제 후 반환된 데이터를 씁니다.
함수 orderhandle($parameter){
$ordid=$parameter['out_trade_no']
$data['지불_trade_no'] =$parameter['trade_no']
$data['pay_trade_status'] =$parameter['trade_status']
$data['결제_notify_id'] =$parameter['notify_id']
$data['결제_notify_time'] =$parameter['notify_time']
$data['결제_구매자_이메일'] =$parameter['구매자_이메일']
$data['ordstatus'] =1
$Ord=M('주문목록')
$Ord->where('ordid='.$ordid)->저장($data)
}
//임의의 고유 주문 번호를 얻습니다.
함수 getordcode(){
$Ord=M('주문 목록')
$숫자 = 범위(10,99)
셔플($숫자)
$code=array_slice($numbers,0,4)
$ordcode=$code[0].$code[1].$code[2].$code[3]
$oldcode=$Ord->where("ordcode='".$ordcode."'")->getField('ordcode')
If($oldcode){
getordcode()
}그밖에{
$ordcode 반환;
}
}
4. 요약
1. 인터페이스 패키지의 lib 파일에 있는 파일을 Vendor에 복사한 후 호출의 편의를 위해 TP 사양의 명명 규칙에 따라 이름을 변경합니다. 물론 다른 이름으로 변경할 수도 있습니다.
2. 결제 작업 실행(doalipay), 비동기 반환 결과 처리(notifyurl), 점프 반환 결과 처리(returnurl)의 세 가지 결제 인터페이스의 핵심 페이지를 PayAction 컨트롤러에 작성합니다.
3. 결제 제출 페이지에서는 제출하기 전에 숨겨진 필드 방식을 통해 전달될 일부 매개변수의 내용을 결합할 수 있습니다. 예를 들어, 금액이 먼저 계산되고, 주문 이름, 주문 설명 등이 표시됩니다. 먼저 문자열과 결합됩니다. 그런 다음 doalipay 방식에서는 양식을 직접 구성하고 매개변수를 전달하고 직접 제출하기만 하면 됩니다.
4. 결제 반환 후 처리에는 비동기식 및 점프 방식 모두에서 해당 판단 및 처리가 필요하므로 이러한 판단 및 처리를 사용자 정의 함수에 작성하여 함수를 Yes로 호출하는 한 코드를 더 명확하게 만듭니다. .
5. inform_url 및 return_url 모드의 반환 URL은 Alipay 플랫폼에서 프로젝트 페이지로 반환되며 상대 경로를 사용할 수 없으므로 http://xxxxxxx와 같은 절대 경로를 사용해야 합니다.
위 코드는 ThinkPHP3.0에서도 정상적으로 사용 가능합니다! !
더 많은 thinkPHP 관련 콘텐츠에 관심이 있는 독자는 이 사이트의 특별 주제인 "
ThinkPHP 입문 튜토리얼" 및 "
ThinkPHP의 일반적인 방법 요약"
이 글이 모든 분들의 ThinkPHP 프레임워크 프로그래밍에 도움이 되기를 바랍니다.