Как создать зашифрованную кнопку PayNow «на лету» для сторонних клиентов, используя Paypal NVP API? - PullRequest
8 голосов
/ 30 марта 2012

Мне нужно на лету создать зашифрованные кнопки PayPal PayPow для веб-сайта.
Я прочитал всю документацию, которую могу найти на сайте PayPal.
Я понял, что мне нужно использовать BMCreateButton ButtonManager NVPAPI.
Но я не смог найти ни информации, ни достаточно простого и документированного примера кода о том, КАК я должен называть эти API.

Нужно ли поместить свой параметр в форму и опубликовать его на каком-нибудь сервере?
Нужно ли поместить весь параметр в URL-адрес, вызвать этот URL-адрес и использовать результат?
Как мне пройти аутентификацию на этом сервисе?
Я собираюсь создать зашифрованную кнопку Paynow для другой бизнес-учетной записи PayPal.

Может кто-нибудь показать мне какой-нибудь код VB.Net или C #, который фактически вызывает этот BMCreateButtonAPI NVP?
Чтобы я мог видеть:

  • как сделать вызов
  • как пройти аутентификацию на сервисе
  • как отформатировать / использоватьпараметры вызова API
  • как получить результаты

Различные ссылки на полезный ресурс
- Спасибо этот ответ Мне удалось найти несколько полезных примеров кода здесь и там о том, как вызвать Paypal API.
- Здесь это более полезная информация о том, как работает PayPal NVP API.
- Здесь интересный сайт, который генерирует APЯ называю URL для API BMCreateButton
- Здесь вы можете найти инструкцию для получения учетных данных API "Третьего лица".(спасибо этот ответ )
- Еще немного полезной информации здесь об интеграции Paypal API
- Здесь вы можете найти текущую и последнюю версиюномер Paypal API

Обновление 1
Теперь я создал некоторый код, который действительно что-то делает, но он выдает ошибку.Этот код фактически создает зашифрованную кнопку Paynow, используя API-интерфейс BMCreateButton.Кажется, это работает, но когда я нажимаю кнопку Paynow, отображаются все параметры платежа, а также отображается ошибка «При расшифровке вашего защищенного заказа возникла проблема. Пожалуйста, свяжитесь с продавцом».

Вот код :

Public Shared Sub PaypalTest3web()

    Dim NVP As New Dictionary(Of String, String)

    Dim strUsername As String = "aso_1273063882_biz_api3.megatesto.it"
    Dim strPassword As String = "1273063582"
    Dim strSignature As String = "A22sd7623RGUsduDHDSFU57N7dfhfS23DUYVhdf85du8S6FJ6D5bfoh5"

    Dim strNVPSandboxServer As String = "https://api-3t.sandbox.paypal.com/nvp"


    NVP.Add("USER", strUsername)
    NVP.Add("PWD", strPassword)
    NVP.Add("SIGNATURE", strSignature)


    Dim bvCount As Integer
    bvCount = 0

    NVP.Add("METHOD", "BMCreateButton")
    NVP.Add("VERSION", "85.0")

    NVP.Add("BUTTONCODE", "ENCRYPTED")    ''CLEARTEXT / ENCRYPTED
    NVP.Add("BUTTONTYPE", "BUYNOW")
    NVP.Add("BUTTONSUBTYPE", "PRODUCTS")  ''Optional: PRODUCTS / SERVICES

    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "business=D64TG758HIWj2") ''Merchant ID

    'bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "cmd=_s-xclick")  ''DONT SPECIFY the cmd parameter, if specifien it will generate an error on the decription of the "secure order", I don't know why...
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "lc=IT")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "button_subtype=PRODUCTS")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "item_name=Test_product")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "item_number=123456")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "amount=12.00")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "currency_code=EUR")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "quantity=1")

    ''build the parameter string
    Dim paramBuilder As New StringBuilder
    For Each kv As KeyValuePair(Of String, String) In NVP
        Dim st As String
        st = kv.Key & "=" & HttpUtility.UrlEncode(kv.Value) & "&"
        paramBuilder.Append(st)
    Next

    Dim param As String
    param = paramBuilder.ToString
    param = param.Substring(0, param.Length - 1) 'remove the last '&'

    'Create web request and web response objects, make sure you using the correct server (sandbox/live)
    Dim wrWebRequest As HttpWebRequest = DirectCast(WebRequest.Create(strNVPSandboxServer), HttpWebRequest)
    wrWebRequest.Method = "POST"

    Dim requestWriter As New StreamWriter(wrWebRequest.GetRequestStream())
    requestWriter.Write(param)
    requestWriter.Close()

    '' Get the response.
    Dim responseReader As StreamReader
    responseReader = New StreamReader(wrWebRequest.GetResponse().GetResponseStream())

    ''and read the response
    Dim responseData As String
    responseData = responseReader.ReadToEnd()
    responseReader.Close()

    ''url-decode the results
    Dim result As String
    result = HttpUtility.UrlDecode(responseData)

    Dim formattedResult As String

    formattedResult = "Request on " & strNVPSandboxServer & vbCrLf &
                     HttpUtility.UrlDecode(param.Replace("&", vbCrLf & "  ")) & vbCrLf & vbCrLf &
                     "Result:" & vbCrLf & result & vbCrLf & vbCrLf &
                     "--------------------------------------" & vbCrLf



    ''show the results
    Trace.WriteLine(result)
    MessageBox.Show(result)
