ThinkPHP 実装 Alipay インターフェース関数の例、thinkphp の例
この記事の例では、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は関連パラメータの設定ファイルです
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_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 ファイルを開き、次の 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関連のパラメータを設定します
コードをコピーします
コードは次のとおりです:
//Alipay設定パラメータ
'alipay_config'=>array(
'partner' =>'20********50', //Alipay インターフェースへの申請に成功した後に取得した PID は次のとおりです
'key'=>'9t****************ie',//これが、Alipay インターフェースへの申請に成功した後に取得したキーです
'sign_type'=>strtoupper('MD5'),
'input_charset'=> strto lower('utf-8')、
'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 コントローラー コードを作成します
コードをコピーします コードは次のとおりです:
クラス PayAction は Action{
を拡張します
//クラスの初期化メソッドで、関連するクラスライブラリを導入します
パブリック関数 _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 に記述しました。これにより、これらの関数を手動で呼び出すことなく直接使用できるようになります。コードは次のとおりです。
コードをコピーします
コードは次のとおりです://ユーザーの注文書レコードを保存するために使用される Orderlist データ テーブル
//オンライン取引注文決済処理機能
//機能: 支払いインターフェースから返されたデータに基づいて、注文が正常に支払われたかどうかを判断します
//戻り値: 注文が正常に支払われた場合は true を返し、それ以外の場合は false を返します
;
関数 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 フレームワーク プログラミングに役立つことを願っています。
http://www.bkjia.com/PHPjc/920605.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/920605.html技術記事 ThinkPHP による Alipay インターフェース関数の実装例、thinkphp の例 この記事では、ThinkPHP による Alipay インターフェース関数の実装方法について説明します。参考のためにみんなで共有してください。具体的な分析は次のとおりです:...