如何从IPN加密货币获得回应

Hin*_*man 12 c# asp.net-mvc payment payment-gateway

我们正在尝试使用moneypayment IPN接收使用加密货币的付款.我们可以创建请求并能够进行付款.但是,当用户回到卖方时,无法获得成功或失败响应.

以下是付款请求的创建方式:

public ActionResult IPN()
{                        

    var uri = new UriBuilder("https://www.coinpayments.net/index.php");
    uri.SetQueryParam("cmd", "_pay_auto"); 
    uri.SetQueryParam("merchant", "merchant_key");
    uri.SetQueryParam("allow_extra", "0");
    uri.SetQueryParam("currency", "USD"); 
    uri.SetQueryParam("reset", "1");
    uri.SetQueryParam("success_url", "http://localhost:49725/home/SuccessResponse"); //todo: redirect to confirm success page
    uri.SetQueryParam("key", "wc_order_5b7b84b91a882");
    uri.SetQueryParam("cancel_url", "http://localhost:49725/home/FailiureResponse");
    uri.SetQueryParam("order_id", "36");
    uri.SetQueryParam("invoice", "PREFIX-36");
    uri.SetQueryParam("ipn_url", "http://localhost:49725/?wc-api=WC_Gateway_Coinpayments");
    uri.SetQueryParam("first_name", "John");
    uri.SetQueryParam("last_name", "Smith");
    uri.SetQueryParam("email", "a@a.com");
    uri.SetQueryParam("want_shipping", "1");
    uri.SetQueryParam("address1", "228 Park Ave S&address2");
    uri.SetQueryParam("city", "New York");
    uri.SetQueryParam("state", "NY");
    uri.SetQueryParam("zip", "10003-1502");
    uri.SetQueryParam("country", "US");
    uri.SetQueryParam("item_name", "Order 33");
    uri.SetQueryParam("quantity", "1");
    uri.SetQueryParam("amountf", "100.00000000");
    uri.SetQueryParam("shippingf", "0.00000000");            

    return Redirect(uri.ToString());
} 
Run Code Online (Sandbox Code Playgroud)

这将被重定向到coinpayment网站,一旦付款完成,它将显示以下屏幕.

在此输入图像描述

当用户点击回到卖家网站时试图获取数据,我试图使用数据Request.Form,但没有获得任何形式的价值.

同样的事情,使用这个woocommerce代码,但我不知道PHP以及他们如何处理它.

有没有想过获得IPN回应?

注意:.NET中没有可用于IPN的开发文档或示例代码

编辑 我正试图从IPN成功中获得价值

Public ActionResult SuccessResponse()
{
    var ipn_version = Request.Form["ipn_version"];
    var ipn_id = Request.Form["ipn_id"];
    var ipn_mode = Request.Form["ipn_mode"];
    var merchant = Request.Form["merchant"];
    var txn_id = Request.Form["txn_id"];
    var status = Request.Form["status"];

    return Content(status);
}
Run Code Online (Sandbox Code Playgroud)

Gil*_* AB 7

您不能使用localhost进行IPN回调.您必须使用公共域名.

作为示例,我将更改以下参数:

var uri = new UriBuilder("https://www.coinpayments.net/api.php"); 
uri.SetQueryParam("success_url", "http://kugugshivom-001-site1.atempurl.com/Home/SuccessResponse");
uri.SetQueryParam("cancel_url", "http://kugugshivom-001-site1.atempurl.com/Home/FailiureResponse");
uri.SetQueryParam("ipn_url", "http://kugugshivom-001-site1.atempurl.com/Home/CoinPaymentsIPN"); // Public ActionResult CoinPaymentsIPN()
Run Code Online (Sandbox Code Playgroud)

由于您要创建自己的网关,因此还需要按照CoinPayments API即时支付通知(IPN)文档中的说明正确实施.

我测试了你的success_url端点,并获得了状态代码:100(输入状态时为100).我看到你使用表单数据,但我不知道是否有意/需要.

Postman POST http://kugugshivom-001-site1.atempurl.com/Home/SuccessResponseBody选项卡表单中 - 使用批量编辑值选择数据:

ipn_version:1.0
ipn_type:api
ipn_mode:hmac
ipn_id:your_ipn_id
merchant:your_merchant_id
txn_id:your_transaction_id
status:100
Run Code Online (Sandbox Code Playgroud)


Div*_*Div 5

正如@Gillsoft AB 所述的更新答案,您应该需要使用代码端的有效 IPN URL。webhook 也不适用于本地主机。因此,您应该使用实时服务器侦听请求。

检查 webhook 响应的最简单方法是使用Webhook Tester等在线工具,它会提供一个 URL,您必须将其设置为您的 IPN URL,无论何时服务器发送数据,您都可以简单地在网络上看到它。要检查这一点,请创建一个 URL 并将其设置为您的 IPN URL,如下所示:

 uri.SetQueryParam("ipn_url", "https://webhook.site/#/457f5c55-c9ce-4db4-8f57-20194c17d0ae");
Run Code Online (Sandbox Code Playgroud)

在从本地机器运行支付周期之后,支付服务器将向该 IPN URL 发送通知。

确保你理解正确!success_url并且cancel_url用于用户重定向,您不会在那里得到任何响应代码,检查seller's storeURL 会给出与您传递的完全相同的 URL,因此建议为每个订单使用唯一的 URL(即最后添加订单 ID 到URL),它会让您知道哪些订单付款已完成或取消。

http://localhost:49725/home/SuccessResponse?orderid=123
Run Code Online (Sandbox Code Playgroud)

为了测试您的本地代码,添加以下更改并将其部署到服务器。

1) 添加一种新的方法来监听 IPN 响应

[ValidateInput(false)]
public ActionResult IPNHandler()
{
    byte[] param = Request.BinaryRead(Request.ContentLength);
    string strRequest = Encoding.ASCII.GetString(param);

    //TODO: print string request 

    //nothing should be rendered to visitor
    return Content(""); 
} 
Run Code Online (Sandbox Code Playgroud)

2)在创建请求时传递IPN URL:

public ActionResult IPN()
{                        
    var uri = new UriBuilder("https://www.coinpayments.net/index.php");
    ...
    ..
    uri.SetQueryParam("success_url", "http://localhost:49725/home/SuccessResponse"); 
    uri.SetQueryParam("cancel_url", "http://localhost:49725/home/FailiureResponse");    
    uri.SetQueryParam("ipn_url", "http://localhost:49725/home/IPNHandler");
    ....
    ..
    return Redirect(uri.ToString());
}
Run Code Online (Sandbox Code Playgroud)

您将在IPNHandler方法中获得所有状态代码响应。

希望这可以帮助!