ホームページ  >  記事  >  バックエンド開発  >  PHPを使ってクイック入金機能を実装する_PHPチュートリアル

PHPを使ってクイック入金機能を実装する_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-20 11:16:33933ブラウズ

このプロジェクトはzendフレームワークを使用して実装されています
modules/default/controllers/IndexController.php
IndexController.php

コードをコピー コードは次のとおりです。
クラス IndexController は Zend_Controller_Action を拡張します
{
パブリック関数 init()
{
/* ここでアクションコントローラーを初期化します */
}
パブリック関数indexAction()
{

/*注文をシミュレートします
*$MockOrder はデータベースから取得された情報であり、ドルの Request 情報が含まれています。ここに死ぬほど書きました。
*orderId 注文番号、データベース テーブルの主キー (一意)。 //必須フィールド
*usr_idtype ニーズに応じた ID タイプ。
*usr_idcode ID 番号、必要に応じて。
※etx_status が割引されるかどうかはニーズによって異なります。
*time_create は、独自のニーズに応じて、優先時間を満たしているかどうかを検証します。
*ets_license パッケージ コードは、ニーズに応じた製品カテゴリのようなものです。
*contact_type 連絡先情報のタイプ、固定選択値 1、2。1 つの電子メール、2 つの携帯電話番号。必要に応じて、ドル側は空にすることができます。
*contact_text連絡先情報。contact_typeに従って入力します。必要に応じて、ドル側は空にすることもできます。
*etsPrice のパッケージ価格と製品価格はお客様のニーズに基づいています。
*オーダー価格実際の価格はお客様のニーズに基づいています。
*注文金額実際の注文金額には手数料がかかります。 //必須フィールド
*orderTime 注文時間。 //必須フィールド
*paySuccess注文が正常に支払われたかどうか。 //必須フィールド
*buySuccess アカウントが正常に生成されるかどうかは、ニーズによって異なります
*payTime 注文の支払いが成功した時刻。 //必須フィールド
※要するにご注文に関わる全ての項目が必須項目となります
*orderId、orderAmount、orderTime はリクエストの必須フィールドです
*paySuccess と payTime は応答の必須フィールドです
*/
$MockOrder = array();
$MockOrder['orderId'] = '100000125'; //注文番号。 --必要です
$MockOrder['usr_idtype'] = '1';//書類の種類、IDカード
$MockOrder['usr_idcode'] = '371111199011111111';//ID番号
$MockOrder['etx_status'] = '0';// 割引はありませんか? $MockOrder['time_create'] = '1352338189';//時間が割引されているかどうかを確認します
$MockOrder['ets_license'] = '1' //パッケージコードと製品カテゴリ
; $MockOrder['contact_type'] = '1';//連絡先タイプ 1、メール
$MockOrder['contact_text'] = 'x@163.com';//連絡先情報、メールアドレス
$MockOrder['etsPrice'] = '30800';//パッケージ価格と商品価格
$MockOrder['orderPrice'] = '30800' //実際の価格
; $MockOrder['orderAmount'] = '31100'; //注文に対して支払われた実際の価格に手数料を加えたもの。 --必要です
$MockOrder['orderTime'] = '1352338199'; //注文の生成時間。 --必要です
$MockOrder['paySuccess'] = '0' //注文が正常に支払われたかどうか。 --必要です
$MockOrder['buySuccess'] = '0';//アカウントが正常に生成されたかどうか
$MockOrder['payTime'] = '0'; //注文の支払い時間。 --必要です

//BillRequest は Kuaiqian に必要なパラメータです
$this->view->BillRequest = new Application_Model_BillRequest($MockOrder);
Zend_Debug::dump($this->view->BillRequest);終了
}

//bgUrl アドレスポイントはここにあります
パブリック関数receiveAction()
{
//データベース設計を受け取る
/*$MockReceive 配列を使用してシミュレートします
* $MockReceive = array();
* $MockReceive['id'] 主キー;
* $MockReceive['orderId'] 販売者の注文番号;
* $MockReceive['receiveTime'] 受け入れ時間;
* $MockReceive['queryString']http_build_encode($_REQUEST);
* $MockReceive['dealId']クイックマネー取引番号;
* $MockReceive['bankDealId'] 銀行取引番号;
* $MockReceive['payResult'] 処理結果 10: 支払い成功; 11: 支払い失敗; * $MockReceive['dealTime']クイックマネー取引時間;
* $MockReceive['payAmount']注文の実際の支払い金額;
* $MockReceive['fee'] 料金;
* $MockReceive['errCode'] エラー コード;
*/


/*$_REQUEST は Kuaiqian から返されたデータです
*merchantAcctId RMB 口座番号は、注文送信時の RMB 口座番号と一致する必要があります。
* versionゲートウェイのバージョン、固定値: v2.0、注文送信時のゲートウェイのバージョン番号と一致します。
* 言語 Web ページに表示される言語タイプ (1 中国語) は、注文を送信するときに Web ページに表示される言語タイプと一致します
*signType 署名タイプ、4PKI 署名、注文送信時の署名タイプと一致します
*payType の支払い方法、00 all は、注文送信時の支払い方法と一致します
* BankId 銀行コード
* orderId 販売者注文番号。注文送信時の販売者注文番号と一致します
* orderTime の販売者注文送信時間は、注文が送信されたときの販売者注文送信時間と一致します
* orderAmount 販売者の注文金額は、注文を送信したときの販売者の注文金額と一致します。
* dealId クイックマネー取引番号
* BankDealId 銀行取引番号
* dealTime 速いお金の取引時間
* payAmount注文の実際の支払い金額
*有料
*ext1 拡張フィールド 1、注文送信時の拡張フィールド 1 と一致します
*ext2 拡張フィールド 2、注文送信時の拡張フィールド 2 と一致します
* payResult处理结果 10:支付成功;11:支付失败
* errCode错误代码,可为空
* signMsg签名字符串
*/
$BillResponse = new Application_Model_BillResponse($_REQUEST);
//$BillResponse->checkSignMsg验证签名字符串是否正确,防止bug漏洞等
if($BillResponse->checkSignMsg){
//判断订单支付是否成功
if($BillResponse->isSuccess){
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这里是成功页面
return "1http://99bill/default/index/sucess";exit;
}else{
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "1http://99bill/default/index/fail";exit;
}
}
//返回给快钱,快钱会按照redirecturl地址跳到新页面,这个是失败页面
return "1http://99bill/default/index/fail";exit;
}

//redirecturl地址
//成功
public function success()
{

}

//失败
public function fail()
{

}
}


modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvMerchantInfoAction.htm

复制代码 代码如下:
BillRequest;?>


$val):?>





<スクリプト>
document.getElementById('kqPay').click();


モデル/BillRequest.php
BillRequest.php

コードをコピー コードは次のとおりです。
クラス Application_Model_BillRequest
{
パブリック関数 __construct($MockOrder){
/*
* RMBゲートウェイアカウント。
*最初の方法: アカウントは 11 桁の人民元ゲートウェイ加盟店番号 + 01 です。このパラメータは必須です。 01 は中国工商銀行に相当します。
*2 番目の方法: アカウントは 16 桁の人民元ゲートウェイ加盟店です
*/
$this->merchantAcctId = "1001011111101"; //支払い結果を受信するサーバーのバックエンド アドレス。このパラメータは入力する必要があります。絶対パスは // 空にすることはできません。
$this->bgUrl = "http://99bill/default/index/receive";
//販売者注文番号、時間は以下の注文番号を定義するために使用されます。販売者は独自の注文番号定義ルールに従ってこの値を定義できます。 //空にすることはできません。
$this->orderId = 'TOLPC'.sprintf("%09d", $MockOrder['orderId']);
// 注文金額、金額は「セント」です。販売者テストの場合は、1 ポイントで十分です。このパラメータは必須です。 // 空にすることはできません。 $this->orderAmount =$MockOrder['orderAmount'];
//注文送信時刻、形式: yyyyMMddHHmmss、例: 20071117020101//空にすることはできません。
$this->orderTime = date("YmdHis", $MockOrder['orderTime']);
// 支払者名は空でもかまいません。
$this->支払者名= ""; //支払者の連絡先タイプ。1 は電子メールを表し、2 は携帯電話の連絡先を表します。空でも構いません。
$this->payerContactType = "";
//支払者の連絡先情報は、payerContactType 設定に対応します。payerContactType が 1 の場合は電子メール アドレスを入力し、payerContactType が 2 の場合は携帯電話番号を入力します。空でも構いません。
$this->payerContact = "";
//製品名は空でもかまいません。
$this->製品名= "TOLPC";
//アイテムの数量。空でも構いません。
$this->productNum = "1";
//製品コードは空でもかまいません。
$this->productId = $MockOrder['ets_license'];
//商品の説明は空でも構いません。
$this->productDesc = "";
//支払い方法 (通常は 00) はすべての支払い方法を表します。銀行に直接接続されている販売者の場合、値は 10 です。必須//空にすることはできません
$this->payType = "00";
//エンコード方式、1 は UTF-8 を表し、2 は GB2312 を表します。デフォルトは 1 であり、このパラメータは必須です。 // 空にすることはできません
$this->inputCharset = "1";
//ゲートウェイのバージョン、固定値: v2.0、このパラメータは必須です //空にすることはできません
$this->version = "v2.0";
//言語タイプ、1は中国語表示、2は英語表示を表します。デフォルトは 1 です。このパラメータは必須です//空にすることはできません
$this->言語 = "1";
//署名タイプ、値は 4 で、PKI 暗号化方式を表します。このパラメータは必須です。 //空にすることはできません
。 $this->signType = "4";
//支払い結果を受け取るページのアドレス。通常、このパラメータは空のままです。
$this->pageUrl = "";
//拡張フィールド 1。販売者は必要なパラメータを渡すことができ、支払い後に元の値が返されます (空にすることもできます)。
$this->ext1 = $MockOrder['orderId'];
// 段落 2 から拡張して、販売者は必要なパラメータを渡すことができます。支払い後、元の値が返されます (空にすることもできます)。
$this->ext2 = $MockOrder['orderTime'];
//銀行コード。payType が 00 の場合、この値は空でもかまいません。payType が 10 の場合、この値は入力する必要があります。詳細については、銀行リストを参照してください。
$this->bankId = "";
//同じ注文を繰り返し送信することは禁止されています。物理的なショッピング カートには 1 を入力し、仮想商品には 0 を入力してください。1 は一度だけ送信できることを意味し、0 は支払いが失敗した場合に再度送信できることを意味します。空でも構いません。
$this->redoFlag = "";
//Kuaiqian パートナーの口座番号、つまり販売者番号は空でもかまいません。
$this->pid = "";

//Kuaiqian によって提供されるリクエスト パラメーター。
$KeyOrders = array('inputCharset','pageUrl','bgUrl','version',' language','signType','merchantAcctId','payerName','payerContactType','payerContact',
'orderId','orderAmount','orderTime','productName','productNum','productId','productDesc','ext1','ext2','payType','bankId','redoFlag','pid '、);

//Kuaiqian によって提供されたリクエスト パラメーターの値が空かどうかを判断し、空でないパラメーターと値を配列に再編成します
foreach($KeyOrders を $key){
if(''==$this->{$key}){続行;}
$params[$key] = $this->{$key};
}
//http_build_query() は URL エンコード後にリクエスト文字列を生成します
//urldecode() はエンコードされていない文字列を復元します
//getSignMsg() PKI暗号化、MD5暗号化も利用可能
//MD5 暗号化メソッド strtoupper(md5(urldecode(http_build_query($params)))); これは現在では一般的に使用されていません。
//一般的に使用される PKI 暗号化
$this->signMsg = $this->getSignMsg(urldecode(http_build_query($params)));
}

//PKI暗号化技術

パブリック関数 getSignMsg($param){
//99bill-rsa.pem は Kuaiqian の CA 証明書です
// ローカルでランダムに KEY を生成し、この KEY を使用してデータを暗号化します。その KEY は $priv_key_id
です。 $priv_key_id = openssl_get_privatekey(file_get_contents("99bill-rsa.pem", "r"));
//$priv_key_id を使用して $param データを暗号化します。
//SHA1 ハッシュを使用して暗号化された署名文字列 $param を計算し、続いて $priv_key_id 秘密鍵暗号化を実行します。データ自体は暗号化されません。
openssl_sign($param, $signMsg, $priv_key_id, OPENSSL_ALGO_SHA1);
// $priv_key_id をストレージから解放します
openssl_free_key($priv_key_id);
//base64 を使用してデータをエンコードします
returnbase64_encode($signMsg);
}
}


