parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

для начала

agat 20.05.2008 14:02 / 20.05.2008 22:18

советую всем интересующимся данным вопросом ознакомится с принципами работы схемы.

http://www.ecommerce.upc.ua/site/e-shop.html - тут общие принципы, http://www.ecommerce.upc.ua/site/docs.html - тут в четырех пдф-ках описано детальнее и более чем доступно.

Просмотрел свой код, там все не так просто, и сразу можно и не понять. Короче вот ключевые моменты:
################################################
@payByCreditCard[hParams][dPurchaseTime;sTotalAmount;sAltTotalAmount;sSD;sDataToSign]
^use[OpenSSL.p]
$oSSL[^OpenSSL::create[
	$.sOpensslScript[/cgi-bin/openssl/openssl.exe]
	$.sServerCert[/data/openssl/test-server.pub]
	$.sUserCert[/data/openssl/1752144.pem]
]]
^if(def $hParams.orderID){
	$sImage[^image[
		$.src[$MEDIA_DIR/loading.gif]
		$.border[0]
		$.align[left]
		$.hspace[15]
	]]
	^switch[$oSite.language.uri]{
		^case[ru]{<h3>Устанавливается соединение с процессинговым центром</h3><br />$sImage Пожалуйста, подождите...}
		^case[en]{<h3>Connecting to the processing center</h3><br />$sImage Please wait...}
		^case[tr]{<h3>&#304;&#351;lem merkezine ba&#287;lan&#305;yor</h3><br />$sImage L&#252;tfen bekleyin...}
	}
	^try{
		$tUPC[^table::load[/data/upc.cfg]]
	}{
		$exception.handled(1)
		^Lib:location[/404/]
	}
	$dPurchaseTime[^dtf:format[%y%m%d%H%M%S]]
	$sTotalAmount[^eval($hParams.totalAmount*100)]
	$sAltTotalAmount[^eval($hParams.altTotalAmount*100)]
	$sSD[]
	$sDataToSign[$tUPC.MerchantID^;$tUPC.TerminalID^;$dPurchaseTime^;$hParams.orderID^;$tUPC.Currency,$tUPC.AltCurrency^;$sTotalAmount,$sAltTotalAmount^;$sSD^;]
	<form name="UPCform" method="post" action="https://secure.upc.ua/ecgtest/enter">
	<input type="hidden" name="Version" value="1" />
	<input type="hidden" name="MerchantID" value="$tUPC.MerchantID" />
	<input type="hidden" name="locale" value="^switch[$oSite.language.uri]{^case[ru]{ru}^case[en;tr]{en}}" />
	<input type="hidden" name="TerminalID" value="$tUPC.TerminalID" />
	<input type="hidden" name="TotalAmount" value="$sTotalAmount" />
	<input type="hidden" name="Currency" value="$tUPC.Currency" />
	<input type="hidden" name="AltTotalAmount" value="$sAltTotalAmount" />
	<input type="hidden" name="AltCurrency" value="$tUPC.AltCurrency" />
	<input type="hidden" name="OrderID" value="$hParams.orderID" />
	<input type="hidden" name="PurchaseTime" value="$dPurchaseTime" />
	<input type="hidden" name="PurchaseDesc" value="$hParams.sPurchaseDesc" />
	<input type="hidden" name="Signature" value="^oSSL.sign[$sDataToSign]" />
	<script language="javascript">
	<!--
		document.UPCform.submit()^;
	// -->
	</script>
	<noscript>
		<input type="submit" value="^Say:next[]" />
	</noscript>
	</form>
}{
	^Lib:location[/404/]
}
# end of @payByCreditCard[]
дальше идет класс операций
@CLASS
OpenSSL

################################################
@create[hParams]
$OPENSSL_SCRIPT[$hParams.sOpensslScript]
$SERVER_CERT[${env:DOCUMENT_ROOT}$hParams.sServerCert]
$USER_CERT[${env:DOCUMENT_ROOT}$hParams.sUserCert]
$DATA_DIR[${env:DOCUMENT_ROOT}/data/temp]
# end of @create[]

################################################
@sign[sData][sDataName;fResult;fSign]
$sDataName[^math:uuid[]]
$sSignName[^math:uuid[]]
^sData.save[$DATA_DIR/$sDataName]
$fResult[^file::exec[$OPENSSL_SCRIPT dgst -sha1 -out $DATA_DIR/$sSignName -sign $USER_CERT $DATA_DIR/$sDataName]]
$fSign[^file::load[binary;$DATA_DIR/$sSignName]]
$result[^fSign.base64[]]
^if(-f "$DATA_DIR/$sDataName"){
	^file:delete[$DATA_DIR/$sDataName]
}
^if(-f "$DATA_DIR/$sSignName"){
	^file:delete[$DATA_DIR/$sSignName]
}
# end of @sign[]

################################################
@signed[hParams][sDataName;sSignName;fResult;fSignature]
$result(0)
^if(def $hParams.data && def $hParams.signature){
	$sDataName[^math:uuid[]]
	$sSignName[^math:uuid[]]
	$fSignature[^file::base64[$hParams.signature]]
	^hParams.data.save[$DATA_DIR/$sDataName]
	^fSignature.save[binary;$DATA_DIR/$sSignName]
	$fResult[^file::exec[$OPENSSL_SCRIPT dgst -sha1 -verify $SERVER_CERT -signature $DATA_DIR/$sSignName $DATA_DIR/$sDataName]]
	^if(^fResult.text.match[Verified OK]){
		$result(1)
	}
	^if(-f "$DATA_DIR/$sDataName"){
		^file:delete[$DATA_DIR/$sDataName]
	}
	^if(-f "$DATA_DIR/$sSignName"){
		^file:delete[$DATA_DIR/$sSignName]
	}
}
# end of @signed[]

################################################
@selfSigned[hParams][sDataName;sSignName;fResult;fSignature]
$result(0)
$sDataName[^math:uuid[]]
$sSignName[^math:uuid[]]
$fSignature[^file::base64[$hParams.signature]]
^hParams.data.save[$DATA_DIR/$sDataName]
^fSignature.save[binary;$DATA_DIR/$sSignName]
$fResult[^file::exec[$OPENSSL_SCRIPT dgst -sha1 -prverify $USER_CERT -signature $DATA_DIR/$sSignName $DATA_DIR/$sDataName]]
^if(^fResult.text.match[Verified OK]){
	$result(1)
}
^if(-f "$DATA_DIR/$sDataName"){
	^file:delete[$DATA_DIR/$sDataName]
}
^if(-f "$DATA_DIR/$sSignName"){
	^file:delete[$DATA_DIR/$sSignName]
}
# end of @selfSigned[]
для работы моей системы нужен OpenSSL последней версии, ну и пара сертификатов - свой для подписывания отправляемых данных, и второй - сертификат процессингового центра. Им мы проверяем подпись пришедших данных.