首页 >

paypal php 对接

php教程|php手册paypal php 对接
paypal php,编程,代码,开源,编程语言,软件开发
php教程-php手册
项目需要要在php中使用paypal支付。
织梦美女网源码,vscode数据处理,ubuntu 生成ssh,tomcat网站登录,sqlite创建数据类型,jquery数字滚动插件,学一个前端框架要多久,新电脑如何下载爬虫软件,php 数组排序 按值,怎么用谷歌seo,ecshop网站搬家,psd模板怎么做成网页,网络日记本模板lzw
先吐槽下paypal,以前做过国内的一些支付接口,有些经验。想到的是直接找paypal客服要接口文档。
秒支付宝的源码,ubuntu下载fq套件,脸部爬虫子图片,php ip存储,seo营销知识lzw
尼玛加paypal客服QQ  不在线。几天如此。这么大的支付居然没技术支持,真不能理解。文档后面还是在官网7找8找才找到了。
nshop源码下载,vscode怎么插入图片,ubuntu 查找历史,tomcat 动态看日志,sqlite3数据库教程,爬虫对人工智能有用吗论文,nginx php 缓存,湖北全新seo代运营,食零网站模板,wordpress模板函数lzw
 

正文:

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

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

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

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

 

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

 //告诉paypal该表单是立即购买 //卖家帐号  也就是收钱的帐号 //商品名称 //价格 //币种 //支付成功后网页跳转地址 //支付成功后paypal后台发送订单通知地址
//自定义订单号 paypal原样返回
// 自定义变量 paypal原样返回
//支付页面语言设置
//支付按钮
当支付成功后 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 ("

Thank you for you purchase!

"); echo ("Payment Details:
\n"); echo ("Name: $name\n"); echo ("Item: $itemname\n"); echo ("Amount: $amount\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进行验证,以防请求是伪造的。

代码:

 $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就会自动设置接收该币种功能。

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