Мне нужно создать зашифрованные кнопки PayNow paypal на лету для веб-сайта.
Я прочитал всю документацию, которую я могу найти на веб-сайте paypal.
Я понял, что мне нужно использовать BMPreateButton ButtonManager NVP API.
Но мне не удалось найти какую-либо информацию или какой-либо достаточно простой и документированный образец кода, о том, как я должен назвать этот API.
Нужно ли поместить мой параметр в форму и разместить его на каком-то сервере?
Нужно ли мне поместить весь параметр на URL-адрес, вызвать этот URL-адрес, использовать результат?
Как проверить подлинность этой службы?
Я собираюсь создать зашифрованную кнопку paynow для разных учетных записей Paypal.
Может кто-нибудь показать мне какой-то код VB.Net или С#, который на самом деле называется этим API-интерфейсом BMCreateButton NVP?
Чтобы я мог видеть:
Различные ссылки на полезный ресурс
- Благодаря этому ответу я смог найти полезный пример кода здесь и там о том, как вызвать API Paypal.
- Здесь более полезная информация о том, как работает Paypal NVP API.
- Здесь интересный веб-сайт, который генерирует URL-адрес API для API BMCreateButton
- Здесь вы можете найти инструкцию для получения учетных данных API третьей стороны. (спасибо этот ответ)
- Еще одна полезная информация здесь об интеграции API Paypal
- Здесь вы можете найти текущий и последний номер версии API Paypal
Обновление 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>
И вот ошибка, которую я получаю после нажатия на эту зашифрованную кнопку "платить сейчас"
Как вы можете видеть, все параметры (имя элемента, цена, item_id...) верны. Но я не могу понять, почему я получаю эту ошибку.
Если вы хотите попробовать этот код, вы должны заменить своего пользователя API/пароль/подпись. Сгенерированная кнопка PayNow работает только тогда, когда вы вошли в свою учетную запись в виде песочницы paypal.
Есть ли у вас какие-либо идеи о том, как решить эту ошибку?
Примечание: после решения этой проблемы мне нужно понять, как создать зашифрованную кнопку для третьей учетной записи PayPal (нам нужно будет создать зашифрованную кнопку для PayPal-счетов наших клиентов). Используя наши учетные данные API, код продавца клиента и наличие наших учетных данных API, настроенных в нашей учетной записи, платежная учетная запись не достаточна... Говорят, что код продавца недействителен. Наверное, мне что-то не хватает...
Обновление 2
Кажется, что я нашел, как решить вышеупомянутую ошибку: просто удалите параметры "cmd = _s-xclick/_xclick". Если "cmd" не указан, кнопка paynow, похоже, не генерирует никаких ошибок. Необходимо больше тестирования... в любом случае я прокомментировал строку кода в примере кода.
Теперь вернемся к делу. Позвольте сделать некоторое тестирование, а затем найти правильный способ создания кнопки paynow для сторонних учетных записей PayPal.
Хорошо, наконец, я понял!: -)
Моя цель - создать зашифрованные кнопки PayNow "на лету" для некоторых наших клиентов. Ниже приведено краткое описание того, как API 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 = "[email protected]"
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
И вот тот же код в С#
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 = "[email protected]";
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-кодера: вы можете искать BMCreateButton api внутри этих исходных файлов: