paypal接口 php
上一篇 / 下一篇 2008-04-23 09:06:41 / 個人分類:php
paypal接口与其它接口有些不同,稍微复杂一点。 其实银行接口也算是一个站点的插件。
+u\7{_/V Sk0Iq0若鄰博客y,vqw#BU2o4b8q@所谓paypal ipn(Instant Payment Notification),就是Paypal开发的一种能主动通知第三方卖家系统交易状态的一种机制。IPN的原理很简单,就是当产生了一个交易之后,交易状态发生变化时,如用户已经付款、或者退款、撤销时,Paypal利用常用的HTTP POST方式,将交易的一些变量提交给网站的某个页面(称之为IPN Handler),当这个页面接受到请求时候,将这些数据原封不动加上一个指示验证的cmd=_notify-validate,POST回Paypal的接口地址,如果数据正确,那么Paypal返回字符串VERIFIED,否则为INVALID,如果结果为VERIFIED,那么你的程序就可以使用这些数据进行操作。
c-pu#m\i"B,V/So0开设Sandbox帐号
若鄰博客q8ORL ?U hn但代码的调试是一件很痛苦的事情,因为作为第三方开发人员,不可能开两个帐号,每次测试还要之间交易一些钱,所以Paypal专门开发了Sandbox给开发人员进行开发,首先到https://developer.paypal.com/ 注册一个开发帐号,好了之后再进入Sandbox建立测试用的Paypal虚拟帐号(至少应该建立一个Business的和一个Personal的),这种账号注册方法和Paypal的流程一样,信息可以是假的,包括银行帐号、信用卡(其实Paypal Sandbox会自动生成一些随机的号码)。接下来需要激活Paypal Sandbox的虚拟帐号,注意,这里不管你在Paypal Sanbox注册时填什么邮件地址,有任何发送到虚拟帐号所填邮箱的邮件都存会在开发帐号的管理界面中的Email页(导航栏上有)中。登录Sandbox的虚拟Paypal环境,还需要验证虚拟帐号的银行,这里可以随便填,然后通过Add Funds来给账户充值(想填多少填多少 920-203 920-533 )。然后,还需要激活IPN的选项,在Business的那个账户的Profile设置页面中,点击,然后点击Edit按钮,打开IPN,这里如果你使用的是固定的IPN Handle,可以直接将地址填入。
)K+u8l/e|1M%UQU0$f|"rX6Y!hm0接下来,我们测试的时候,应该将Paypal接口的地址设置为https://www.sandbox.paypal.com/cgi-bin/webscr
;}0XnT U@(`&_2vc0若鄰博客(w#N:p*M NM5[)OD9^p'qU"s'g0
基本的流程
若鄰博客fo6tm%N K m6~当客户向您付款时,PayPal将向位于指定 URL(type=”hidden” name=”notify_url” value=” “)的服务器发送一个通知。此通知中将包括您的客户的所有付款信息(例如,客户名称、金额),以及一段加密代码。当服务器收到通知时,它随后会将该信息(包括加密代码)发送回安全的PayPal URL。PayPal将通过检查加密字符串对交易进行身份验证。这种将 IPN 数据传回PayPal的操作防止了“欺骗”,因此您可以确保 IPN 来自PayPal。在进行验证时,PayPal会将其合法性的确认信息发送回您的服务器。
XOP5b0Zm"Q6f0[ n/~l6U7k0提示:要启用即时付款通知,您将需要输入一个 URL,通过它您可以接收到来自您的用户信息的通知。
8ZG%JA;Q K"C0若鄰博客h ?fr t`s3L.?9D i启用了即时付款通知后,每次当您接收付款时您的服务器都会收到一个通知,此通知将以隐藏的“FORM. POST”的方式发送到指定的 URL,并将包括所有付款信息。此页面的底部列出了通知的 FORM. 变量。若鄰博客np;PlxLI~)e
若鄰博客ZGuh1j+C?,`每次收到来自PayPal的 IPN 时,您必须在实施订单之前完成如下所述的通知确认过程。确认列出的信息将可确保交易合法。
!C#zDH8E[ IY#W0通知确认
若鄰博客0^9a'['@;{y5RJ`为了确保付款已进入您的PayPal账户,您必须验证用作“receiver_email”的电子邮件地址是否已在您的PayPal账户中注册并得到确认。若鄰博客`:a$fBn{0sB2}g*A
1d.Ih`s-J ?0服务器收到即时付款通知后,您将需要通过构建一个发送到PayPal的 HTTP POST 对其进行确认。您的 POST 应发送到https://www.paypal.com/cgi-bin/webscr
`1RfItY7T0i7npZ ]3EBI0您必须完全按照收到表单变量时的原样发送所有收到的表单变量。您还需要将一个值为“_notify-validate”的名为“cmd”变量(例如,cmd=_notify-validate)附加到 POST 字符串。若鄰博客5FS @T8m3Y
若鄰博客r.m9X zh9RPayPal将回复该 POST,并在回复的正文中包含一个单词“VERIFIED”或“INVALID”。当您收到 VERIFIED 回复时,您需要在实施订单之前执行若干检查:若鄰博客J7CA3o'N#Yzt
- 确认“payment_status”为“Completed”,因为系统也会为其他结果(如“Pending”或“Failed”)发送 IPN。
C ~0s^$D2C%aT+X$n0检查“txn_id”是否未重复,以防止欺诈者重复使用旧的已完成的交易。若鄰博客gb;N/?h4j$j
验证“receiver_email”是已在您的PayPal账户中注册的电子邮件地址,以防止将付款发送到欺诈者的账户 。
X x'FY3j5d Iw,e m0检查其他交易详情(如物品号和价格),以确认价格未改变完成了以上检查后,您可以使用 IPN 数据更新您的数据库,并处理购物。
如果收到“无效”通知,则应将其视为可疑通知,并应对其进行调查。
t5[ |1H|Y"dD"B0主要参数:
若鄰博客4h5|4X&p+b"gz向PayPal提交粘贴代码时,应包括以下 4 个隐藏变量及一张图片,这就是说,您粘贴到PayPal的最短必需代码应如下:若鄰博客@4A} V1]\ K.S%_7[
<form. action="https://www.paypal.com/row/cgi-bin/webscr" method="post"> <input type="hidden" name="cmd" value="_xclick"> // "_xclick" 立即购买 <input type="hidden" name="business" value="you@youremail.com"> //PayPal账户上的电子邮件地址 <input type="hidden" name="item_name" value="Item Name"> //物品名称(或购物车名称) <input type="hidden" name="currency_code" value="USD"> //定义币种以标示货币变量 值可以为 "USD"、"EUR"、"GBP"、"CAD"、"JPY"。 <input type="hidden" name="amount" value="0.00"> //物品的价格(购物车中所有物品的总价格,因为是_Xclick模式) <input type="image" src="http://www.paypal.com/zh_XC/i/btn/x-click-but01.gif" name="submit" alt="请使用PayPal付款!"> </form>
n6N wL7B)R0PayPal 提供附加变量,用于自定义您的 Form. Post。所有可用变量如下(变量名称必须用小写):若鄰博客~/c]evJ+s9^0]{
若鄰博客d'fC(A8DR3Z#U可用变量
lrU_D]Z0business 您的PayPal账户上的电子邮件地址若鄰博客u,RLV\9PDtL2A
quantity 物品数量。大于 1 时,会与金额相乘若鄰博客5NOb A1f!gY+hJ
item_name 物品名称(或购物车名称)。必须是字母数字字符,最多为 127 个字符
[-X:w
ZaU[3T0item_number 用于跟踪付款的可选传递变量。必须是字母数字字符,最多为 127 个字符
}y6h
Y]3@0amount 物品的价格(购物车中所有物品的总价格)若鄰博客u&V
~_l4ot)]
shipping 该物品的运送成本
-SflZ"D"Su_U0shipping2 每增加一件物品所需的运送成本
X"sG3L#Tzl^0handling 手续费
5lr@u3S1[{0tax 基于交易的税额。如果使用该变量,传递值将覆盖所有用户信息税收设置(不管买家所在位置)。若鄰博客:U@r t&xa.e.M
no_shipping 送货地址。如果设为 “1″,则不会要求您的客户提供送货地址。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入送货地址
2n\;TU&L)Z6dq3h3x0cn 可选标签,会在提示栏上显示(最多 40 个字符)若鄰博客R,cCx1`W*Xn}
no_note 为付款加入提示。如果设为 “1″,则不会提示您的客户输入提示。该变量为可选项;如果省略或设为 “0″,将提示您的客户输入提示。若鄰博客)r]*S%Ey*l:d
on0 第一选项栏名称。最多 64 个字符
&n~2u:hN$dD6l0os0 第一组选项值。最多 200 个字符。”on0″ 必须定义,以便识别 “os0″。若鄰博客1gh:zY#M;Q
on1 第二选项栏名称。最多 64 个字符若鄰博客d1SVL"N?\N7z
os1 第二组选项值。最多 200 个字符。”on1″ 必须定义,以便识别 “os1″。
Y(L5p~$K6I[0custom 决不会向您的客户显示的可选转递变量。可用于跟踪存货若鄰博客Xv.?8DQ)c
invoice 决不会向您的客户显示的可选转递变量。可用于跟踪账单号
R
S;PZ5c0c"sr2EkR0notify_url 仅与 IPN 一起使用。发送 IPN Form. Post 的互联网 URL若鄰博客!L&D*JYf5O0a
return 您的客户完成付款后将返回的互联网 URL若鄰博客:Ut,X5Y9R
x8zF3G
cancel_return 您的客户取消付款后将返回的互联网 URL若鄰博客Z2mbpU$i ];A'I
image_url 您要用作图标的图片的互联网 URL,图片大小为 150 X 50 像素
r,Y~G%m#h%Il0cs 设置您的付款页面的背景色。如果设为 “1″,背景色将为黑色。该变量为可选项;如果省略或设为 “0″,背景色将为白色若鄰博客:M O;K:x
b
扩展变量
%bgwYA Blq*?0PayPal 允许您粘贴扩展变量,条件是将改变以下 “cmd” 值:<input type=”hidden” name=”cmd” value=”_xclick”> 到:若鄰博客O+p7b-?9Z:X
U%?y.]Zd2{4jc
s+g
p-b+E#}0<input type=”hidden” name=”cmd” value=”_ext-enter”>
Myf.V-C,x,Q0<input type=”hidden” name=”redirect_cmd” value=”_xclick”>
9O,b}^ZTq
sv1Lp0 若鄰博客qZ EtM)}
通过上述 “cmd” 值修改,您还可使用以下变量:若鄰博客}!X
D6i]&BC3n/`4g
扩展变量
OI[ ~o#t0email 客户的电子邮件地址若鄰博客{Q#b:K(}G_b
first_name 客户的名。必须是字母数字字符,最多为 32 个字符
'V@eu
g _
[ST-V0last_name 客户的姓。必须是字母数字字符,最多为 64 个字符若鄰博客0} GT^@Q#u c
address1 客户地址所在国家或地区。必须是字母数字字符,最多为 100 个字符若鄰博客AA)Or%d/x
address2 客户地址第二行。必须是字母数字字符,最多为 100 个字符若鄰博客*K8Hx-o]9e}"gGw+P
city 客户地址所在城市。必须是字母数字字符,最多为 100 个字符
PdFL$oJl|0state 客户地址所在州。必须是正式的 2 个字母缩写
Y[ ['}|-j
M3TZ0zip 客户地址的邮政编码
z+lEj.~&p4~0night_phone_a 客户夜间联系电话号码的区号
r I
g!b"_0night_phone_b 客户夜间联系电话号码前三位
!u2w9GY*h
bE6t0day_phone_a 客户白天联系电话号码的区号
S,]1y~%q#djw[8e0day_phone_b 客户白天联系电话号码前三位
{/Tu,Yt2@%|0
h&p8quftI0提示:若要更改”用户信息”中的默认运费和手续费设置,请转至您的用户信息,编辑您的运费计算,然后点击”允许采用基于交易的运费”复选框。若鄰博客$W?~0Lwk
将单个物品传递给PayPal
+_W'w;{#u0如果您的第三方购物车可设置成向PayPal传递单个物品,有关物品的信息将加入买家和卖家的记录日志和系统通知中。要加入该物品的信息,您需要将 HTML 格式元素粘贴至PayPal购物车流程的新版本。该过程与 #1 节”将总购物车数量传递给PayPal”描述的非常相似,不同之处在于:若鄰博客
RwnU
PX
将 “cmd” 变量设置到 “_cart”
!Fh;P0X;P5l0更换必要的 HTML 行若鄰博客-qd ?{9q1n`2fb
zE+G+x
F j+Zl
e+V~0<input type=”hidden” name=”cmd” value=”_xclick”> 与<input type=”hidden” name=”cmd” value=”_cart”>若鄰博客gb1pym"].o*QE}d
若鄰博客-AZ,Cww;R%x&[
添加称为 “upload” 的新变量
d Y9r;rI.LF:L0在 <表格> 和 </表格> 标签之间新增以下行:<input type=”hidden” name=”upload” value=”1″>若鄰博客!CMqL#Nt7?LC"P(h
)[ljX]~5{2T0定义物品明细
~1^'J8a!N,O(QYh0x}0对于以下各特定物品参数,定义与通过您的合作商购物车购买的各物品对应的一组新值。将 “_x” 附加到变量名称,其中 x 是物品号码,从 1 开始,每加入一物品增加一。
3kU A'm8M/j:ea*v0item_name_x (物品 #x 需要)购物车中物品 #x 的名称。必须是字母数字字符,最多为 127 个字符
s2SL.} WS;YEb0item_number_x 与购物车中物品 #x 关联的可选传递变量。必须是字母数字字符,最多为 127 个字符若鄰博客1tq+cqDh
amount_x (物品 #x 需要)物品 #x 的价格若鄰博客L
\1x9sR0xA%q
shipping_x 运送物品 #x 的第一件(数量 1)的成本若鄰博客H+|+D9S\j4p.q0M
shipping2_x 每增加一件运送物品 #x(数量 2 或更多)所需的运送成本若鄰博客6Oz?#\-]E
handling_x 物品 #x 的处理成本若鄰博客r6m
R{n&F
on0_x 物品 #x 的第一选项栏名称。最多 64 个字符若鄰博客9^ S9_5Yk/q'Q
os0_x 物品 #x 的第一组选项值。最多 200 个字符。”on0_x” 必须定义,以便识别 “os0_x”。若鄰博客S4X ?5dgbl;Mm
on1_x 物品 #x 的第二选项栏名称。最多 64 个字符若鄰博客j(Q-y.x8L9c r5Vz
os1_x 物品 #x 的第二组选项值。最多 200 个字符。”on1_x” 必须定义,以便识别 “os1_x”。
为购物车中每件物品重复此设定
y]z%xmi*JS0为您的买家购物车中的各物品加入以上表格中的一组必需的变量和任何选项变量。购物车中的第一物品必须用以 “_1″ 结束的参数定义,如 “item_name_1″、”amount_1″ 等。同样,第二物品应用变量 “item_name_2″、”amount_2″ 等命名。提示:”_x” 值必须以一为单位按序递增,以便识别。如果从 item #1 跳到 item #3 而不定义 item #2,则第三个物品会被忽略。若鄰博客
C|0\$id
要指定币种:所有货币变量(金额、运费、运费 2、手续费、税款)将以粘贴在付款上的 “currency_code” 变量指定的币种显示。因为其不是随物品不同的,无需向变量名称附加 “_x”。如果没有粘贴 “currency_code” 变量,我们将假定所有货币变量值为美元。若鄰博客$w'x6YP:n&q`8a
若鄰博客U8?u H8f!va@K {本文来自:EricBess.com 详细出处参考:http://www.ericbess.com/ericblog/2008/03/11/paypal-php/2/若鄰博客+u6M0J2q1Om;m

