如何从 IPN 加密货币获得响应
How to get response from IPN cryptocurrencies
我们正在尝试使用硬币支付 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);
}
您不能使用 localhost 进行 IPN 回调。您必须使用 public 域名。
例如,我将更改以下参数:
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 API and Instant Payment Notifications (IPN) 上的文档中的说明正确实施它。
我测试了你的success_url端点,得到状态码:100(输入status:100 ).我看到您使用了表单数据,但我不知道这是不是故意的/必需的。
邮递员[=30=] 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
正如@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_url
和 cancel_url
用于用户重定向,你不会在那里得到任何响应代码,检查 seller's store
URL 给出与你拥有的完全相同的 URL虽然一直在通过,因此建议为每个订单使用唯一的 URLs(即最后将订单 ID 添加到 URL),这将使您了解哪个订单付款已完成或已取消。
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
方法中获得所有状态代码响应。
希望对您有所帮助!
我们正在尝试使用硬币支付 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);
}
您不能使用 localhost 进行 IPN 回调。您必须使用 public 域名。
例如,我将更改以下参数:
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 API and Instant Payment Notifications (IPN) 上的文档中的说明正确实施它。
我测试了你的success_url端点,得到状态码:100(输入status:100 ).我看到您使用了表单数据,但我不知道这是不是故意的/必需的。
邮递员[=30=] 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
正如@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_url
和 cancel_url
用于用户重定向,你不会在那里得到任何响应代码,检查 seller's store
URL 给出与你拥有的完全相同的 URL虽然一直在通过,因此建议为每个订单使用唯一的 URLs(即最后将订单 ID 添加到 URL),这将使您了解哪个订单付款已完成或已取消。
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
方法中获得所有状态代码响应。
希望对您有所帮助!