paypal php 对接

来源:互联网 发布:iphone4屏幕解锁软件 编辑:程序博客网 时间:2024/06/04 18:52

首先要在sandbox环境申请主帐号。连接:https://developer.paypal.com/

申请后用主帐号登录申请卖家以及买家帐号。然后进行一些设置。

注意:如果买家是国外的,那么创建买家帐号的时候就要设置所在国家。这样在支付页面才会以该国家的语言显示界面。

支付过程首先第一步是提交表单给paypal 当然post方式。

<form id="form_starPay" name="form_starPay" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post"><code class="html comments"><!--测试www.sandbox.paypal.com,正式www.paypal.com--></code><input type="hidden" name="cmd" value="_xclick"> //告诉paypal该表单是立即购买<input type="hidden" name="business" value="XXXXXX@XXXXX.com"> //卖家帐号  也就是收钱的帐号<input type="hidden" name="item_name" value="name"> //商品名称<input type="hidden" name="amount" value="10000"> //价格<input type="hidden" name="currency_code" value="JPY"> //币种<input type="hidden" name="return" value="http://localhost/frontend/pay/PDT_order"> //支付成功后网页跳转地址<input type="hidden" name="notify_url" value="http://localhost/frontend/pay/IPN_Order"> //支付成功后paypal后台发送订单通知地址<input type="hidden" name="invoice" value=""> //自定义订单号   paypal原样返回<input type="hidden" name="custom" value=""> // 自定义变量  paypal原样返回<input type="hidden" name="lc" value="JP"> //支付页面语言设置<input style="visibility:hidden" type="image" src=" https://www.paypal.com/en_US/i/btn/btn_buynow_LG.gif " border="0" name="submit" alt=" PayPal - The safer, easier way to pay online">//支付按钮</form>

当支付成功后 paypal就会跳转到我们设置的 “return” 地址,会带上一个流水号 我们get方式就可以取到值。流水号键名 “tx”。

拿到流水号然后加上身份标识跟cmd变量就可以到paypal请求刚才支付的订单的交易内容。

例如:cmd=_notify-synch&tx=123sflsfjlw12&tx_token=fsfljvw3lwejloj43jfvdflf2

cmd=_notify-synch是告诉paypal你要做什么,这里是查询订单交易。

tx_token值要在paypal后台取,刚才注册帐号的时候要开通pdt功能才行。

这个过程paypal称为:PDT (Payment Data Transfer 付款数据传输)。

我们接收到返回的一些数据后就可以进行一些支付后的操作,比如发金币,发货等等。

pdt 详细的返回参数最后给出文档。

代码:

<?php //获取 PayPal 交易流水号 tx $tx_token = $_GET['tx']; //定义您的身份标记 $auth_token = "CHANGE-TO-YOUR-TOKEN"; //形成验证字符串 $req = " cmd=_notify-synch&tx=$tx_token&at=$auth_token"; //将交易流水号及身份标记返回 PayPal 验证 $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type: application/x-www-form-urlencoded\r\n"; $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30); if (!$fp) { // HTTP ERROR } else { fputs ($fp, $header . $req); //获取返回数据 $res = ''; $headerdone = false; while (!feof($fp)) { $line = fgets ($fp, 1024); if (strcmp($line, "\r\n") == 0) { //获取头 $headerdone = true; }else if ($headerdone){ //获取主体内容 $res .= $line; } } //解析获取内容 $lines = explode("\n", $res); $keyarray = array(); if (strcmp ($lines[0], "SUCCESS") == 0) { for ($i=1; $i<count($lines);$i++){ list($key,$val) = explode("=", $lines[$i]); $keyarray[urldecode($key)] = urldecode($val); } //检查交易付款状态 payment_status 是否为  „Completed‟ //检查交易流水号 txn_id 是否已经被处理过 //检查接收 EMAIL receiver_email 是否为您的 PayPal 中已经注册的 EMAIL //检查金额 mc_gross 是否正确 //…… //处理此次付款明细 //该付款明细所有变量可参考: //https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html $name = $keyarray['first_name'] . ' ' . $keyarray['last_name']; $itemname = $keyarray['item_name']; $amount = $keyarray['mc_gross']; echo ("<p><h3>Thank you for you purchase!</h3></p>"); echo ("<b>Payment Details:</b><br>\n"); echo ("<li>Name: $name</li>\n"); echo ("<li>Item: $itemname</li>\n"); echo ("<li>Amount: $amount</li>\n"); }else if (strcmp ($lines[0], "FAIL") == 0) { //获取付款明细失败,记录并检查 } } fclose ($fp); ?>

