【问题标题】:How to get response from IPN cryptocurrencies如何从 IPN 加密货币中获得响应
【发布时间】:2019-02-07 21:40:08
【问题描述】:

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

这将被重定向到投币支付网站,一旦支付完成,它会显示以下屏幕。

当用户点击返回卖家网站时尝试获取数据,我尝试使用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);
}

【问题讨论】:

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


    【解决方案1】:

    您不能将 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()
    

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

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

    邮递员 POST http://kugugshivom-001-site1.atempurl.com/Home/SuccessResponseBody 选项卡中,使用 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
    

    【讨论】:

    • 是的,差不多就是这个。 Localhost 是一个相对 url,从他们的最后它可能会尝试调用他们输入的 url,但没有响应。为了测试,OP 可以公开 https 端口,通过 IIS 托管应用程序,然后通过其路由器端口转发本地 ip 来完成此操作。
    • SuccessResponse 方法在用户点击返回卖家商店时被调用,那么我还需要托管我的应用程序吗?
    • 好的,试试看
    • 感谢@GillsoftAB,但似乎他们不提供对 .net 的支持
    • 是的@GillsoftAB,我认为smarterasp.net 会起作用,但让我试试。这里的问题是需要使用https 代替吗?并且当您在ipn_url 中进行更改时,将在成功SuccessResponse 或其他情况下调用哪个方法?
    【解决方案2】:

    正如@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订单(即最后在 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 方法中获得所有状态码响应。

    希望这会有所帮助!

    【讨论】:

    • 您链接的 Webhook 测试人员为我节省了一天...谢谢!
    猜你喜欢
    • 2012-10-31
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2021-10-18
    • 2022-01-15
    • 2012-03-13
    • 2022-06-23
    相关资源
    最近更新 更多