ThinkPHP が Alipay インターフェイス関数を実装する例、thinkphp example_PHP チュートリアル
ThinkPHP 実装 Alipay インターフェース関数の例、thinkphp の例
この記事の例では、ThinkPHP が Alipay インターフェース関数を実装する方法について説明します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:
最近システムを開発していたときに、オンライン決済機能を実装する必要があったため、迷わず Alipay のインターフェイス決済機能を選択しました。具体的な実装手順は次のとおりです。
1. Alipayインターフェースパッケージをダウンロードします
ダウンロードアドレス: https://b.alipay.com/order/productDetail.htm?productId=2012111200373124&tabId=4#ps-tabinfo-hashダウンロード方法については詳しく説明しません~~
2番目に、インターフェースパッケージファイルを再編成します、このステップは(私の意見では)重要であると考えるべきです、ダウンロードされたインターフェースパッケージファイルには多くの言語のソースコードが含まれています
alipay.config.phpは関連パラメータの設定ファイルです
alipayyapi.phpはAlipayインターフェースエントリーファイルです
notify_url.php はサーバーの非同期通知ページ ファイルです。
return_url.php はページジャンプ同期通知ファイルです。ThinkPHP フレームワーク ファイルの下で、「Extend」を見つけて「Vendor」と入力し、Vendor フォルダーの下に新しいフォルダー Alipay を作成し、Alipay をサードパーティ クラス ライブラリとして導入し、Alipay の lib ファイル内のすべてのファイルをコピーします。インターフェース ファイル パッケージ、次の合計 4 つのファイル:
ここで、上記のファイルの名前を変更します。
alipay_core.function.php の名前が Corefunction.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 ファイルを開き、次の 2 つのコード部分を削除します require_once("alipay_core.function.php");
require_once("alipay_md5.function.php"); 上記 2 つのファイル内のこれら 2 つのコードを削除する必要があるのはなぜですか? プロジェクトでインターフェイス ファイルを呼び出すときに、ベンダーを通じて 4 つのコア ファイルをすべて導入したためです。したがって、インポートは必要なくなりました。
この時点で、Alipay インターフェース パッケージに関連するコア クラス ライブラリの編成は基本的に完了しました。ここでプロジェクトの呼び出しを開始します;
3. プロジェクトで Alipay インターフェースを呼び出します2ステップで電話をかける:
1. 設定ファイルのConf/Config.phpファイルでAlipay関連のパラメータを設定します
コードをコピーします
コードは次のとおりです:
'cacert'=> getcwd().'\cacert.pem',
'トランスポート'=>'http'、
; )、
//上記の設定項目は、インターフェース パッケージの alipay.config.php ファイルからコピーされ、設定されます
'alipay' =>array(
//これが販売者の Alipay アカウントです。これは、インターフェースの申請時に登録した Alipay アカウントです
'seller_email'=>'pay@xxx.com'、
//これは、プロジェクトの Pay コントローラーの notifyurl メソッドに送信される非同期通知ページの URL です。 'notify_url'=>'http://www.xxx.com/Pay/notifyurl',
//これは、プロジェクトの Pay コントローラーの returnurl メソッドに送信されるページ ジャンプ通知 URL です。 'return_url'=>'http://www.xxx.com/Pay/returnurl',
// 支払いが成功した後にジャンプするページ。プロジェクトの User コントローラー、myorder メソッドにジャンプし、パラメーター Payed (有料リスト) を渡します。 'successpage'=>'User/myorder?ordtype=payed',
//支払いが失敗した場合にジャンプするページ プロジェクトのユーザーコントローラー myorder メソッドにジャンプし、パラメーター unpay (未払いリスト) を渡します。 'errorpage'=>'User/myorder?ordtype=unpay',
)、
2. 次のように新しい PayAction コントローラー コードを作成します
を拡張します //クラスの初期化メソッドで、関連するクラスライブラリを導入します パブリック関数 _initialize() {
ベンダー('Alipay.Corefunction'); ベンダー('Alipay.MD5関数'); ベンダー('Alipay.通知'); ベンダー('Alipay.送信'); }
//doalipayメソッド
パブリック関数 doalipay(){
// require_once("alipay.config.php"); // require_once("lib/alipay_submit.class.php"); //ここでは、TP の C 関数を通じて設定項目パラメータを読み取り、それらを $alipay_config に割り当てます
; $alipay_config=C('alipay_config');
$payment_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 アドレス
;
//リクエストされるパラメータ配列を構築します。変更は必要ありません
$parameter = array(
"サービス" => "create_direct_pay_by_user",
"パートナー" => トリム($alipay_config['パートナー']),
"支払い_タイプ" => $支払い_タイプ、
; "notify_url" => $notify_url、
"return_url" => $return_url、
"seller_email" => $seller_email、
"out_trade_no" => $out_trade_no、
"件名" => $件名、
"total_fee" => $total_fee、
"本体" "本体" => $本体,
"show_url" => $show_url、
"anti_phishing_key" => $anti_phishing_key、
"exter_invoke_ip" => $exter_invoke_ip,
"_input_charset" => トリム(strto lower($alipay_config['input_charset']))
); //リクエストを作成する
$alipaySubmit = 新しい AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter,"投稿", "確認"); $html_text をエコーします。 }
関数notifyurl(){
//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 の通知リターン パラメーターを取得します。技術ドキュメントのサーバー非同期通知パラメーター リストを参照してください
使用されなければならなかったのは残念 $ Trade_status = $ _post ['trade_status'] // $ total_fee $ Notify_id = $ _post ['notify_id'] // 認証IDを通知します。
$ Notify_time = $ _post ['notify_time'] // 通知の送信時刻。形式は yyyy-MM-dd HH:mm:ss です。
$ buyer_email "out_trade_no" => $out_trade_no, // 販売者の注文番号; "trade_no" => $trade_no, //Alipay 取引番号; "total_fee" => $total_fee, //取引金額
; "trade_status" => $trade_status, //取引ステータス
"notify_id" => $notify_id, //通知検証ID。
"notify_time" => $notify_time, //通知の送信時刻。
"buyer_email" => $buyer_email, //購入者の Alipay アカウント; );If($_POST['trade_status'] == 'TRADE_FINISHED') {
オーダーハンドル($パラメータ); // 注文を実行し、Alipay から返されたパラメータを送信します。 「成功」をエコーします。 //検証に失敗しました
echo "失敗"; }
関数 returnurl(){
//頭の処理は上記の2つの方法と同じであり、ここではこれ以上冗長性はありません!
$alipay_config=C('alipay_config'); $alipayNotify = new AlipayNotify($alipay_config);//通知検証結果を計算します
$verify_result = $alipayNotify->verifyReturn(); If($verify_result) {
//検証に成功しました
//Alipay の通知リターン パラメーターを取得するには、技術ドキュメントのページ ジャンプ同期通知パラメーター リストを参照してください
$ out_trade_no $trade_no = $_GET['trade_no'] //Alipay 取引番号
; $trade_status = $total_fee = $_GET['total_fee']; $notify_id = $_GET['notify_id ']
$ Notify_time = $ _get ['notify_time'] // 通知の送信時刻。
$buyer_email = $_GET['buyer_email'] //購入者の Alipay アカウント; $parameter = array(
"out_trade_no" => $out_trade_no, // 販売者の注文番号; "trade_no" => $trade_no, //Alipay 取引番号; "total_fee" => $total_fee, //取引金額
; "trade_status" => $trade_status, //取引ステータス
"notify_id" => $notify_id, "認証 ID を通知します。"
"notify_time" => $notify_time, //通知の送信時刻。
"buyer_email" => $buyer_email, //購入者の Alipay アカウント
); if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {
if(!checkorderstatus($out_trade_no)){
orderhandle($parameter); // 注文を処理し、Alipay から返されたパラメーターを送信します。 }
$this->redirect(C('alipay.successpage'));//設定項目で設定された支払い成功ページにジャンプします
}その他{
エコー "trade_status=".$_GET['trade_status']
$this->redirect(C('alipay.errorpage'));//設定項目で設定された支払い失敗ページにジャンプします
}
}その他{
//検証に失敗しました
//デバッグしたい場合は、alipay_notify.php ページの verifyReturn 関数を参照してください
エコー「支払いに失敗しました!」
}
}
}
?>
3. ここでは、支払い処理プロセスで使用する必要があるいくつかの関数をプロジェクトの Common/common.php に記述しました。これにより、これらの関数を手動で呼び出すことなく直接使用できるようになります。コードは次のとおりです。
コードをコピーします
; 関数 checkorderstatus($ordid){
$Ord=M('注文リスト'); $ordstatus=$Ord->where('ordid='.$ordid)->getField('ordstatus'); If($ordstatus==1){
true を返します
}その他{
false を返します。 }
}
//注文関数の処理
//注文ステータスを更新し、注文の支払い後に返されたデータを書き込みます
関数オーダーハンドル($parameter){
$ordid=$parameter['out_trade_no']
$data['payment_trade_no'] =$parameter['trade_no']
$data['payment_trade_status'] =$parameter['trade_status']
$data['payment_notify_id'] =$parameter['notify_id']
$data['支払い通知時刻'] =$parameter['通知時刻']
$data['支払い_購入者_メールアドレス'] =$パラメータ['購入者_メールアドレス']
$data['ordstatus'] =1; $Ord=M('注文リスト'); $Ord->where('ordid='.$ordid)->save($data); }
// ランダムで一意の注文番号を取得します
関数 getordcode(){
$Ord=M('注文リスト'); $numbers = 範囲 (10,99)
; シャッフル ($numbers); $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) の 3 つの支払いインターフェイスのコア ページを PayAction コントローラーに書き込みます。3. 支払い送信ページでは、送信前に隠しフィールド メソッドで渡すいくつかのパラメーターを組み合わせることができます。たとえば、最初に金額が計算され、注文名、注文の説明などが文字列と結合されます。このように、doalipay メソッドでは、パラメーターを直接作成して渡し、直接送信するだけです。
4. 支払いが戻った後の処理は、非同期メソッドとジャンプメソッドの両方で対応する判断と処理が必要になるため、これらの判断と処理をカスタム関数に記述し、関数を呼び出すだけで済むようになります。
5. Notice_url モードと return_url モードの戻り URL は、http://xxxxxxx などの絶対パスを使用する必要があります。これは、これらの URL は Alipay プラットフォームからプロジェクト ページに返され、相対パスは使用できないためです。
上記のコードはThinkPHP3.0で正常に動作します! !
この記事で説明した内容が、皆様の ThinkPHP フレームワーク プログラミングに役立つことを願っています。

