Paypal接口的PHP实现方案

转载地址:http://www.lamp99.com/paypal-php-butt.html


项目需要要在php中使用paypal支付。之前本站也提供了很多的PayPal的资料,有网上分享的,也有个人经验,好吧,正题,

先吐槽下paypal,以前做过国内的一些支付接口,有些经验。想到的是直接找paypal客服要接口文档。

尼玛加paypal客服QQ 不在线。几天如此。这么大的支付居然没技术支持,真不能理解。文档后面还是在官网7找8找才找到了。

正文:

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

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

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

申请帐号以及设置问题请参考文档 连接:https://www.paypal-biz.com/development/documentation/PayPal_Sandbox_Guide_CN_V2.0.pdf

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

01 <form id="form_starPay" name="form_starPay" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
02 <input type="hidden" name="cmd" value="_xclick">//告诉paypal该表单是立即购买
03 <input type="hidden" name="business" value="XXXXXX@XXXXX.com">//卖家帐号  也就是收钱的帐号
04 <input type="hidden" name="item_name" value="name">//商品名称
05 <input type="hidden" name="amount" value="10000">//价格
06 <input type="hidden" name="currency_code" value="JPY">//币种
07 <input type="hidden" name="return" value="http://localhost/frontend/pay/PDT_order"> //支付成功后网页跳转地址
08 <input type="hidden" name="notify_url" value="http://localhost/frontend/pay/IPN_Order"> //支付成功后paypal后台发送订单通知地址
09 <input type="hidden" name="invoice" value="">//自定义订单号   paypal原样返回
10 <input type="hidden" name="custom" value="">// 自定义变量  paypal原样返回
11 <input type="hidden" name="lc" value="JP">//支付页面语言设置
12 <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">//支付按钮
13 </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 详细的返回参数最后给出文档。

代码:

01 //获取 PayPal 交易流水号 tx
02 $tx_token =$_GET['tx'];
03 //定义您的身份标记
04 $auth_token ="CHANGE-TO-YOUR-TOKEN";
05 //形成验证字符串
06 $req =" cmd=_notify-synch&tx=$tx_token&at=$auth_token";
07 //将交易流水号及身份标记返回 PayPal 验证
08 $header .="POST /cgi-bin/webscr HTTP/1.0\r\n";
09 $header .="Content-Type: application/x-www-form-urlencoded\r\n";
10 $header .="Content-Length: " .strlen($req) ."\r\n\r\n";
11 $fp =fsockopen ('www.paypal.com', 80,$errno,$errstr, 30);
12 if (!$fp) {
13 // HTTP ERROR
14 }else {
15 fputs ($fp,$header .$req);
16 //获取返回数据
17 $res ='';
18 $headerdone = false;
19 while (!feof($fp)) {
20 $line =fgets ($fp, 1024);
21 if (strcmp($line,"\r\n") == 0) {
22 //获取头
23 $headerdone = true;
24 }else if ($headerdone){
25 //获取主体内容
26 $res .=$line;
27 }
28 }
29 //解析获取内容
30 $lines =explode("\n",$res);
31 $keyarray =array();
32 if (strcmp ($lines[0],"SUCCESS") == 0) {
33 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="" 中已经注册的="" 检查金额="" 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></p>");
34 echo ("<b>Payment Details:</b><br>\n");
35 echo ("<li>Name: $name</li>\n");
36 echo ("<li>Item: $itemname</li>\n");
37 echo ("<li>Amount: $amount</li>\n");
38 }else if (strcmp ($lines[0],"FAIL") == 0) {
39 //获取付款明细失败,记录并检查
40 }
41 }
42 fclose ($fp);
43 </count($lines);$i++){>

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

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

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

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

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

代码:

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

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

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

技术文档地址:https://www.paypal-biz.com/developer/documentation/2134.html


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PP_IPN_PDT_Guide_CHN.pdf Paypal的IPN和PDT变量对照表(中文版) Instant Payment Notification (即时付款通知) & Payment Data Transfer (付款数据传输) 说明 目录 1 付款数据传输 PDT.....................................................................................................................3 1.1 什么是PDT........................................................................................................................3 1.2 如何启用PDT...................................................................................................................3 1.3 PDT 示例代码....................................................................................................................6 1.3.1 PDT for PHP 示例代码...........................................................................................6 1.3.2 PDT for ASP 示例代码............................................................................................7 2 即时付款通知 IPN ....................................................................................................................10 2.1 什么是即时付款通知 IPN .............................................................................................10 2.2 如何启用IPN? ..............................................................................................................11 2.3 通知确认 - 给PayPal 的HTTPS 回发.........................................................................12 2.4 处理IPN 的示例代码.....................................................................................................13 2.4.1 IPN for JAVA 示例代码........................................................................................13 2.4.2 IPN for Perl 示例代码..........................................................................................14 2.4.3 IPN for PHP 示例代码.........................................................................................16 2.4.4 IPN for ASP/VBScript 示例代码.........................................................................17 2.4.5 IPN for .NET/VB 示例代码.................................................................................18 2.4.6 IPN for .NET/C# 示例代码..................................................................................19 3 集成PayPal 建议........................................................................................................................21 4 附录5:IPN 和PDT 变量列表.................................................................................................21

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值