如何使用Paypal NVP API为第三方客户“即时”创建加密的PayNow按钮?

我需要为网站动态创建加密的“PayNow”paypal按钮。
我阅读了我在paypal网站上找到的所有文档。
我知道我需要使用BMCreateButton ButtonManager NVP API。
但我一直无法找到任何信息,也没有找到任何合理简单和记录的示例代码,关于我应该如何调用这些API。

我是否需要将参数放在表单中并将其发布到某种服务器上?
我是否需要将所有参数放在url上,调用此url,广告是否使用结果?
我该如何对此服务进行身份validation?
我将为不同的paypal商业帐户创建加密的paynow按钮。

有人能告诉我一些实际上称之为BMCreateButton NVP API的VB.Net或C#代码吗?
所以我可以看到:

  • 怎么打电话
  • 如何validation服务
  • 如何格式化/使用API​​调用的参数
  • 如何得到结果

各种有用资源的链接
– 由于这个答案,我已经能够在这里找到一些有用的示例代码,关于如何调用Paypal API。
– 这是有关paypal NVP API如何工作的更有用的信息。
– 这是一个有趣的网站,为BMCreateButton API生成API调用URL
– 您可以在此处找到获取“第三方”API凭据的说明。 (感谢这个答案 )
– 这里有一些关于Paypal API集成的更多有用信息
– 在这里您可以找到Paypal API的当前和最新版本号

更新1
现在我已经创建了一些实际做某事的代码,但它给了我一个错误。 此代码实际上使用BMCreateButton API创建加密的paynow按钮。 它似乎有效,但是当我点击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响应

 

这是我点击这个加密的立即付款按钮后得到的错误

在此处输入图像描述

如您所见,所有参数(项目名称,价格,item_id …)都是正确的。 但是我无法理解为什么我会收到这个错误。

如果您想尝试此代码,则应替换您的API用户/密码/签名。 生成的PayNow按钮仅在您登录PayPal沙盒帐户时有效。

你对如何解决这个错误有任何想法吗?

注意:解决此问题后,我需要了解如何为第三个paypal企业帐户创建加密按钮(我们需要为客户的paypal帐户创建加密按钮)。 使用我们的API凭据,客户商家代码,并在我们的客户paypal帐户中配置我们的API凭证是不应该…它说商家代码无效。 可能我错过了一些东西……

更新2
看来我已经找到了解决上述错误的方法:只需删除“cmd = _s-xclick / _xclick”参数即可。 如果未指定“cmd”,则paynow按钮似乎不会生成任何错误。 需要进行更多测试……无论如何,我在代码示例中对代码行进行了评论。

现在,回到商业。 让我们做一些测试,然后找到为第三方paypal帐户创建paynow按钮的正确方法。

好的,最后我明白了! 🙂

我的目标是为我们的一些客户“即时”创建加密的 PayNow按钮。 以下是PayPal API如何与第三方访问一起使用的简要说明。

  • 创建Paypal Sandbox帐户( 此处 )
  • 在此沙箱帐户中,创建2个新的企业帐户
    你应该将这些商业帐户挂钩到信用卡。 这会将这些帐户标记为“已validation”,除非它不起作用
    • 第一个帐户(帐户A)将代表我们公司
    • 第二个帐户(帐户B)将代表我们的一个客户
  • 登录帐户A,并请求API凭据( 此处的说明 )
  • 登录帐户B,并向帐户A授予API权限( 此处的说明请检查“ 第三方身份validation:为您的购物车授予相应的API身份validation权限 ”一节)
  • 获取帐户A的Api凭据,并将其放入源代码中
  • 获取帐户B的商家ID和商家电子邮件,并将其放入源代码中
  • 运行代码
  • 抓住返回的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 NVP = new Dictionary(); //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 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: