>  기사  >  백엔드 개발  >  PHP에서 Alipay 결제 기능을 구현하는 방법(사진과 텍스트로 자세한 설명)

PHP에서 Alipay 결제 기능을 구현하는 방법(사진과 텍스트로 자세한 설명)

卡哇伊
卡哇伊원래의
2020-07-06 10:39:194045검색

PHP에서 구현된 Alipay 결제 기능: 예제 양식 분석과 결합하여 PHP는 Alipay 인터페이스를 사용하여 결제 기능을 구현합니다. 먼저 인터페이스 코드를 구성하여 작업의 안정성을 보장하고 콜백에서 서명을 확인합니다. 기능을 달성하기 위해 매개변수를 확인함으로써 처리가 완료됩니다.

PHP에서 Alipay 결제 기능을 구현하는 방법(사진과 텍스트로 자세한 설명)

문제 내용:

이 글에서는 PHP로 구현된 Alipay의 결제 기능에 대해 설명합니다.

참고용으로 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다.

앱용 Alipay 결제 인터페이스를 만들 때 수집되는 콘텐츠는 다음과 같습니다.

인터페이스:

import('alipay.AopClient', EXTEND_PATH);
import('alipay.request.AlipayTradeAppPayRequest', EXTEND_PATH);
$aop = new \AopClient();
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = Config::get('alipay.app_id');
$aop->rsaPrivateKey = Config::get('alipay.rsa_private_key');
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = Config::get('alipay.alipay_rsa_public_key'); //Config::get('alipay.rsa_public_key'); //
$request = new \AlipayTradeAppPayRequest();
$bizcontent = json_encode([
  'body' => '红包支付',
  'subject' => '用户红包支付',
  'out_trade_no' => $orderSn,
  'timeout_express' => '30m',
  'total_amount' => $amount,
  'product_code' => 'QUICK_MSECURITY_PAY'
]);
$request->setNotifyUrl("https://" . $_SERVER['HTTP_HOST'] . "/api/callback/alipay");
$request->setBizContent($bizcontent);//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
$return['aliresponse'] = $response;//htmlspecialchars($response);//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题
$this->returnSuccess($return);

콜백 처리:

public function alipay()
{
    import('alipay.AopClient', EXTEND_PATH);
    $aop = new \AopClient();
    $aop->alipayrsaPublicKey = Config::get('alipay.alipay_rsa_public_key');// file_get_contents($_SERVER['DOCUMENT_ROOT']."/key/alipay/alipay_public_key.txt");
    $flag = $aop->rsaCheckV1($_POST, NULL, "RSA2");
    if ($flag){
      //验签通过后核实如下参数trade_status、out_trade_no、total_amount、seller_id
      if (isset($_POST['trade_status']) && ($_POST['trade_status'] == 'TRADE_SUCCESS' || $_POST['trade_status'] == 'TRADE_FINISHED') ) {
        // 业务处理
      } else {
        $msg = var_export($_POST, true);
        $fileName = mt_rand(10,1000) .'00alisuccessAnother.log' ;
        file_put_contents($fileName, $msg);
      }
      echo "success";
    } else {
      $msg = var_export($_POST, true);
      $fileName = mt_rand(10,1000) .'00alicheckSignFail.log';
      file_put_contents($fileName, $msg);
    }
}

자세한 학습 추천: Alipay 즉시 신용 온라인 결제 실무 프로젝트 개발 동영상 튜토리얼

첨부: Alipay 결제와 WeChat 결제 비동기 콜백은 항상 호출됩니다

최근 Alipay 결제를 개발하고 있는데, 예비 작업은 끝났는데 비동기 콜백이 계속 호출되면서 내 데이터가 데이터베이스에 반복적으로 저장되는 문제를 곰곰이 생각해보면 바로 떠오르는 해결 방법은 다음과 같습니다. 비동기 콜백 내부의 인터페이스입니다. 데이터를 가져오는 콜백마다 데이터베이스에 쿼리하여 데이터가 있는지 확인합니다. 하지만 잘 생각해보면 이는 잘못된 것입니다. 근본 원인이 아닌 증상을 치료하는 것입니다. 아니, 문제가 있으니 근본 원인이 있어야 합니다. 따라서 근거를 찾으려면 문서를 확인해야 합니다.

1. Alipay 문서 , Alipay 비동기 콜백 문서는 다음과 같습니다.

서버 비동기 알림 페이지 기능