End Sub

Вот ответ HTML

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<input type="hidden" name="cmd" value="_s-xclick">
<input type="hidden" name="encrypted" value="-----BEGIN PKCS7-----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-----END PKCS7-----
">
<input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynow_LG.gif" border="0" name="submit" alt="PayPal - Il sistema di pagamento online più facile e sicuro!">
<img alt="" border="0" src="https://www.sandbox.paypal.com/it_IT/i/scr/pixel.gif" width="1" height="1">
</form>

И вот ошибка, которую я получаю после нажатия на эту зашифрованную кнопку оплаты сейчас

enter image description here

Как видите, все параметры (название элемента, цена, item_id ...) являются правильными.Но я не могу понять, почему я получаю эту ошибку.

Если вы хотите попробовать этот код, вы должны заменить свой API пользователя / пароль / подпись.Сгенерированная кнопка PayNow работает только тогда, когда вы вошли в свою учетную запись PayPal.

Есть ли у вас какие-либо идеи о том, как решить эту ошибку?

Примечание: после решенияВ этом выпуске мне нужно понять, как создать зашифрованную кнопку для третьей бизнес-учетной записи PayPal (нам нужно создать зашифрованную кнопку для учетных записей PayPal наших клиентов).Использование наших учетных данных API, торгового кода клиента и настройка учетных данных API в учетной записи PayPal наших клиентов недопустимы ... Это говорит о том, что торговый код недействителен.Возможно, я что-то упустил ...

Обновление 2
Кажется, я нашел, как решить вышеупомянутую ошибку: просто удалите "Параметры cmd = _s-xclick / _xclick ".Если «cmd» не указан, кнопка paynow, похоже, не выдает никакой ошибки.Требуется дополнительное тестирование ... в любом случае, я прокомментировал строку кода в примере кода.

Теперь вернемся к делу.Давайте проведем некоторое тестирование, а затем найдем подходящий способ создания кнопки paynow для сторонних учетных записей PayPal.

1 Ответ

9 голосов
/ 05 апреля 2012

Хорошо, наконец-то я понял! : -)

Моя цель - создать для некоторых наших клиентов Зашифрованные Кнопки PayNow "на лету". Вот краткое объяснение того, как PayPal API работает со сторонним доступом.

  • Создать учетную запись Paypal Sandbox ( здесь )
  • В этой учетной записи песочницы создайте 2 новых бизнес-аккаунта
    Вы должны подключить эти бизнес-аккаунты к кредитной карте. Это пометит эти учетные записи как «проверенные», если только они не будут работать
    • Первый аккаунт (аккаунт А) будет представлять нашу компанию
    • Второй аккаунт (аккаунт B) будет представлять один из наших клиентов
  • войдите в учетную запись A и запросите учетные данные API ( инструкции здесь )
  • войдите в учетную запись B и предоставьте разрешение API для учетной записи A ( инструкция здесь проверьте параграф " Сторонняя аутентификация: предоставьте вашей корзине соответствующие разрешения API аутентификации ")
  • захватите учетные данные Api учетной записи A и поместите их в исходный код
  • захватите идентификационный номер продавца и адрес электронной почты продавца из учетной записи B и поместите их в исходный код
  • запустить код
  • возьмите возвращенный html, поместите его на веб-страницу и протестируйте, он должен работать
    (необходимо войти в свою учетную запись PayPal, или сгенерированная кнопка не будет работать)