为了防止用户关掉浏览器,订单通知不到的情况。paypal还提供了一种通知方式:IPN (Instant Payment Notification 即时付款通知);

IPN 是在后台进行http请求通知。

当开通了ipn功能,并且订单状态发生改变的时候,paypal会主动请求我们支付表单中变量“notify_url”提供的地址。

我们在接收到paypal请求后要拿到所有的数据

然后用 “cmd=_notify-validate”加上刚才的数据,http发送给paypal进行验证,以防请求是伪造的。

代码:

<?php //从 PayPal 出读取 POST 信息同时添加变量„cmd‟ $req = 'cmd=_notify-validate'; foreach ($_POST as $key => $value) { $value = urlencode(stripslashes($value)); $req .= "&$key=$value"; } //建议在此将接受到的信息记录到日志文件中以确认是否收到 IPN 信息 //将信息 POST 回给 PayPal 进行验证 $header .= "POST /cgi-bin/webscr HTTP/1.0\r\n"; $header .= "Content-Type:application/x-www-form-urlencoded\r\n"; $header .= "Content-Length:" . strlen($req) ."\r\n\r\n"; //在 Sandbox 情况下,设置: //$fp = fsockopen(„www.sandbox.paypal.com‟,80,$errno,$errstr,30); $fp = fsockopen ('www.paypal.com', 80, $errno, $errstr, 30); //将 POST 变量记录在本地变量中 //该付款明细所有变量可参考: //https://www.paypal.com/IntegrationCenter/ic_ipn-pdt-variable-reference.html $item_name = $_POST['item_name']; $item_number = $_POST['item_number']; $payment_status = $_POST['payment_status']; $payment_amount = $_POST['mc_gross']; $payment_currency = $_POST['mc_currency']; $txn_id = $_POST['txn_id']; $receiver_email = $_POST['receiver_email']; $payer_email = $_POST['payer_email']; //… //判断回复 POST 是否创建成功 if (!$fp) { //HTTP 错误 }else { //将回复 POST 信息写入 SOCKET 端口 fputs ($fp, $header .$req); //开始接受 PayPal 对回复 POST 信息的认证信息 while (!feof($fp)) { $res = fgets ($fp, 1024); //已经通过认证 if (strcmp ($res, "VERIFIED") == 0) { //检查付款状态 //检查 txn_id 是否已经处理过 //检查 receiver_email 是否是您的 PayPal 账户中的 EMAIL 地址 //检查付款金额和货币单位是否正确 //处理这次付款,包括写数据库 }else if (strcmp ($res, "INVALID") == 0) { //未通过认证,有可能是编码错误或非法的 POST 信息 } } fclose ($fp); } ?>

接口对接就这样好了,搞清楚了流程很简单。

如果币种不是paypal默认的,在订单支付后订单状态一直是pending, 用卖家帐号登录在订单状态哪里点击接收,paypal就会自动设置接收该币种功能。


附:

PayPal快速、安全而又方便,是跨国交易的首选在线付款方式。现在PayPal可以和国内大部分信用卡关联,可以实现国人的跨国交易收支。

申请PayPal注册网址:https://www.paypal.com/

 

paypal接口与其它接口有些不同,稍微复杂一点。 其实银行接口也算是一个站点的插件。

 

所谓paypal ipn(Instant PaymentNotification),就是Paypal开发的一种能主动通知第三方卖家系统交易状态的一种机制。IPN的原理很简单,

 

就是当产生了一个交易之后, 交易状态发生变化时,如用户已经付款、或者退款、撤销时,Paypal利用常用的HTTPPOST方式,将交易的一些变量提

 

交给网站的某个页面(称之为IPNHandler),当这个页面接受到请求时候,将这些数据原封不动加上一个指示验证的cmd=_notify-validate,POST

 

回Paypal的接口地址,如果数据正确,那么Paypal返回字符串VERIFIED,否则为INVALID,如果结果为VERIFIED,那么你的程序就可以使用这些数

 

据进行操作。

 

开设Sandbox帐号

但代码的调试是一件很痛苦的事情,因为作为第三方开发人员,不可能开两个帐号,每次测试还要之间交易一些钱,所以Paypal专门开发了Sandbox

 

给 开发人员进行开发,首先到https://developer.paypal.com/注册一个开发帐号,好了之后再进入Sandbox建立测试用的Paypal虚拟帐号(至少应

 

该建立一个Business的和一个Personal的),这种账号注册方法和Paypal的流程一样,信息可以是假的,包括银行帐号、信用卡(其实Paypal 

 

Sandbox会自动生成一些随机的号码)。接下来需要激活Paypal Sandbox的虚拟帐号,注意,这里不管你在PaypalSanbox注册时填什么邮件地址,有

 

任何发送到虚拟帐号所填邮箱的邮件都存会在开发帐号的管理界面中的Email页(导航栏上有)中。登录Sandbox的虚拟Paypal环境,还需要验证虚

 

拟帐号的银行,这里可以随便填,然后通过Add Funds来给账户充值(想填多少填多少 920-203 920-533)。然后,还需要激活IPN的选项,在

 

Business的那个账户的Profile设置页面中,点击,然后点击Edit按钮,打开IPN,这里如果你使用 的是固定的IPNHandle,可以直接将地址填入。

 

接下来,我们测试的时候,应该将Paypal接口的地址设置为https://www.sandbox.paypal.com/cgi-bin/webscr

 

基本的流程

当客户向您付款时,PayPal将向位于指定 URL (type=”hidden” name=”notify_url”value=” “)的服务器发送一个通知。此通知中将包括您的

 

客户的所有付款信息(例如,客户名称、金额),以及一段加密代码。当服务器收到通知时,它随后会将该信息(包括加密代码)发送回安全的

 

PayPal URL。PayPal将通过检查加密字符串对交易进行身份验证。这种将 IPN数据传回PayPal的操作防止了“欺骗”,因此您可以确保 IPN 来自

 

PayPal。在进行验证时,PayPal会将其合法性的确认信息发送回您的服务器。

 

提示:要启用即时付款通知,您将需要输入一个 URL,通过它您可以接收到来自您的用户信息的通知。

 

启用了即时付款通知后,每次当您接收付款时您的服务器都会收到一个通知,此通知将以隐藏的“FORM POST”的方式发送到指定的URL,并将包括

 

所有付款信息。此页面的底部列出了通知的 FORM 变量。

每次收到来自PayPal的 IPN 时,您必须在实施订单之前完成如下所述的通知确认过程。确认列出的信息将可确保交易合法。

 

通知确认IPN

为了确保付款已进入您的PayPal账户,您必须验证用作“receiver_email”的电子邮件地址是否已在您的PayPal账户中注册并得到确认。

 

服务器收到即时付款通知后,您将需要通过构建一个发送到PayPal的 HTTP POST 对其进行确认。您的 POST应发送到 

 

https://www.paypal.com/cgi-bin/webscr

 

您必须完全按照收到表单变量时的原样发送所有收到的表单变量。您还需要将一个值为“_notify-validate”的名为“cmd”变量(例如,

 

cmd=_notify-validate)附加到 POST 字符串。

 

PayPal将回复该 POST,并在回复的正文中包含一个单词“VERIFIED”或“INVALID”。当您收到 VERIFIED回复时,您需要在实施订单之前执行若干

 

检查:

 

确认“payment_status”为“Completed”,因为系统也会为其他结果(如“Pending”或“Failed”)发送IPN。检查“txn_id”是否未重复,以防

 

止欺诈者重复使用旧的已完成的交易。验证“receiver_email”是已在您的PayPal账户中注册的电子邮件地址,以防止将付款发送到欺诈者的账户 

 

。检查其他交易详情(如物品号和价格),以确认价格未改变完成了以上检查后,您可以使用 IPN数据更新您的数据库,并处理购物。

如果收到“无效”通知,则应将其视为可疑通知,并应对其进行调查。

 

主要参数:

向PayPal提交粘贴代码时,应包括以下 4 个隐藏变量及一张图片,这就是说,您粘贴到PayPal的最短必需代码应如下:

 

 

 

// "_xclick"立即购买

 

//PayPal账户上的电子邮件地址

 

//物品名称(或购物车名称)

 

//定义币种以标示货币变量 值可以为"USD"、"EUR"、"GBP"、"CAD"、"JPY"。 

 

//物品的价格(购物车中所有物品的总价格,因为是_Xclick模式)

 

 

 

 

 

可用变量

business 您的PayPal账户上的电子邮件地址

quantity 物品数量。大于 1 时,会与金额相乘