負荷分散はセッション管理に影響しますが、セッションの複製、セッションの粘着性、集中セッションストレージで解決できます。 1。セッションレプリケーションサーバー間のセッションデータをコピーします。 2。セッションスティンネスは、ユーザーリクエストを同じサーバーに指示します。 3.集中セッションストレージは、Redisなどの独立したサーバーを使用してセッションデータを保存してデータ共有を確保します。

SESSIONLOCKINGISATECHNIQUESTOESUREAUSER'SSESSIONREMAINSEXCLUSIVETOONEUSATIME.ITISCRUCIALFORPREVENTINGDATACORTIONANDSECURITYBREACHESINMULTI-USERAPPLICATIONS.SESSIONLOCKINGISISIMPLEMENTEDUSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGSINGROCKINGSMECHANISMなど

PHPセッションの代替品には、Cookie、トークンベースの認証、データベースベースのセッション、Redis/Memcachedが含まれます。 1.Cookiesは、クライアントにデータを保存することによりセッションを管理します。 2.トークンベースの認証はトークンを使用してユーザーを検証します。これは非常に安全ですが、追加のロジックが必要です。 3.Databaseベースのセッションは、データベースにデータを保存します。これは、スケーラビリティが良好ですが、パフォーマンスに影響を与える可能性があります。 4. Redis/Memcachedは分散キャッシュを使用してパフォーマンスとスケーラビリティを向上させますが、追加のマッチングが必要です

