设为首页 收藏本站
查看: 853|回复: 0

[经验分享] paypal php 对接

[复制链接]

尚未签到

发表于 2015-8-23 04:09:59 | 显示全部楼层 |阅读模式
  项目需要要在php中使用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方式。



<form id="form_starPay" name="form_starPay" action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
<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 是否为  &bdquo;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 信息同时添加变量&bdquo;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(&bdquo;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
  
  
  
  
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-102772-1-1.html 上篇帖子: PHP的学习--PHP加密 下篇帖子: as3+php上传图片的三种方式
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表