Как получить ответ от криптовалютов IPN
Мы пытаемся получить платеж с использованием криптово-кредитов, используя IP-адрес монеты. Мы можем создать запрос и выполнить платеж. Тем не менее, они не могут получить успех или неудачный ответ, когда пользователь возвращается к стороне продавца.
Вот как создается запрос на оплату:
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", "[email protected]");
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
, но не получал никакого значения в форме.
То же самое, работая с этим кодом woocommerce, но я понятия не имею о PHP и о том, как они с этим справляются.
Любая мысль получить ответ IPN?
Примечание. Для IPN в.NET отсутствует документация по разработке или образец кода.
Редактировать Я пытаюсь получить ценность от успеха 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);
}
Ответы
Ответ 1
В обновленном ответе, указанном @Gillsoft AB, вам нужно использовать правильный URL IPN с конца кода. Также webhook не будет работать с localhost. таким образом, вы должны прослушивать запрос с помощью живого сервера.
Самый простой способ проверить ответ веб-камеры - использовать онлайн-инструмент, такой как Webhook Tester, он предоставит URL-адрес, который вы должны установить в качестве URL-адреса IPN, всякий раз, когда сервер будет отправлять данные, вы можете просто увидеть его в Интернете. Чтобы проверить это, создайте один URL-адрес и задайте его как URL-адрес IPN, как показано ниже:
uri.SetQueryParam("ipn_url", "https://webhook.site/#/457f5c55-c9ce-4db4-8f57-20194c17d0ae");
После этого запускается цикл платежей с локального компьютера, сервер платежей отправляет уведомление этому URL-адресу IPN.
Убедитесь, что вы поняли это правильно! success_url
и cancel_url
предназначены для перенаправления пользователей, вы не получите код ответа, проверка URL-адреса seller store
дает ваш точный URL-адрес, который вы проходили, поэтому рекомендуется использовать уникальные URL-адреса для каждого заказа (т.е. добавить заказ 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) Передайте URL-адрес IPN при создании запроса:
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
.
Надеюсь это поможет!
Ответ 2
Вы не можете использовать 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 API и мгновенных платежных уведомлениях (IPN).
Я проверил вашу конечную точку success_url и получил код состояния: 100 (при вводе статуса: 100). Я вижу, что вы используете данные формы, но я не знаю, что это необходимо/требуется.
Postman POST http://kugugshivom-001-site1.atempurl.com/Home/SuccessResponse
В форме формы тела выбраны данные с параметрами 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