Wordpress Datatrans Ajax 实现
Posted
技术标签:
【中文标题】Wordpress Datatrans Ajax 实现【英文标题】:Wordpress Datatrans Ajax implementation 【发布时间】:2012-10-14 14:05:24 【问题描述】:我正在尝试在基于 wordpress 的网站中实施信用卡支付服务(datatrans.ch)。 Datatrans 提供了一个 Ajax API,您可以在这里查看:
Datatrans Ajax API
Example Code
我复制/粘贴了示例代码并将其保存在我机器上的 html 文件中。运行它可以正常工作。在下一步中,我尝试通过创建以下函数在 wordpress 中实现它:
function datatrans_payment_ajax($lang, $currency, $amount)
$merchant_id = 101...; // ... on my machine it is numeric of course ;)
wp_deregister_script('datatrans-ajax');
wp_register_script('datatrans-ajax', 'https://pilot.datatrans.biz/upp/ajax/api.js?merchantId='.$merchant_id, false);
wp_enqueue_script('datatrans-ajax');
?>
<noscript>
<p class="err">
javascript is disabled in your browser.<br/>
This showcase requires JavaScript.
</p>
</noscript>
<div>
<h3>Step 1: Ajax UPP.paymentRequest(...)</h3>
<form id="uppform">
<fieldset>
<input type="hidden" name="language" value="<?php echo $lang; ?>"/>
<table cellspacing="0" cellpadding="3" >
<tr>
<td align="left">Merchant Id :</td>
<td style="width: 10px"> </td>
<td align="left"><input type="text" size="20" name="merchantId" value="<?php echo $merchant_id; ?>"/>
</td>
</tr>
<tr>
<td align="left">Amount :</td>
<td> </td>
<td align="left"><input type="text" size="20" name="amount" value="<?php echo $amount; ?>"/> (= 10.00)
</td>
</tr>
<tr>
<td align="left">Currency :</td>
<td> </td>
<td align="left"><input type="text" size="20" name="currency" value="<?php echo $currency; ?>"/>
</td>
</tr>
<tr>
<td colspan="3"> </td>
</tr>
<tr>
<td align="left">Card Number :</td>
<td> </td>
<td align="left"><input type="text" size="24" name="cardNumber" value="4242424242424242"/>
</td>
</tr>
<tr>
<td align="left">Expiry :</td>
<td> </td>
<td align="left">
<input type="text" size="4" name="expm" value="12"/>
<input type="text" size="4" name="expy" value="15"/> (MM/YY)
</td>
</tr>
<tr>
<td align="left">CVV code :</td>
<td> </td>
<td align="left"><input type="text" size="4" name="cvv" value="123"/>
</td>
</tr>
<tr style="display: none;">
<td align="left">Process mode :</td>
<td> </td>
<td align="left">
<input type="radio" name="mode" id="auto" value="auto" checked="checked"/> <label for="auto">Automatic 3D ACS call using API</label>
<br/>
<input type="radio" name="mode" id="manual" value="manual"/> <label for="manual">Manual redirection to 3D ACS</label>
</td>
</tr>
<tr>
<td colspan="3"> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td align="left"><input type="button" class="button"
onclick="callPayment()" value="send"/><span class="buttend"></span>
</td>
</tr>
</table>
</fieldset>
</form>
<div id="frameHolder"></div>
<div id="response" style="width: 400px;"></div>
<div id="step2" style="display: none;">
<h3>Step 2: XML authorizeSplit (server-2-server request)</h3>
<form action="https://pilot.datatrans.biz/upp/jsp/XML_authorizeSplitEx.jsp" method="post" target="_parent">
<fieldset>
<textarea style="width: 400px; height: 150px;" name="xmlRequest"></textarea>
<div>
<input type="submit" class="button" value="send"/><span class="buttend"></span>
</div>
</fieldset>
</form>
</div>
<script type="text/javascript">
var mode;
var params;
function callPayment()
mode = $("input[name=mode]:checked").val();
// read form values
params =
merchantId: $("input[name=merchantId]").val(),
cardNumber: $("input[name=cardNumber]").val(),
expy: $("input[name=expy]").val(),
expm: $("input[name=expm]").val(),
cvv: $("input[name=cvv]").val(),
currency: $("input[name=currency]").val(),
amount: $("input[name=amount]").val()
// call paymentRequest, response will be received in responseCallback
if ( mode == "auto" )
params.returnUrl = "https://pilot.datatrans.biz/upp/ajax/sample-merchant-return-page.html";
UPP.paymentRequest( params, responseCallback, frameCallback );
else
if ( mode == "manual" )
UPP.paymentRequest( params, responseCallback );
;
function frameCallback()
// create iframe and add it to document
var iframe = $("<iframe/>").attr( "id", "paymentIFrame" ).width( 390 ).height( 400 );
$("#frameHolder").append( iframe );
$("form#uppform").hide(); //hide the form
return iframe[0];
;
function responseCallback( response )
var responseElm = $("#response");
responseElm
.empty()
.append( "<h4>Ajax response:</h4>")
.append( $("<div/>").text("status: " + response.status) )
.append( $("<div/>").text("uppTransactionId: " + response.uppTransactionId) );
if ( JSON.stringify )
responseElm
.append( $("<div/>").html( "Complete JSON response: " + JSON.stringify( response ).replace( /,/g, ", ") ) )
if ( mode == "auto" )
if ( response.status == "success" )
// This step will be done server-2-server
$("#step2 textarea").val(
"<<?php?>?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
"<authorizationSplit version=\"1\">\n" +
"<body merchantId=\"" + $("input[name=merchantId]").val() + "\">\n" +
"<transaction refno=\"to_be_filled\">\n" +
" <request>\n" +
" <uppTransactionId>" + response.uppTransactionId + "</uppTransactionId>\n" +
" <amount>" + $("input[name=amount]").val() + "</amount>\n" +
" <currency>" + $("input[name=currency]").val() + "</currency>\n" +
" </request>\n" +
" </transaction>\n" +
"</body>\n" +
"</authorizationSplit>"
);
$("#step2").show();
$("#uppform").hide();
if ( response.is3DEnrolled ) // close/remove the iframe
$("#paymentIFrame").remove();
else
if ( mode == "manual" ) // manual mode used, browser has to be redirected to ACSURL
if ( response.is3DEnrolled && response.status == "success" )
responseElm.append( $("<div/>").html( "Redirecting page to ACS in 3 seconds..." ) );
setTimeout( function()
params.uppTransactionId = response.uppTransactionId;
params.errorUrl = "https://pilot.datatrans.biz/upp/merchant/errorPage.jsp";
params.returnUrl = "https://pilot.datatrans.biz/upp/merchant/successPage.jsp";
window.parent.location = response.ACSURL + "?" + $.param( params );
, 3000 );
;
</script>
</div>
当我运行它时,我收到一个错误状态代码 1003,表示 uppTransactionId 未定义,这应该是 responseCallback 的结果。所以我想这与wordpress中通常处理的Ajax调用有关,它必须通过wp-admin文件夹中的admin-ajax.php文件!?我不知道如何将这个数据传输实现切成小块以使其适合 wordpress Ajax 处理。此外,我想知道您是否认为我对导致错误的原因的猜测是否正确?
提前致谢。
干杯, 蒂姆
【问题讨论】:
Dragi Postolovski 发布了一个 Answer 说“我认为这可以帮助您解决问题。它向您展示了如何创建测试帐户以及如何使用 API。https://projectsengine.com/datatrans-payments-apis-developers-manual-in-php/” 【参考方案1】:请他们为您开设测试帐户,然后您可以使用您的 MerchantID 在具有所有功能的试点服务器上进行测试。如果您从他们的示例中复制/粘贴代码,我认为这将不起作用。这些只是实施示例。
您可以尝试使用Merchant-ID:1000011011
,但这是所有用户共享的,因此您无法设置登陆重定向页面(成功时,错误时)
还要检查您使用的编码:
UTF-8 编码:/jsp/upStart.jsp ISO 编码:/jsp/upStartIso.jsp最常见的错误是价格格式,如果您的价格是 15.25,您需要发送 1525。 此外,如果您希望使用 3D 安全,您需要在数据传输后端激活它。
【讨论】:
以上是关于Wordpress Datatrans Ajax 实现的主要内容,如果未能解决你的问题,请参考以下文章
wordpress 加 ajax 使用 admin-ajax