models/BillResponse.php
BillResponse.php

コードをコピー コードは次のとおりです。
クラス Application_Model_BillResponse
{
/*
* __construct() コンストラクター
* 19 個のパラメータと値を生成します。1 つのパラメータの値は空である可能性があり、$this->errCode の値は空である可能性があります
*/
パブリック関数 __construct($response){
$KeyOrders = array('merchantAcctId','version',' language','signType','payType','bankId','orderId','orderTime','orderAmount',
'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode', 'signMsg');
foreach($KeyOrders を $key){
$this->{$key} = $response[$key];
}
}
/*
* 署名文字列を確認してください
* Kuaiqian によって返される署名文字列は $this->signMsg
です * Base64 を使用して前の文字列をデコードします
* Kuaiqian から与えられた公開鍵を使用して検証します
* Kuaiqian では、返されたパラメーター値が空でない場合、秘密キー暗号化を使用して $this->signMsg
を生成しました。 * Kuaiqian から秘密鍵に対応する公開鍵が提供され、この公開鍵を使用して検証しました。成功の場合は 1、失敗の場合は 0、エラーの場合は -1。
*/
パブリック関数 checkSignMsg(){
$KeyOrders = array('merchantAcctId','version',' language','signType','payType','bankId','orderId','orderTime','orderAmount',
'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode',);
foreach($KeyOrders を $key){
if(''==$this->{$key}){続行;}
$params[$key] = $this->{$key};
}
//$pub_key_id 公開鍵
$pub_key_id = openssl_get_publickey(file_get_contents("99bill-rsa.cer", "r"));
return openssl_verify(urldecode(http_build_query($params))、base64_decode($this->signMsg)、$pub_key_id); }
パブリック関数 isSuccess(){
//$this->payResult は成功すると 10、失敗すると 11 になります
return '10'==$this->payResult;
}
パブリック関数 getOrderId(){
return str_replace('XXX', '', $this->orderId);
}
}


ペアではない公開鍵と秘密鍵が必要です 全部半分です
99bill-rsa.cer
99bill-rsa.pem

http://www.bkjia.com/PHPjc/372419.htmlwww.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/372419.html技術記事このプロジェクトでは、zend フレームワーク フレームワークを使用して modules/default/controllers/IndexController.php IndexController.php を実装します。 ?php class IndexController extends Zend_Con...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。