item_name 物品名称(或购物车名称)。必须是字母数字字符,最多为 127 个字符

item_number 用于跟踪付款的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount 物品的价格(购物车中所有物品的总价格)

shipping 该物品的运送成本

shipping2 每增加一件物品所需的运送成本

handling 手续费

tax 基于交易的税额。如果使用该变量,传递值将覆盖所有用户信息税收设置(不管买家所在位置)。

no_shipping 送货地址。如果设为 "1",则不会要求您的客户提供送货地址。该变量为可选项;如果省略或设为"0",将提示您的客户输入送货地址

cn 可选标签,会在提示栏上显示(最多 40 个字符)

no_note 为付款加入提示。如果设为 "1",则不会提示您的客户输入提示。该变量为可选项;如果省略或设为"0",将提示您的客户输入提示。

on0 第一选项栏名称。最多 64 个字符

os0 第一组选项值。最多 200 个字符。"on0" 必须定义,以便识别 "os0"。

on1 第二选项栏名称。最多 64 个字符

os1 第二组选项值。最多 200 个字符。"on1" 必须定义,以便识别 "os1"。

custom 决不会向您的客户显示的可选转递变量。可用于跟踪存货

invoice 决不会向您的客户显示的可选转递变量。可用于跟踪账单号

notify_url 仅与 IPN 一起使用。发送 IPN Form Post 的互联网 URL

return 您的客户完成付款后将返回的互联网 URL

cancel_return 您的客户取消付款后将返回的互联网 URL

image_url 您要用作图标的图片的互联网 URL,图片大小为 150 X 50 像素

cs 设置您的付款页面的背景色。如果设为 "1",背景色将为黑色。该变量为可选项;如果省略或设为 "0",背景色将为白色

 

扩展变量

PayPal 允许您粘贴扩展变量,条件是将改变以下 "cmd" 值:

到:

 

通过上述 “cmd” 值修改,您还可使用以下变量:

 

扩展变量

email 客户的电子邮件地址

first_name 客户的名。必须是字母数字字符,最多为 32 个字符

last_name 客户的姓。必须是字母数字字符,最多为 64 个字符

address1 客户地址所在国家或地区。必须是字母数字字符,最多为 100 个字符

address2 客户地址第二行。必须是字母数字字符,最多为 100 个字符

city 客户地址所在城市。必须是字母数字字符,最多为 100 个字符

state 客户地址所在州。必须是正式的 2 个字母缩写

zip 客户地址的邮政编码

night_phone_a 客户夜间联系电话号码的区号

night_phone_b 客户夜间联系电话号码前三位

day_phone_a 客户白天联系电话号码的区号

day_phone_b 客户白天联系电话号码前三位

 

提示:若要更改”用户信息”中的默认运费和手续费设置,请转至您的用户信息,编辑您的运费计算,然后点击”允许采用基于交易的运费”复选框

 

 

 

将单个物品传递给PayPal

如果您的第三方购物车可设置成向PayPal传递单个物品,有关物品的信息将加入买家和卖家的记录日志和系统通知中。要加入该物品的信息,您需

 

要将 HTML 格式元素粘贴至PayPal购物车流程的新版本。该过程与 #1节"将总购物车数量传递给PayPal"描述的非常相似,不同之处在于:

 

将 "cmd" 变量设置到 "_cart"

更换必要的 HTML 行

 

添加称为 “upload” 的新变量

在 <表格> 和 标签之间新增以下行:

 

定义物品明细

对于以下各特定物品参数,定义与通过您的合作商购物车购买的各物品对应的一组新值。将 “_x” 附加到变量名称,其中 x是物品号码,从 1 开

 

始,每加入一物品增加一。

 

