ホームページ  >  記事  >  バックエンド開発  >  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 はこの方法を通じてサーバー通知を開始します (インスタント到着トランザクション ステータスのデフォルト ステータスは「購入者の支払いを待っています」です)
通知は送信しません);
サーバー間の対話。ページに表示できるページ ジャンプ同期通知とは異なり、この対話方法は目に見えません;
最初のトランザクション ステータスが変更されます (この時点ですぐにトランザクション ステータスがトランザクションの場合) completed)、同期処理結果が返されるだけでなく、サーバー非同期通知ページも Alipay からの処理結果通知を受け取ります;
プログラムの実行後、「成功」が出力される必要があります (引用符なし) 。販売者から Alipay にフィードバックされた文字が成功の 7 文字ではない場合、Alipay サーバーは 24 時間 22 分を超えるまで通知を再送信し続けます。
通常の状況では、25 時間以内に 8 件の通知が完了します (通知の間隔頻度は通常: 4 分、10 分、10 分、1 時間、2 時間、6 時間、15 時間です);
プログラムの実行が完了すると、ページ実行できません。ジャンプしてください。ページジャンプが実行された場合、Alipay は成功文字を受信せず、Alipay サーバーはページプログラムが異常に実行されていると判断し、処理結果通知を再送信します。
Cookie、セッションなどが無効になります。このページ、つまり取得できません。これらのデータ;
このメソッドのデバッグと操作はサーバー上にある必要があります。つまり、インターネット上でアクセスできます;
このメソッドの機能は次のとおりです。主に注文の損失を防ぐため、つまり、ページ ジャンプ同期通知は注文の更新を処理せず、処理します ;
マーチャントがサーバーの非同期通知を受信し、成功を出力すると、サーバーの非同期通知パラメータ Notice_id無効となります。つまり、Alipay が同じ非同期通知
を送信するとき (販売者が正常に成功を出力できず、Alipay が通知を数回再送信することになったという事実を含む)、サーバーの非同期通知パラメータ notify_id は変更されません。

Alipay の吐血が止まる前に、プログラムを出力する必要があることがわかりましたか? プログラムをもう一度見てみると、確かに戻ってきていないことがわかりました

success なので、プログラム終了後は success を返すだけです。 phpを使っているのでプログラム終了後。次の文を使用してください。

eg:
echo "success";
2.WeChat ドキュメント

支付完成后,微信会把相关支付结果和用户信息发送给商户,商户需要接收处理,并返回应答。
 
对后台通知交互时,如果微信收到商户的应答不是成功或超时,微信认为通知失败,微信会通过一定的策略定期重新发起通知,尽可能提高通知的成功率,但微信不保证通知
最终能成功。 (通知频率为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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。