如何获得IPN加密货币的响应

时间:2018-09-02 17:30:56

标签: c# asp.net-mvc payment-gateway payment

我们正在尝试使用硬币支付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());
} 

这将重定向到硬币支付站点,完成付款后,将显示以下屏幕。

enter image description here

当用户单击返回卖方站点时尝试获取数据时,我尝试使用Request.Form获取数据,但未从表单中获取任何价值。

使用this woocommerce code时也是如此,但是我不了解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);
}

2 个答案:

答案 0 :(得分:7)

您不能将本地主机用于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()

由于您正在创建自己的网关,因此还需要按照CoinPayments APIInstant Payment Notifications (IPN)文档中的描述正确实施它。

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

邮递员 POST http://kugugshivom-001-site1.atempurl.com/Home/SuccessResponse Body 标签中,使用 Bulk Edit 值选择表单数据:

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

答案 1 :(得分:4)

作为@Gillsoft AB声明的更新答案,您应该需要从代码端使用有效的IPN URL。而且webhook不适用于localhost。因此,您应该在实时服务器上监听请求。

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

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

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

确保您理解正确! success_urlcancel_url用于用户重定向,您将不会在那获得任何响应代码,对seller's store URL的检查可以提供与您传递的完全相同的URL,因此建议为每个订单使用唯一的URL(即最后在URL中添加订单ID),这将使您了解已完成或取消了哪个订单付款。

http://localhost:49725/home/SuccessResponse?orderid=123

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

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(""); 
} 

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());
}

您将以IPNHandler方法获得所有状态码响应。

希望这会有所帮助!