Почему это простое и лаконичное знание разбросано по времени среди бесчисленного количества страниц справки PayPal, руководств по PayPal PDF и постов третьих сторон в блоге, мне не понятно :-) Так или иначе ...

Вот рабочий код в VB.Net

Public Shared Sub PaypalThirdPartyPayNowButtonTest()
    Dim bvCount As Integer = 0  ''L_BUTTONVAR counter
    Dim NVP As New Dictionary(Of String, String)  ''Api Name-Value-Pair parameters

    ''define paypal SANDBOX server
    Dim paypalApiServerUrl As String = "https://api-3t.sandbox.paypal.com/nvp"

    ''define Api credentials of YOUR business paypal account 
    Dim yourApiUsername As String = "aso_1273063882_biz_api3.megatesto.it"
    Dim yourApiPassword As String = "1273063582"
    Dim yourApiSignature As String = "A22sd7623RGUsduDHDSFU57N7dfhfS23DUYVhdf85du8S6FJ6D5bfoh5"

    ''define Your CUSTOMER identification data
    Dim customerEmailID As String = "MyCustomer_143363961_biz@megatesto.it"
    Dim customerMerchantID As String = "3S4EF7BI96YHS"


    ''use YOUR identification data
    NVP.Add("USER", yourApiUsername)
    NVP.Add("PWD", yourApiPassword)
    NVP.Add("SIGNATURE", yourApiSignature)

    ''use your CUSTOMER identification data
    NVP.Add("SUBJECT", customerEmailID)
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "business=" & customerMerchantID) ''Merchant ID


    ''Api method name and version
    NVP.Add("METHOD", "BMCreateButton")
    NVP.Add("VERSION", "85.0")

    ''method specific parameters
    NVP.Add("BUTTONCODE", "ENCRYPTED")
    NVP.Add("BUTTONTYPE", "BUYNOW")
    NVP.Add("BUTTONSUBTYPE", "PRODUCTS")

    ''Buynow button specific parameters
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "lc=IT")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "button_subtype=PRODUCTS")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "item_name=Test_product")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "item_number=123456")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "amount=12.00")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "currency_code=EUR")
    bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "quantity=1")
    ''bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "cmd=_s-xclick")  'DONT' specify the cmd parameter, if you specify it, it wont work, paypal will give you an error

    ''build the parameter string
    Dim paramBuilder As New StringBuilder
    For Each kv As KeyValuePair(Of String, String) In NVP
        Dim st As String
        st = kv.Key & "=" & HttpUtility.UrlEncode(kv.Value) & "&"
        paramBuilder.Append(st)
    Next

    Dim param As String
    param = paramBuilder.ToString
    param = param.Substring(0, param.Length - 1) ''remove the last '&'


    ''Create web request and web response objects, make sure you using the correct server (sandbox/live)
    Dim wrWebRequest As HttpWebRequest = DirectCast(WebRequest.Create(paypalApiServerUrl), HttpWebRequest)
    wrWebRequest.Method = "POST"


    Dim requestWriter As New StreamWriter(wrWebRequest.GetRequestStream())
    requestWriter.Write(param)
    requestWriter.Close()

    '' Get the responseReader
    Dim responseReader As StreamReader
    responseReader = New StreamReader(wrWebRequest.GetResponse().GetResponseStream())

    ''read the response
    Dim responseData As String
    responseData = responseReader.ReadToEnd()
    responseReader.Close()


    ''url-decode the results
    Dim result As String
    result = HttpUtility.UrlDecode(responseData)

    Dim formattedResult As String

    formattedResult = "Request on " & paypalApiServerUrl & vbCrLf &
                     HttpUtility.UrlDecode(param.Replace("&", vbCrLf & "  ")) & vbCrLf & vbCrLf &
                     "Result:" & vbCrLf & HttpUtility.UrlDecode(responseData.Replace("&", vbCrLf & "  ")) & vbCrLf & vbCrLf &
                     "--------------------------------------" & vbCrLf

    ''show the results
    Trace.WriteLine(formattedResult)
    MessageBox.Show(formattedResult)
