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">&nbsp;</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>&nbsp;</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>&nbsp;</td>
                <td align="left"><input type="text" size="20" name="currency" value="<?php echo $currency; ?>"/>
                </td>
            </tr>

            <tr>
                <td colspan="3">&nbsp;</td>
            </tr>

            <tr>
                <td align="left">Card Number :</td>
                <td>&nbsp;</td>
                <td align="left"><input type="text" size="24" name="cardNumber" value="4242424242424242"/>
                </td>
            </tr>

            <tr>
                <td align="left">Expiry :</td>
                <td>&nbsp;</td>
                <td align="left">
                    <input type="text" size="4" name="expm" value="12"/>&nbsp; 
                    <input type="text" size="4" name="expy" value="15"/>&nbsp; (MM/YY) 
                </td>
            </tr>

            <tr>
                <td align="left">CVV code :</td>
                <td>&nbsp;</td>
                <td align="left"><input type="text" size="4" name="cvv" value="123"/>&nbsp; 
                </td>
            </tr>

            <tr style="display: none;">
                <td align="left">Process mode :</td>
                <td>&nbsp;</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">&nbsp;</td>
            </tr>

            <tr>
                <td>&nbsp;</td>
                <td>&nbsp;</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请求

wordpress 加 ajax 使用 admin-ajax

是 WordPress 中的 Ajax

使用 Ajax 退出 Wordpress

wordpress 中的 Ajax 调用不适用于前端站点的订阅者用户

在 wordpress 插件下未调用 Ajax 功能