item_name_x (物品 #x 需要)购物车中物品 #x 的名称。必须是字母数字字符,最多为 127 个字符

item_number_x 与购物车中物品 #x 关联的可选传递变量。必须是字母数字字符,最多为 127 个字符

amount_x (物品 #x 需要)物品 #x 的价格

shipping_x 运送物品 #x 的第一件(数量 1)的成本

shipping2_x 每增加一件运送物品 #x(数量 2 或更多)所需的运送成本

handling_x 物品 #x 的处理成本

on0_x 物品 #x 的第一选项栏名称。最多 64 个字符

os0_x 物品 #x 的第一组选项值。最多 200 个字符。”on0_x” 必须定义,以便识别 “os0_x”。

on1_x 物品 #x 的第二选项栏名称。最多 64 个字符

os1_x 物品 #x 的第二组选项值。最多 200 个字符。”on1_x” 必须定义,以便识别 “os1_x”。

 

为购物车中每件物品重复此设定

为您的买家购物车中的各物品加入以上表格中的一组必需的变量和任何选项变量。购物车中的第一物品必须用以 “_1″结束的参数定义,如 

 

“item_name_1″、”amount_1″ 等。同样,第二物品应用变量 “item_name_2″、”amount_2″等命名。提示:”_x” 值必须以一为单位按序递

 

增,以便识别。如果从 item #1 跳到 item #3 而不定义 item #2,则第三个物品会被忽略。

 

要指定币种:所有货币变量(金额、运费、运费 2、手续费、税款)将以粘贴在付款上的 “currency_code”变量指定的币种显示。因为其不是随

 

物品不同的,无需向变量名称附加 “_x”。如果没有粘贴 “currency_code”变量,我们将假定所有货币变量值为美元。

 

 

PayPay API

PayPal提供了多个API接口供开发者使用。在使用API之前,你必须先申请一个高级个人账户或者企业账户,同时你必须获取API凭证供每次调用API 

 

时使用。

一旦你获取了API凭证,您就可以调用相关的API接口了。目前,我们提供两种API接口方式,NVP和SOAP。一般来说我们推荐您使用NVP 接口。

• Name-Value Pair(NVP)接口 –请求和响应都是使用简单的HTTP。该接口简单易实现,适合于初级开发者和需要快速完成集成的人员;

• SOAP接口 - 请求和响应都是通过SOAP来完成。该接口适合于面向对象工程的开发;

 

PayPal API:NVP(名称/值对)接口

通过NVPAPI接口,您只需给PayPal发送一个HTTP请求,并通过“名称=值”的形式指定请求参数,即可充分利用PayPal的API功能。

 

NVP API 是 PayPal 的业务功能、风险管理和业务逻辑的简单接口。NVP API 最基本的使用方法是通过到PayPal 服务器的 HTTPS 连接发送一个 

 

NVP 字符串,然后处理响应(也是一个 NVP 字符串)。执行 NVP API 调用的基本步骤如下:

 

• 为特定的 API 方法构造一个请求参数字符串。

• 通过 HTTPS 连接向 PayPal 服务器发送这个参数字符串。

• 处理服务器响应中的 NVP。

 

每个NVPAPI请求字符串包含有API用户名、API密码、所要调用API的名称及用来标识交易的令牌,如: 

 

USER=someone@unknowncompany.com&PWD=mypassword&METHOD=GetExpressCheckoutDetails&TOKEN=EC-23T233ZP3DFB...

 

成功的应答包含以下要素:ACK=Success ,以及一个用来标识交易的唯一令牌。ACK=Success&TIMESTAMP=date/timeOfResponse 

 

&CORRELATIONID=debuggingToken&VERSION=2.300000&BUILD=buildNumber&TOKEN=EC-3DJ78083ES565113B&EMAIL=abcdef@anyemail.com 

 

&PAYERID=95HR9CM6D56Q2&PAYERSTATUS=verified&FIRSTNAME=John&LASTNAME=Smith...

 

您可以使用NVP API完成以下操作:

• 搜索已完成的交易记录,以及查询交易详情;

• 自动化后端功能,例如,捕获授权,以及处理退款等;

 

API Profile

进入商家账号得到相应的APIProfile,如果是以中文语言查看,在-用户信息-API访问-中得到,其中里面申请API时,有两个选项,第一个是用签名

 

的方式,第二种是以证书的方式来认证商家身份,当你选择下载数字证时,可以到www.paypaltech.com/tools/pem2p12.php转换为.p12文件,也可以

 

采用OpenSSL的命令完成,一句话搞定,要输入密码喔~。这里的链接有详细说明www.paypal.com/IntegrationCenter/ic_certificate.html

 

相应参考资料请参考连接www.paypal.com/IntegrationCenter/ic_expresscheckout.html了解关于Express Checkout的原理;

在此基础上,你可以访问www.paypal.com/IntegrationCenter/ic_nvp.html获取相关测试代码;

关于PayPal的测试环境你可以访问www.paypal.com/IntegrationCenter/ic_sandbox.html,

API Referencehttps://www.paypal.com/IntegrationCenter/ic_api-reference.html




1 0
原创粉丝点击