SessionHijackingとは、ユーザーのSessionIDを取得してユーザーになりすましている攻撃者を指します。予防方法には、次のものが含まれます。1)HTTPSを使用した通信の暗号化。 2)SessionIDのソースの検証。 3)安全なSessionID生成アルゴリズムの使用。 4)SessionIDを定期的に更新します。

この記事では、PHPについて説明し、その完全なフォーム、Web開発での主要な使用、PythonとJavaとの比較、および初心者の学習のしやすさについて説明します。

PHPは、$ \ _ postおよび$ \ _を使用してフォームデータを処理し、検証、消毒、安全なデータベースインタラクションを通じてセキュリティを確保します。

この記事では、PHPとASP.NETを比較して、大規模なWebアプリケーション、パフォーマンスの違い、セキュリティ機能への適合性に焦点を当てています。どちらも大規模なプロジェクトでは実行可能ですが、PHPはオープンソースであり、プラットフォームに依存しませんが、ASP.NET、

PHPの症例感度は変化します:関数は鈍感であり、変数とクラスは感度があります。ベストプラクティスには、一貫した命名と、比較のためにケース非感受性関数を使用することが含まれます。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SublimeText3 中国語版
中国語版、とても使いやすい

WebStorm Mac版
便利なJavaScript開発ツール

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