비동기가 없는지 확인해야 합니다. 서버의 알림 페이지(notify_url) 공백, HTML 태그, 개발 시스템에서 발생한 예외 프롬프트 등과 같은 모든 문자
Alipay는 POST를 사용하여 알림 정보를 보내므로 이 페이지에서 다음과 같은 매개변수를 얻습니다. request.Form("out_trade_no") , $_POST['out_trade_no'];
Alipay가 적극적으로 알림을 시작하는 경우 이 방법이 활성화됩니다.
Alipay의 거래 관리에 해당 거래가 존재하고 거래 상태가 변경되는 경우에만 Alipay가 이 방법을 시작합니다. 서버 알림(즉시 거래 상태가 "구매자 결제 대기"인 경우 기본적으로 알림이 전송되지 않습니다.)
서버 간 상호 작용은 페이지에 표시될 수 있는 페이지 이동 동기화 알림과 달리 이러한 상호 작용 방법입니다.
처음으로 거래 상태가 변경되면(즉시 결제의 경우 거래 상태가 거래 완료) 동기 처리 결과가 반환될 뿐만 아니라 서버 비동기 알림 페이지에도 Alipay 공지의 처리 결과가 수신됩니다. ;
프로그램이 실행된 후에는 "success"가 인쇄되어야 합니다(따옴표 제외). 판매자가 Alipay에 피드백한 문자가 성공 7자가 아닌 경우 Alipay 서버는 24시간 22분을 초과할 때까지 계속해서 알림을 다시 보냅니다.
일반적인 상황에서는 25시간 이내에 8개의 알림이 완료됩니다(알림 간격 빈도는 일반적으로 4분, 10분, 10분, 1시간, 2시간, 6시간, 15시간입니다).
프로그램 실행이 완료된 후에는 페이지 이동을 수행할 수 없습니다. . 페이지 점프가 실행되면 Alipay는 성공 문자를 받지 못하고 Alipay 서버는 페이지 프로그램이 비정상적으로 실행되고 있다고 판단하여 처리 결과 알림을 다시 보냅니다.
쿠키, 세션 등은 무효화됩니다. 즉, 이러한 데이터를 얻을 수 없습니다.
이 방법의 디버깅 및 작업은 서버, 즉 인터넷에서 액세스할 수 있어야 합니다.
이 방법의 기능은 주로 주문 손실을 방지하는 것입니다. 페이지 이동 동기화 알림은 주문 업데이트를 처리하지 않고 처리합니다.
판매자가 수신하면 서버의 비동기 알림 매개변수 inform_id는 서버가 비동기적으로 알림을 보내고 성공을 인쇄하는 경우에만 유효하지 않게 됩니다. 즉, Alipay가 동일한 비동기 알림
을 보낼 때(판매자가 성공 인쇄에 실패하고 Alipay가 알림을 여러 번 다시 보내는 경우 포함), 서버 비동기 알림 매개변수 inform_id는 변경되지 않은 상태로 유지됩니다.

보세요, 프로그램은 인쇄되어야 합니다

. PHP를 사용하고 있기 때문에 프로그램이 끝난 후. 다음 문장을 사용하면 됩니다. success后,支付宝才会停止喷血,自己再回头看程序的时候,发现自己的确没有返回success,所以在程序结束后,返回一个success

eg:
echo "success";

2. 위챗 문서

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
 
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知
最终能成功。 (通知频率为15/15/30/180/1800/1800/1800/1800/3600,单位:秒)
 
注意:同样的通知可能会多次发送给商户系统。商户系统必须能够正确处理重复的通知。
推荐的做法是,当收到通知进行处理时,首先检查对应业务数据的状态,判断该通知是否已经处理过,如果没有处理过再进行处理,如果处理过直接返回结果成功。
在对业务数据进行状态检查和处理之前,要采用数据锁进行并发控制,以避免函数重入造成的数据混乱。
 
特别提醒:商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致,防止数据泄漏导致出现“假通知”,造成资金损失。
技术人员可登进微信商户后台扫描加入接口报警群。

看到没,在此文档也是,在微信的异步通知后,也需要给微信服务器,返回一个信息,只不过,微信的所有数据格式都是xml的。所以我们在返回一个数据给微信即可。

echo "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";

在进行返回的时候,格式没问题,可能在输出的时候,存在问题。使用下面方式即可:

echo exit(&#39;<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>&#39;);

就是这么简单,完美结局!

相关学习推荐:php视频教程

위 내용은 PHP에서 Alipay 결제 기능을 구현하는 방법(사진과 텍스트로 자세한 설명)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.