写在前面

近期由于要开发公司外贸商城,需要对接Paypal支付。在开发过程中发现有好多坑。文档都是英文文档(主要还是自己英文水平不过关)、网上找的那些翻译过的文档老旧、沙箱环境网站卡的要让人崩溃。整个过程真是让人头大,经过各种翻天覆地的百度、google、论坛终于功夫不负有心人跑通了。下面就结合网上的文档给大家说说如何开发Paypal支付(一个Demo),避免大家在踩坑。

一、准备工作

  1. 登录 https://www.paypal.com/ 注册一个主账号(选择个人账号、企业账后都可)
  2. 申请完成后登录https://developer.paypal.com/ 在后台右侧菜地点击“Accounts”,可以看到系统自动给分配的两个沙箱环境的账号。类型为Personal是个人账号、类型为Business是商家账号。点进去可以看到密码
  3. 开启PDT设置同步回调地址(这步拿到at_token return回调使用)
  • 用系统分配的卖家账号登录沙箱地址https://www.sandbox.paypal.com/
  • 右上角用户名下来会弹出一个"Account Settings"
  • 点击“网站付款”->“网站习惯设定”->“更新”
  • 自动返回:开启,url填写return(同步回调地址)
  • 付款数据传输:开启
  1. 激活沙箱企业帐户。注意:这步非常重要否则无法收到收款信息。
  • 用系统分配给你的卖家账号登录沙箱环境地址https://www.sandbox.paypal.com/
  • 右上角用户名下来会弹出一个"Profile Settings"
  • 点击“登录和安全”->“邮箱地址”->“更新”
  • 点击邮箱进行验证
  • 登录你的paypal真实主账号https://developer.paypal.com/
    左侧菜单中选择“notifications”,会看到一条激活的邮件,点击进行激活就可以了

二、支付开发

  1. 项目根目录下创建index.html文件
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Paypal订单支付</title>
</head>
<body>
<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="POST"  name="form_starPay"> <!-- // Live https://www.paypal.com/cgi-bin/webscr --><input type='hidden' name='cmd' value='_xclick'>  <!-- //告诉paypal该表单是立即购买 --><input type='hidden' name='business' value='paypal-facilitator@usr.cn'> <!-- //卖家帐号 也就是收钱的帐号 --><input type='hidden' name='item_name' value='支付订单:20180828080706000039'> <!-- //商品名称 item_number --><input type='hidden' name='item_number' value='20180828080706000033'> <!-- //物品号 item_number --><input type='hidden' name='amount' value='0.01'> <!-- .// 订单金额 --><input type='hidden' name='shipping' value='0.01'> <!-- .// 运费 --><input type='hidden' name='currency_code' value='USD'> <!-- .// 货币 --><input type='hidden' name='return' value='http://XXX.XXX.XX/paypal2/return.php'> <!-- .// 支付成功后网页跳转地址 --><input type='hidden' name='notify_url' value='http://XXX.XXX.XX/paypal2/notify.php'> <!-- .//支付成功后paypal后台发送订单通知地址 --><input type='hidden' name='cancel_return' value='http://XXX.XXX.XX/paypal2/cancel.php'> <!-- .//用户取消交易返回地址 --><input type='hidden' name='invoice' value='20180828080706000026'> <!-- .//自定义订单号 --><input type='hidden' name='charset' value='utf-8'> <!-- .// 字符集 --><input type='hidden' name='no_shipping' value='1'> <!-- .// 不要求客户提供收货地址 --><input type='hidden' name='no_note' value='1'> <!-- .// 付款说明 --><input type='hidden' name='rm' value='2'> <!-- 不知道是什么 --><input type='hidden' name='custom' value='paypal'> <!-- 自定义字段 -->
</form>
正在跳转Paypal支付,请稍等。。。
<script>function sub(){document.form_starPay.submit();}onload(sub());
</script>
</body>
</html>
  1. 项目根目录下创建notify.php文件
