PHP実装のアリペイ決済機能例

6060 ワード

PHPが実現するアリペイ決済機能について例を示した.皆さんの参考にしてください.具体的には以下の通りです.
アプリにアリペイの支払いインタフェースをするときに収集した内容は以下のように整理されています.
インタフェース:

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);
    }
}


付:支付宝支払いと微信支払いの非同期コールバックはずっと呼び出しています
最近会社は微信の支払いと支付宝の支払いを開発して、前期の仕事はすべてすでに完成して、しかし非同期のコールバックが値を取る時、非同期のコールバックはずっと呼び出して、私のデータはずっと繰り返してデータベースに保存して、本当におばさんが来たと感じて、全然止まらない!ははは、やはり车を运転しないで、问题を见て、よく考えて、头の中ですぐに浮かぶ1つの解决方法は、非同期のコールバックで、中にもう1つのインターフェースを书いて、毎回コールバックしてデータを取った后で、データベースを调べて、データがあるかどうかを见て、もしあるならば缲り返して保存しないで、しかしよく考えてみると、间违って、これは根本を治さないで、だめで、问题がある以上、根源があり、正しい解決方法があるに違いない.では、根拠を見つけます.それはドキュメントを表示することです.
1.支付宝のドキュメント、以下は支付宝の非同期コールバックのドキュメントです:クリックして公式リンクを開きます
サーバ非同期通知ページの特性は、サーバ非同期通知ページ(notify_url)にスペース、HTMLラベル、開発システムが投げ出した異常提示情報などの文字がないことを保証する必要があります.支付宝はPOST方式で通知情報を送信するので、request.Form(「out_trade_no」)、$POST[‘out_trade_no']; アリペイが自発的に通知を開始してこそ、この方法が有効になります.支付宝の取引管理にのみ当該取引が存在し、取引状態の変化が発生し、アリペイはこの方式によってサーバー通知を開始する(即時入金取引状態が「買手の支払い待ち」の状態であれば、デフォルトでは通知を送信しない);サーバー間の相互作用は、ページジャンプ同期通知のようにページ上に表示することができない、この相互作用方式は見えない;初めての取引状態の変化(即時入金時に取引状態が取引完了)すると、同期処理結果だけでなく、サーバー非同期通知ページにも支付宝からの処理結果通知が表示されます.プログラムの実行後に「success」を印刷出力する必要があります(引用符は含まれていません).商戸から支付宝にフィードバックされた文字がsuccessの7文字でない場合、支付宝サーバーは24時間22分を超えるまで通知を再送し続けます.一般的には、25時間以内に8回の通知を完了します(通知の間隔周波数は一般的に4 m,10 m,10 m,1 h,2 h,6 h,15 h).プログラムの実行が完了すると、そのページはジャンプできない.ページジャンプを実行すると、アリペイはsuccess文字を受け取れず、アリペイサーバから当該ページプログラムの実行に異常が発生したと判定され、処理結果通知が再送される.cookies,sessionなどはこのページで失効し、つまり取得できないこれらのデータ;この方式のデバッグと実行は、サーバ上、すなわちインターネット上でアクセスできる必要がある.この方式の役割は主に注文の紛失を防止することであり、すなわちページのジャンプ同期通知が注文の更新を処理していない場合、それは処理する.クライアントがサーバ非同期通知を受信しsuccessを印刷すると、サーバ非同期通知パラメータnotify_idは失効します.すなわち、サーバ非同期通知パラメータnotify_idは、アリペイが同じ非同期通知を送信した場合(業者がsuccessを印刷できなかったことによるアリペイの再送数回の通知を含む)は変わらない.
見たか、プログラムはsuccessを印刷しなければならないので、支付宝は噴血を止め、自分がプログラムを振り返ったとき、自分が確かにsuccessに戻っていないことに気づいたので、プログラムが終わったら、successに戻ってください.私が使っているphpのため、プログラムが終わった後です.次の言葉を使えばいいです.

eg:
echo "success";


2.微信ドキュメントクリックで公式リンクを開く
支払いが完了すると、微信は支払い結果とユーザー情報を業者に送信し、業者は処理を受信し、応答を返す必要がある.バックグラウンド通知がインタラクティブな場合、微信が業者からの応答が成功またはタイムアウトではない場合、微信は通知が失敗したと考え、微信は一定の戦略を通じて定期的に通知を再開し、できるだけ通知の成功率を高めるが、微信は通知が最終的に成功することを保証しない.(通知頻度は15/15/30/180/1800/1800/1800/1800/3800/3600、単位:秒)注意:同様の通知が複数回にわたって事業者システムに送信される場合があります.事業者システムは重複する通知を正しく処理する必要があります.推奨の方法は、通知を受け取って処理を行う場合、まず対応する業務データの状態をチェックし、その通知が処理されたかどうかを判断し、処理されていない場合処理を再実行し、処理が完了したら直接結果を返します.ビジネスデータのステータスチェックと処理を行う前に、関数の再読み込みによるデータの混乱を回避するために、データロックを使用して同時制御を行います.特に注意:商家システムは支払い結果通知の内容に対して必ず署名検証を行い、返された注文金額が商家側の注文金額と一致しているかどうかを検証し、データ漏洩による「偽通知」を防止し、資金損失をもたらす.技術者は微信商戸のバックグラウンドスキャンに登ってインタフェース警報群に参加することができる.
見ましたか.このドキュメントも、微信の非同期通知後、微信サーバにメッセージを返す必要がありますが、微信のすべてのデータフォーマットはxmlです.だから、私たちは微信にデータを返すことができます.

echo ""; 

戻りを行う場合、フォーマットは問題なく、出力時に問題がある可能性があります.次の方法を使用します.

echo exit('');


このように簡単で、すぐに微信と支付宝の血を止めて、完璧な結末!
参照リンク:
携帯サイトの支払い結果の非同期通知https://docs.open.alipay.com/203/105286/
App支払サービス側DEMO&SDKhttps://docs.open.alipay.com/54/106370/
参考記事:
https://www.jb51.net/article/158480.htm
PHPに関する内容についてもっと兴味のある読者は、「PHP微信开発技巧まとめ」、「php curl用法まとめ」、「PHPネットワークプログラミング技巧まとめ」、「php文字列(string)用法まとめ」、「PHP中jsonフォーマットデータ操作技巧まとめ」、「PHP XMLファイル操作技巧まとめ」
ここで述べたことが皆さんのPHPプログラム設計に役立つことを願っています.