简体   繁体   English

如何执行HTTP POST并从POST结果重定向到外部站点?

[英]How to perform HTTP POST and redirect to external site from the POST result?

So I can do the following POST submit and get redirected to the payment gateway site 因此,我可以执行以下POST提交并重定向到付款网关站点

@Html.BeginForm(null, null, FormMethod.Post, new { @action = "https://l33tpaymentgateway.com" })
{
    <input id="RefNo" name="RefNo" type="hidden" value="ABCDE" />
    <input id="Amount" name="Amount" type="hidden" value="300" />
    <input id="UserEmail" name="UserEmail" type="hidden" value="warheat1990@warheat1990.com" />
    <input id="Signature" name="Signature" type="hidden" value="1234567890" />
    <input id="ResponseURL" name="ResponseURL" type="hidden" value="http://warheat1990.com" />

    <input type="submit" value="submit"/>
}

Doing the above on user page is a bad idea (the data can be tampered with), I tried to do this on the server side instead. 在用户页面上执行上述操作不是一个好主意(数据可能会被篡改),我尝试在服务器端执行此操作。 But I have no idea how to redirect the user. 但是我不知道如何重定向用户。

public ActionResult SubmitPayment()
{
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://l33tpaymentgateway.com");
            var content = new FormUrlEncodedContent(new[] 
            {
                new KeyValuePair<string, string>("RefNo", "ABCDE"),
                new KeyValuePair<string, string>("Amount", "300"),
                new KeyValuePair<string, string>("UserEmail", "warheat1990@warheat1990.com"),
                new KeyValuePair<string, string>("Signature", "1234567890"),
                new KeyValuePair<string, string>("ResponseURL", "http://warheat1990.com")
            });
            var result = await client.PostAsync("", content).Result;
            if(result.IsSuccessStatusCode)
            {
                //redirect user, but I have no idea how               
            }
        }
}

Any help will be appreciated. 任何帮助将不胜感激。

EDIT : THE DOCUMENTATION 编辑:文档

Step 1. Merchant sends HTTPs Post Request containing payment details to l33tpaymentgateway
OPSG payment page. Payment Details contain the following fields:
• MerchantCode
• PaymentId
• RefNo
• Amount
• Currency
• ProdDesc
• UserName
• UserEmail
• UserContact
• Remark
• Signature (refer to 3.1)
• ResponseURL
• BackendURL
Step 2. User views and confirms payment details entered in Step 1. For credit card
payment, the user will need to key-in credit card information.
Step 3. User continues to fill in Username and Password at bank website (for non
credit card payment)
Step 4. User selects the account to debit the payment. (for non credit card payment)
Step 5. User confirms the payment. If yes, go to next step. (for non credit card
payment)
Step 6. User views and prints the payment detail. (for non credit card payment)
Step 7. Response is returned to the l33tpaymentgateway OPSG website indicating a successful or
failed transaction.
Step 8. l33tpaymentgateway OPSG response back the payment status to merchant with a
signature
Step 9. For successful payment transaction, the merchant needs to compare the
signature from l33tpaymentgateway OPSG. Refer to (3.2)

HTTP POST example from the documentation which is a big NO in my opinion from security standpoint. 来自文档的HTTP POST示例,从安全角度来看,我认为这是一个很大的问题。

<HTML>
    <BODY>
        <FORM method="post" name="ePayment" action="https://l33tpaymentgateway.com">
            <INPUT type="hidden" name="MerchantCode" value="ID00001">
            <INPUT type="hidden" name="PaymentId" value="1">
            <INPUT type="hidden" name="RefNo" value="A00000001">
            <INPUT type="hidden" name="Amount" value="300">
            <INPUT type="hidden" name="Currency" value="USD">
            <INPUT type="hidden" name="ProdDesc" value="Photo Print">
            <INPUT type="hidden" name="UserName" value="John Tan">
            <INPUT type="hidden" name="UserEmail" value="john@hotmail.com">
            <INPUT type="hidden" name="UserContact" value="0126500100">
            <INPUT type="hidden" name="Remark" value="">
            <INPUT type="hidden" name="Lang" value="UTF-8">
            <INPUT type="hidden" name="Signature" value="Q/iIMzpjZCrhJ2Yt2dor1PaFEFI=">
            <INPUT type="hidden" name="ResponseURL" value="http://www.test.com/payment/response.asp">
            <INPUT type="hidden" name="BackendURL" value="http://www.test.com/payment/backend_response.asp">
            <INPUT type="submit" value="Proceed with Payment" name="Submit">
        </FORM>
    </BODY>
</HTML>

Signature generate : 签名生成:

private string ComputeHash(string Key)
{
    SHA1CryptoServiceProvider objSHA1 = new SHA1CryptoServiceProvider();

    objSHA1.ComputeHash(System.Text.Encoding.UTF8.GetBytes(Key.ToCharArray));

    byte[] buffer = objSHA1.Hash;
    string HashValue = System.Convert.ToBase64String(buffer);

    return HashValue;
}

where Key is a combination of MerchantKey (similar to private key) + Merchant Code + RefNo + Amount 其中密钥是MerchantKey(类似于私钥)+商户代码+ RefNo +金额的组合

Updated your code below: 在下面更新了您的代码:

public ActionResult SubmitPayment()
    {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri("https://l33tpaymentgateway.com");
                var content = new FormUrlEncodedContent(new[] 
                {
                    new KeyValuePair<string, string>("RefNo", "ABCDE"),
                    new KeyValuePair<string, string>("Amount", "300"),
                    new KeyValuePair<string, string>("UserEmail", "warheat1990@warheat1990.com"),
                    new KeyValuePair<string, string>("Signature", "1234567890"),
                    new KeyValuePair<string, string>("ResponseURL", "http://warheat1990.com")
                });
                var result = await client.PostAsync("", content).Result;
                if(result.IsSuccessStatusCode)
                {
                    return Redirect(result.url);            
                }
            }
    }

I'm not sure what the result object is. 我不确定结果对象是什么。 But put into the parameter of the Redirect method the url to redirect to. 但是将要重定向到的URL放入Redirect方法的参数中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何执行HTTP POST并将用户重定向到外部站点? - How to perform an HTTP POST and redirect the user to an external site? 如何将数据发布到外部站点并从控制器的动作ASP .Net MVC获取外部站点的动作结果? - How to post data to external site and get external site's action result from my controller's action ASP .Net MVC? 重定向到外部URL发布 - Redirect to external URL Post 如何使用控制器中的POST参数重定向到外部URL - How to redirect to an external URL with POST parameters in a controller 如何发布数据并重定向到外部页面? - How to post data and redirect to an external page? 如何用Java对HTTP POST请求反序列化XML结果? - How to deserialize XML result from a HTTP POST request in Java? 是否可以在服务器端对外部 HTTPS url 执行 POST 并将用户重定向到 POST 目的地? - Is it possible to perform POST to external HTTPS url on server side and redirect user to the POST destination? MVC 5从外部站点发布JSON并返回包含数据的视图 - MVC 5 post JSON from an external site and return view with data 如何从ASP.Net发布然后重定向到外部URL? - How Do I Post and then redirect to an external URL from ASP.Net? 来自背后代码的HTTP POST重定向c# - HTTP POST Redirect from Behind code c#
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM