*$MockOrder データベースから取り出した情報で、ドルリクエストに関する情報が含まれています。ここに死ぬほど書きました。
*orderId 注文番号、データベーステーブルの主キー (一意)。 //必要なフィールド
*usr_idtype 必要に応じてドキュメント タイプ。
*usr_idcode ID 番号、必要に応じて。
*etx_status が割引されるかどうかは、ニーズによって異なります。
*time_create は、独自のニーズに応じて、優先時間を満たしているかどうかを確認します。
*ets_license パッケージ コードは、ニーズに応じた製品カテゴリのようなものです。
*contact_type 連絡先タイプ、固定選択値 1、2。1 つの電子メール、2 つの携帯電話番号、必要に応じて、ドル側は空にすることができます。
*contact_text 連絡先情報。 contact_type に従って入力します。必要に応じて、ドル側は空にすることができます。
*あなたのニーズに応じてパッケージ価格と製品価格を設定します。
*orderPrice はお客様のニーズに基づいた実際の価格です。
*orderAmount は注文の実際の支払い金額であり、これには手数料がかかります。 //必須フィールド
*orderTime 注文時間。 //必須フィールド
*paySuccess 注文が正常に支払われたかどうか。 // 必須フィールド b *Buysuccess アカウントは成功し、注文の支払い時間はニーズに応じて成功します。 // 必須フィールド 总 *要するに、必須フィールドは注文に関連しています
*Orderid、Orderamount、Ordertime、リクエストに必要なフィールド
Paysuccess、Paytime レスポンスに必要なフィールド
*/
$ Mockorder = ARRRR ay ();) $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';//注文に対して支払われた実際の価格に手数料を加えたもの。 --Necessary
$MockOrder['orderTime'] = '1352338199';// 注文の生成時間。 --Necessary
$MockOrder['paySuccess'] = '0';//注文が正常に支払われたかどうか。 --Necessary
$MockOrder['buySuccess'] = '0';//アカウントが正常に生成されたかどうか
$MockOrder['payTime'] = '0';//注文の支払い時間。--Necessary
//BillRequest は Kuaiqian に必要なパラメータです
$this->view->BillRequest = new Application_Model_BillRequest($MockOrder);
Zend_Debug::dump($this->view- >BillRequest) ;exit;
}
//bgUrl アドレスはここを指します
public function acceptAction()
{
//データベース設計を受信します
/* $MockReceive 配列を使用してシミュレートします
* $MockReceive = array();
* $MockReceive[ 'id'] 主キー;
* $MockReceive['orderId'] 販売者注文番号;
* $MockReceive['receiveTime'] 受付時間;
* $MockReceive['queryString']http_build_encode($_REQUEST);
* $ MockReceive['dealId'] Kuaiqian 取引番号;
* $MockReceive['bankDealId'] 銀行取引番号;
* $MockReceive['payResult'] 処理結果 10: 支払い成功; 11: 支払い失敗;
* $MockReceive[' dealTime'] 高速送金取引時間;
* $MockReceive['payAmount'] 注文の実際の支払い金額;
* $MockReceive['fee'] 料金;
* $MockReceive['errCode'] エラー コード;
* /
/*$_REQUEST は Kuaiqian によって返されたデータです
* version ゲートウェイのバージョン、固定値: v2.0、注文送信時のゲートウェイのバージョン番号と一致します。
* 言語 Web ページに表示される言語タイプ (1 中国語表示) は、注文送信時に Web ページに表示される言語タイプと一致します
* SignType 署名タイプ、4PKI 署名、注文送信時の署名タイプと一致します
* payType 支払い方法、00 all、注文送信時の支払い方法と一致していること
* BankId 銀行コード
* orderId 販売者注文番号、注文送信時の販売者注文番号と一致していること
* orderTime 販売者注文送信時間は、注文が送信されたときの販売者の注文送信時間と一致するようにしてください
* orderAmount は販売者の注文金額であり、注文が送信されたときの販売者の注文金額と一致します。
* dealId ファーストマネー取引番号
* BankDealId 銀行取引番号
ext2 拡張フィールド 2、注文送信時の拡張フィールド 2 と一致
* payResult 処理結果 10: 支払い成功; 11: 支払い失敗
* errCode エラー コード。空であること
* SignMsg 署名文字列
*/
$BillResponse = new Application_Model_BillResponse($_REQUEST);
//$BillResponse->checkSignMsg は、バグなどを防ぐために署名文字列が正しいかどうかを検証します。
if($BillResponse-> ;checkSignMsg){
//注文の支払いが成功したかどうかを判断します
if( $BillResponse->isSuccess){
//Kuaiqian に戻ります。Kuaiqian はリダイレクト URL アドレスに従って新しいページにジャンプします。これが成功ページです。
Return "
1http:/ /99bill/default/index/sucess";exit;
}else{
//Kuaiqian に戻り、Kuaiqian は次の場所にジャンプしますリダイレクト URL アドレスに基づく新しいページ。これは失敗ページです
return "
1http://99bill/default/index/fail";exit;
}
}
//Kuaiqian に戻ります。Kuaiqian はリダイレクト URL アドレスに従って新しいページにジャンプします。これは失敗ページです
return "
1http://99bill/デフォルト/index/fail</redirecturl> "; exit;
modules/default/views/scripts/index/index.phtml
https://www.99bill.com/gateway/recvMerchantInfoAction.htm
复制代代码如下:
BillRequest;?>
<script><br>document.getElementById('kqPay').click();<br></script>
models/BillRequest .php
BillRequest.php
复制代代码如下:
class Application_Model_BillRequest
{
public function __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->payerName= "";
//支払者の連絡先タイプ、1 は電子メールを表します。2 は携帯電話の連絡先を表します。空でも構いません。
$this->payerContactType = "";
//payerContactType 設定に対応する支払者の連絡先情報。payerContactType が 1 の場合は電子メール アドレスを入力し、payerContactType が 2 の場合は携帯電話番号を入力します。空でも構いません。
$this->payerContact = "";
//商品名、空でも構いません。
$this->productName= "TOLPC";
// 製品数量。空でも構いません。
$this->productNum = "1";
//製品コードは空でもかまいません。
$this->productId = $MockOrder['ets_license'];
// 製品の説明。空でも構いません。
$this->productDesc = "";
//支払い方法 (通常は 00) はすべての支払い方法を表します。銀行に直接接続されている販売者の場合、値は 10 で、必須です。 // 空にすることはできません
$this->payType = "00";
// エンコード方式、1 は UTF-8 を表し、2 は GBK を表します。 3 は GB2312 を表します。デフォルトは 1、このパラメータは必須です//空にすることはできません
$this->inputCharset = "1";
//ゲートウェイのバージョン、固定値: v2.0、このパラメータは必須です//空にすることはできませんempty
$this ->version = "v2.0";
//言語タイプ、1 は中国語表示を表し、2 は英語表示を表します。デフォルトは 1 で、このパラメータは必須です//空にすることはできません
$this-> language = "1";
//署名タイプ、値は 4、PKI 暗号化方式を表します、このパラメータは必須です//空にすることはできませんbe empty
$this->signType = "4";
//支払い結果を受け取るページのアドレス。通常、このパラメータは空のままです。
$this->pageUrl = "";
//拡張フィールド 1。販売者は必要なパラメーターを渡すことができ、支払い後に元の値が返されます (空にすることもできます)。
$this->ext1 = $MockOrder['orderId'];
//段落 2 から拡張して、販売者は必要なパラメーターを渡すことができ、支払い後に元の値が返されます (空にすることもできます)。
$this->ext2 = $MockOrder['orderTime'];
//銀行コード。payType が 00 の場合、この値は空でもかまいません。payType が 10 の場合、この値は入力する必要があります。銀行を参照してください。詳細についてはリストをご覧ください。
$this->bankId = "";
//同じ注文の再送信は禁止されています。物理的なショッピング カートには 1 を入力し、仮想商品には 0 を入力します。1 は 1 回のみ送信できることを意味し、0 は送信できることを意味します。支払いが失敗した場合は再提出できます。空でも構いません。
$this->redoFlag = "";
//クイック マネー パートナーの口座番号、つまり販売者番号は空でもかまいません。
$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 as $key){
if(''== $this-> {$key}){Continue;}
$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 暗号化技術
public function 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 ハッシュ暗号化に続いて $priv_key_id 秘密鍵暗号化を使用して、署名文字列 $param を計算します。データ自体は暗号化されません。
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.phpBillResponse.php
コードをコピーします コードは次のとおりです:
class Application_Model_BillResponse
{
/*
* __construct ()コンストラクター
* 19 個のパラメーターと値を生成します。1 つのパラメーターは空の値を持つ可能性があり、$this->errCode の値は空である可能性があります
*/
public function __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 as $key){
$this->{$key} = $response[ $key ];
}
}
/*
* 署名文字列を確認します
* Kuaiqian によって返される署名文字列は $this->signMsg です
* Base64 を使用して前の文字列をデコードします
* Kuaiqian によって指定されたパブリック アドレスを確認します鍵の検証
* Kuaiqian は秘密鍵暗号化を使用して $this->signMsg を生成しました
* Kuaiqian は秘密鍵に対応する公開鍵を私たちに提供し、私たちはこの公開鍵を使用して検証しました。成功の場合は 1、失敗の場合は 0、エラーの場合は -1。
*/
public function checkSignMsg(){
$KeyOrders = array('merchantAcctId','version',' language','signType','payType','bankId','orderId','orderTime','orderAmount ',
'dealId','bankDealId','dealTime','payAmount','fee','ext1','ext2','payResult','errCode',);
foreach($KeyOrders as $key) {
if(''==$this->{$key}){Continue;}
$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); }
public function isSuccess(){
//$this->payResult は成功した場合は 10、失敗した場合は 11 です
return '10'==$this->payResult;
}
public function getOrderId(){
return str_replace ( 'XXX', '', $this->orderId);
}
}
公開鍵と秘密鍵が必要です。これはペアではありません
両方とも半分です
99bill-rsa.cer
99bill-rsa.pem
http://www.bkjia.com/PHPjc/327972.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/327972.html技術記事このプロジェクトでは、zend フレームワーク フレームワークを使用して modules/default/controllers/IndexController.php IndexController.php を実装します。 ?php class IndexController extends Zend_Con...