<?phpif(!$_POST) die();//记录支付回调信息if(!empty($_POST)){$notify_str = "paypal:\r\n";foreach ($_POST as $key => $value) {$notify_str.=$key."=".$value.";\r\n";}}writelog($notify_str);//ipn验证$data = $_POST;$data['cmd'] = '_notify-validate';//$url = 'https://www.paypal.com/cgi-bin/webscr';//支付异步验证地址$url = 'https://www.sandbox.paypal.com/cgi-bin/webscr';//支付异步验证地址writelog('data:'.$data);$res = https_request($url,$data);//记录支付ipn验证回调信息writelog('info:'.$res);if (!empty($res)) {if (strcmp($res, "VERIFIED") == 0) {if ($_POST['payment_status'] == 'Completed' || $_POST['payment_status'] == 'Pending') {//付款完成,这里修改订单状态
//                $order_res = $this->order_pay($_POST);$order_res = 1;if(!$order_res){writelog('update order result fail');}writelog('success');}} elseif (strcmp($res, "INVALID") == 0) {//未通过认证,有可能是编码错误或非法的 POST 信息writelog('fail');}} else {//未通过认证,有可能是编码错误或非法的 POST 信息writelog('fail');}function writelog($loginfo)
{$file = 'log/tongbu_' . date('y-m-d') . '.log';if (!is_file($file)) {file_put_contents($file, '', FILE_APPEND);//如果文件不存在,则创建一个新文件。}$contents = $loginfo . "\r\n";file_put_contents($file, $contents, FILE_APPEND);
}function https_request($url,$data=null){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_AUTOREFERER, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$tmpInfo = curl_exec($ch);if (curl_errno($ch)) {return curl_error($ch);}curl_close($ch);return $tmpInfo;}
?>

3.项目根目录下创建return.php文件

<?php
/*** Created by PhpStorm.* User: yangyi* Date: 2020/8/14* Time: 15:31*/
//获取 PayPal 交易流水号 tx$tx = $_GET['tx'];$at_token = '身份标记'; //your_pdt_identity_token// Init cURL$request = curl_init();// Set request optionscurl_setopt_array($request, array(// CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr',//测试CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr',//正式CURLOPT_POST => TRUE,CURLOPT_POSTFIELDS => http_build_query(array('cmd' => '_notify-synch','tx' => $tx,'at' => $at_token,)),CURLOPT_RETURNTRANSFER => TRUE,CURLOPT_HEADER => FALSE//,// CURLOPT_SSL_VERIFYPEER => TRUE,// CURLOPT_CAINFO => 'cacert.pem',));// Execute request and get response and status code$response = curl_exec($request);$status = curl_getinfo($request, CURLINFO_HTTP_CODE);// Close connectioncurl_close($request);// echo $status;// var_dump($response);if($status == 200 AND strpos($response, 'SUCCESS') === 0){// Remove SUCCESS part (7 characters long)$response = substr($response, 7);// Urldecode it$response = urldecode($response);// Turn it into associative arraypreg_match_all('/^([^=\r\n]++)=(.*+)/m', $response, $m, PREG_PATTERN_ORDER);$response = array_combine($m[1], $m[2]);// Fix character encoding if neededif(isset($response['charset']) AND strtoupper($response['charset']) !== 'UTF-8'){foreach($response as $key => &$value){$value = mb_convert_encoding($value, 'UTF-8', $response['charset']);}$response['charset_original'] = $response['charset'];$response['charset'] = 'UTF-8';}// Sort on keysksort($response);// Done!}else{echo 'pay fail curl';die();}

4.项目根目录下创建cancel.php文件

<?php
//具体取消逻辑可以根据自己业务写
echo '已取消';

三、友情提示

  • 使用沙箱地址请求的时候,有时候可能会请求失败。多试几次就可以了
  • 在配置PDT的回调地址,和发起请求的html的return字段效果是一样的,两个地方填一个即可
  • 本文章涉及的代码只是demo,让大家明白流程而已,具体业务代码还得根据实际情况编写

总结

目前网上的文档感觉没有一个整体流程详细的介绍,而且有些比较老。本篇文章是汇总整理并加入了一些自己的改造和踩坑分享而已。文介绍了paypal支付的其中一种方式,还有一种SDK的方式,这两种有点小区别但是整体的流程还是一样是。等后续会和大家分享另一种方式。还请各位大佬多多指教。

PHP开发Paypal支付,支付流程和接口实现方案相关推荐

  1. Paypal 在线支付接口应用从零开始,第2节,[支付API原理及流程]

    今天看看Paypal支付流程和简单的认证原理,我画了一张图.应该能表达这两点意思了 我们的站点名字,为了好理解,暂且就定为西狐的网站吧. 点此查看清晰原图 恩,理论知识很重要哈,先把这图理解了,下一步 ...

  2. Paypal 在线支付接口

    http://www.paypal-china.org/wangzhai/188.html 关于paypal在线支付的信息可以直接访问http://www.paypal.com.paypal作为国际在 ...

  3. PayPal 国际支付接口安全可行性平台(电子商务)集成解决方案

    IPN的原理很简单,就是当产生了一个交易之后,交易状态发生变化时,如用户已经付款.或者退款.撤销时,Paypal利用常用的HTTP POST方 式,将交易的一些变量提交给网站的某个页面(称之为IPN ...

  4. php集成paypal付款流程,在PHP中集成PayPal标准支付

    PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下 1,在网站的结账页面,设置一个提交到PayPal网站的form,里面有一些金额,商品名称,商家收款账号.结账成功 ...

  5. php集成paypal接口,PHP中集成PayPal标准支付,php集成paypal标准_PHP教程

    PHP中集成PayPal标准支付,php集成paypal标准 PayPal支付功能其实一直在更新文档和接口,这里说的是一个简单的支付功能大概流程如下 1,在网站的结账页面,设置一个提交到PayPal网 ...

  6. 微信支付开发(6) 收货地址共享接口

    关键字:微信支付 收货地址共享 作者:方倍工作室 原文: http://www.cnblogs.com/txw1958/p/weixin-editAddress.html 请看新版教程  微信支付开发 ...

  7. google支付接入PHP语言,PHP语言开发Paypal支付demo的具体实现

    一.paypal支付接口准备工作 首先去申请一个paypal账号,https://www.paypal.com/. 申请完毕并登录,进入https://developer.paypal.com/dev ...

  8. 杉德支付php代码实现_[转]PHP语言开发Paypal支付demo的具体实现

    一.paypal支付接口准备工作 首先去申请一个paypal账号,https://www.paypal.com/. 申请完毕并登录,进入https://developer.paypal.com/dev ...

  9. 微信JSAPI支付对接流程及支付接口设计

    文章目录 前言 一.JSAPI支付场景及逻辑 二.开发步骤 1.设置支付目录 2.设置授权域名 3.业务流程 三.代码设计 1. 支付页面 2. Controller 3. JS调起支付 4. 工具类 ...

  10. iOS开发之第三方支付微信支付教程,史上最新最全第三方微信支付方式实现、微信集成教程,微信实现流程

    本章项目demo: https://github.com/zhonggaorong/weixinLoginDemo 本章不讲解: 微信sdk的集成 , 项目集成的文章请参照 (包含微信登录):   h ...

最新文章

  1. MobileNet、GhostNet理解及测试
  2. JavaScript随笔一篇
  3. 一次外网打不开网站的故障总结
  4. Ajax用POST方式传中文到SERVLET中,接收时乱码
  5. java删除文件夹及下面的所有文件
  6. 云桌面优缺点_云桌面的缺点分析
  7. linux firefox 解雇ie,Fire IE
  8. 【雷达通信】雷达一维恒虚警检测CFARmatlab 含GUI
  9. R语言—数据的调整与处理
  10. Pycharm导入已有的Project
  11. 2018全球高被引学者榜单出炉!中国上榜538人,计算机类排名第一
  12. 震惊~~飞流android版使用体验!!
  13. 那一年,我们二十七八岁
  14. STM32 TM1650数码管显示与按键识别
  15. Fluent Terminal
  16. PIR人体感应AC系列感应器投光灯人体感应开关等应用定制方案
  17. 前端体系结构知识概括
  18. 虚拟商品帐号交易平台源码_支持个人二维码收款
  19. PV操作每日一题-吸烟者问题
  20. autojs-获取api接口JSON值

热门文章

  1. 虚拟内存页面置换算法c语言,5虚拟内存,页面置换算法
  2. 使用WinMTR对网络进行测试,找出网络异常
  3. 爱普生传真服务器网页,爱普生传真机如何发传真 爱普生传真机快速发传真技巧【详解】...
  4. P2010 [NOIP2016 普及组] 回文日期
  5. vue项目中我的收货地址功能做法(添加地址、编辑地址、删除地址、默认地址、省市区三级联动)
  6. 计算机二级c语言必看,计算机二级C语言考试必看技巧
  7. Tomcat9的安装以及配置环境
  8. 点击 tomcat9.exe闪退 问题的解决方法
  9. 在全志平台调试博通的wifi驱动(类似ap6212)【转】
  10. STM32F103移植程序到STM32F107注意事项