End Sub

А вот такой же код в C #

public static void PaypalThirdPartyPayNowButtonTest()
{
    int bvCount = 0; //L_BUTTONVAR counter
    Dictionary<string, string> NVP = new Dictionary<string, string>(); //Api Name-Value-Pair parameters

    //paypal SANDBOX server
    string paypalApiServerUrl = "https://api-3t.sandbox.paypal.com/nvp";

    //Api credentials of YOUR business paypal account 
    string yourApiUsername = "aso_1273063882_biz_api3.megatesto.it";
    string yourApiPassword = "1273063582";
    string yourApiSignature = "A22sd7623RGUsduDHDSFU57N7dfhfS23DUYVhdf85du8S6FJ6D5bfoh5";

    //Your CUSTOMER identification data
    string customerEmailID = "MyCustomer_143363961_biz@megatesto.it";
    string customerMerchantID = "3S4EF7BI96YHS";

    //use YOUR identification data
    NVP.Add("USER", yourApiUsername);
    NVP.Add("PWD", yourApiPassword);
    NVP.Add("SIGNATURE", yourApiSignature);

    //use your CUSTOMER identification data
    NVP.Add("SUBJECT", customerEmailID);
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "business=" + customerMerchantID);

    //Api method name and version
    NVP.Add("METHOD", "BMCreateButton");
    NVP.Add("VERSION", "85.0");

    //method specific parameters
    NVP.Add("BUTTONCODE", "ENCRYPTED");
    NVP.Add("BUTTONTYPE", "BUYNOW");
    NVP.Add("BUTTONSUBTYPE", "PRODUCTS");

    //Buynow button specific parameters
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "lc=IT");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "button_subtype=PRODUCTS");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "item_name=Test_product");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "item_number=123456");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "amount=12.00");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "currency_code=EUR");
    bvCount++; NVP.Add("L_BUTTONVAR" + bvCount.ToString() , "quantity=1");
    //bvCount = bvCount + 1 : NVP.Add("L_BUTTONVAR" & bvCount, "cmd=_s-xclick")  //DON'T specify the cmd parameter, if you specify it, it wont work, paypal will give you an error


    //build the parameter string
    StringBuilder paramBuilder = new StringBuilder();
    foreach (KeyValuePair<string, string> kv in NVP)
    {
        string st = kv.Key + "=" + System.Web.HttpUtility.UrlEncode(kv.Value) + "&";
        paramBuilder.Append(st);
    }

    string param = paramBuilder.ToString();
    param = param.Substring(0, param.Length - 1); //remove the last '&'


    //Create web request and web response objects, make sure you using the correct server (sandbox/live)
    System.Net.HttpWebRequest wrWebRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(paypalApiServerUrl);
    wrWebRequest.Method = "POST";

    System.IO.StreamWriter requestWriter = new System.IO.StreamWriter(wrWebRequest.GetRequestStream());
    requestWriter.Write(param);
    requestWriter.Close();


    //Get the responseReader
    System.IO.StreamReader responseReader = new System.IO.StreamReader(wrWebRequest.GetResponse().GetResponseStream());
    string responseData = responseReader.ReadToEnd();
    responseReader.Close();

    //url-decode the results
    string result = System.Web.HttpUtility.UrlDecode(responseData);

    string formattedResult = "Request on " + paypalApiServerUrl + "\r\n" + System.Web.HttpUtility.UrlDecode(param.Replace("&", "\r\n  ")) + "\r\n\r\nResult:\r\n" + System.Web.HttpUtility.UrlDecode(responseData.Replace("&", "\r\n  ")) + "\r\n\r\n--------------------------------------\r\n";

    //show the results
    System.Diagnostics.Trace.WriteLine(formattedResult);
    System.Windows.Forms.MessageBox.Show(formattedResult);
}

Желаю всем счастливой интеграции с PayPal: -)

Обновление (для PHP-кодера)
@Style просит рабочий пример PHP ... Я не знаю PHP, но я нашел несколько ссылок, которые могут содержать полезную информацию для PHP-кодировщика: вы можете найти API BMCreateButton внутри этих исходных файлов:

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