Платежное намерение Android UPI всегда не выполняется

Вот что я хочу сделать. В моем приложении есть два типа пользователей: покупатели и продавцы. Продавец может предоставить свой идентификатор UPI, а покупатели могут использовать любое приложение UPI, установленное на их устройстве, для оплаты продавцам с использованием предоставленного идентификатора UPI продавца.

Я создаю URL-адрес платежа UPI следующим образом:

String upiPaymentUrl = upi://pay?pa=<<Seller VPA ID>>&pn=<<Payee name>>&tn=<<Txn description>>&cu=INR

Затем я использую следующий код, чтобы показать все приложения с поддержкой UPI на телефоне:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(upiPaymentUrl));
Intent chooser = Intent.createChooser(intent, getString(R.string.payment_title));
startActivityForResult(chooser, Constant.REQUEST_CODE_UPIPAYMENT, null);

Выбранное приложение UPI запускается, и все данные, которые я указал в URI, заполняются правильно. Затем я инициирую платеж, но платеж всегда не удается. Когда я использую приложения UPI как есть (без вызова из моего приложения) и использую те же значения, которые я использую для создания URL-адреса UPI, платеж проходит без каких-либо ошибок. Есть идеи, что могло вызвать сбой платежа, когда я вызываю приложения UPI из своего приложения?

Любая помощь / предложения будут высоко оценены!


person Sanjay Dandekar    schedule 30.10.2020    source источник
comment
Возможно, проверьте, что содержится в результирующем объекте Uri. Если в каком-либо из ваших параметров URL-адреса есть какие-то странные символы, возможно, он неправильно проанализирован. Просто предположение, хотя   -  person JensV    schedule 30.10.2020
comment
Пробовал также простые входы ASCII. Проблема не в ссылке. Приложения UPI открываются и отображают правильные значения, которые присутствуют в URL-адресе. Когда я инициирую платеж, он терпит неудачу.   -  person Sanjay Dandekar    schedule 30.10.2020
comment
Возможно, попытайтесь создать Uri, следуя этой документации developers.google.com / pay / india / api / android / in-app-payments   -  person JensV    schedule 03.11.2020


Ответы (3)


Согласно новому правилу NPCI, все приложения upi связаны с минимальной транзакцией.

Если идентификатор upi-получателя зарегистрирован как non-business upiid, он не сможет произвести платеж успешно.

Итак, решение - создать новый бизнес-идентификатор UPI.

person Kapil Soni    schedule 03.04.2021

Вам необходимо подписать свое намерение, когда вы запускаете платеж через намерение.

См. Раздел этой документации, отмеченный желтым: https://web.archive.org/web/20200921110005/https://www.npci.org.in/sites/default/files/UPI%20Linking%20Specs_ver%201.6.pdf

Исходный URL-адрес кажется мертвым, но на него ссылаются несколько источников, включая Google.

Это приведет к примерно следующему:

Uri uri =
    new Uri.Builder()
        .scheme("upi")
        .authority("pay")
        .appendQueryParameter("pa", "your-merchant-vpa@xxx")
        .appendQueryParameter("pn", "your-merchant-name")
        .appendQueryParameter("mc", "your-merchant-code")
        .appendQueryParameter("tr", "your-transaction-ref-id")
        .appendQueryParameter("tn", "your-transaction-note")
        .appendQueryParameter("am", "your-order-amount")
        .appendQueryParameter("cu", "INR")
        .build();

// Sign the uri as specified
String signature = someSignatureFunction(uri);

uri.buildUpon()
        .appendQueryParameter("sign", signature);

Кроме того, параметры mode и orgid кажутся необязательными для платежей, созданных намерением.


Я не совсем понимаю, чего вы пытаетесь достичь. Но поскольку API из того, что я вижу, не предназначен для использования для обработки платежей между пользователями, я бы проверил, действительно ли то, что вы делаете, разрешено / возможно. Возможно, вы не сможете подписывать транзакции, не предназначенные для вашей компании, что сделает это невозможным.

Дальнейшее соблюдение этого пункта, чтобы подписать намерение, вам необходимо шифрование, которое обычно (в таких системах) происходит на сервере, который вы контролируете, для обратного проектирования и, таким образом, фальсификации платежей.

Отказ от ответственности: у меня нет опыта работы с UPI, поэтому этот ответ в основном основан на предположениях и не проверен. Я рекомендую поискать дополнительные ресурсы на UPI перед выпуском.


Некоторые другие ресурсы, которые я нашел:

  • Ссылка на infinit.co.in осуществляется при нажатии кнопки «Разработчик» на домашней странице npci.
  • https://infinit.co.in/Solutions/UPI/product_doc.pdf - 5.11 Объясняет концепцию подписанного намерения и принципы ее работы.
  • https://www.npci.org.in/what-we-do/upi/product-overview - Официальная страница продукта UPI, не удалось найти много полезной информации
person JensV    schedule 03.11.2020

Итак, вот мой вариант использования. У меня есть приложение на торговой площадке, где покупатели и продавцы регистрируются. Продавцы перечисляют свои товары. Покупателям предлагается приобрести товар. Продавец предоставляет информацию о UPI (UPI ID или универсальный QR-код). Покупатель инициирует платеж, используя информацию UPI, предоставленную продавцом через приложение.

Один из способов сделать это - зарегистрироваться в качестве независимого разработчика в NCPI (infinit.co.in) и подать заявку на использование UPI. Я еще не знаю полного процесса, так как я застрял в запросе доступа к UPI (!). Я предполагаю, что как только доступ будет разрешен, вы можете зарегистрировать свой закрытый ключ в инфраструктуре UPI. Чтобы инициировать платеж, создайте URL-адрес внутренней ссылки UPI, как показано ниже.

upi: // pay? pa = ‹› & pn = ‹› & tn = ‹› & cu = INR

Подпишите его открытым ключом, который вы отправляете вместе с вашим приложением. Спецификации для подписания доступны в документе разработчика UPI, как указано @JensV.

Итак, теперь, если вы не хотите делать что-либо из вышеперечисленного, какие варианты доступны? Я вижу два варианта: один просит продавцов предоставить свой UPI ID, и в вашем приложении покупатели могут копировать UPI ID продавца на буфер обмена, чтобы они затем могли открыть любое платежное приложение UPI (GPay, Paytm и т. Д.) И вставить UPI ID при инициировании платежа. Еще один удобный способ сделать это - попросить продавца получить универсальный QR-код продавца. Используйте любую библиотеку (их много) для сканирования QR-кода, и вы получите подписанный URL-адрес UPI (в большинстве случаев). Теперь все, что вам нужно сделать, это использовать намерение для запуска приложения UPI, используя этот подписанный URL. С помощью этого метода мне удалось произвести оплату всеми приложениями, кроме GPay (!).

Еще одна информация - если у вас нет способа получить подписанный URL-адрес UPI, вы все равно можете использовать необработанный URL-адрес UPI, упомянутый выше. Платеж будет успешным только с помощью приложения UPI эмитента. То есть, если эмитентом идентификатора UPI, который вы используете, является банк HDFC, то, используя неподписанный URL-адрес UPI, вы можете вызвать приложение мобильного банкинга HDFC и произвести платеж. Всегда получится.

Если я смогу зарегистрироваться в UPI в качестве разработчика и зарегистрировать свой закрытый ключ, я обновлю эту ветку, чтобы объяснить процесс.

person Sanjay Dandekar    schedule 07.11.2020