PAYPAL 完整开发API支付实例
PAYPAL支付的提交和接收都分为2种方式!这是网上很多人的博客资料都没有比较细致说明的。当初我在上面掉了一个大坑,苦不堪言。(公司要求是使用邮箱收款的方式,我自己不清楚看了帖子使用了APP的方式,即:和淘宝的一样,使用appkey、apptoken的方式)申请这个比较麻烦,需要填写很多的资料,而且审批也需要周期很久,所以直接使用邮箱收款的方式。
何为邮箱收款方式,PAYPAL上面可以直接注册个帐号,这个帐号就可以用来收钱。任何人,只要你的帐号上有钱,或者使用信用卡都可以在上面打钱。其实,说了这么多废话,就是想大家不要绕到坑里,这2种方式无非就是使用PAYPAL的类库SDK,或者是PDT与IPN的方式去验证。好了,废话不多说直接开始:
需要的了解的相关东西如下:
1)PAYPAL的与SERVICE交互的方式,有2种:PDT与IPN的方式;如图:
PDT如下(GET方式):
IPN(POST方式)如下:
相信看了上述图都已经了解,无非就是GET的方式(即:用户支付完成后直接跳转回来到商户网站,通过get的方式获取到对应参数,商户再与PAYPAL进行验证)与POST的方式(即:异步,用户支付完成后没有跳转回商户网站,PAYPAL通过POST的方式给商户网站获取到对应参数,商户网站再与PAYPAL进行验证)
2)对上述东西知道了之后,有了大致的了解,然后你需要去https://developer.paypal.com/developer/accounts/注册一个帐号在PAYPAL网站上,PAYPAL很友好的提供了SANDBOX方式,即:测试环境,这个专门给开发者测试用的,你注册了开发者帐号后,系统会自己给你开通2个测试帐号:一个是买家([email protected])一个是卖家帐号([email protected]),相应的注册流程,网上也很多帖子都说得很清楚,这里我就不在赘述了,自行百度。
如果你想使用APP的方式的话,可以在这个地方注册好你的APP,点击PHP(我的APP名字),然后上面就会有CLIENT ID 和 SECRET了,SECRET你需要点击show这个按钮,别找了半天找不到。^_^
3)有了帐号之后,就需要登录测试环境https://www.sandbox.paypal.com卖家帐号去设置你的相关资料;记得,帐号是开发者帐号上面的!
--你要设置的相关资料有:(这里再啰嗦下,如果登录老是找不到个人档案,你可以登录你开发者帐号试试,它们都是关联的。)
首先登录:->点击个人档案->即时付款通知习惯设定
->点击个人档案->网站付款习惯设定
上述的操作完成之后,你就可以开工了,去官网DOWLOADS对应的SDK;不过官网的手册全是英文的,对应的文档也很乱,想要最新的源码,你需要去官网下载,之前我就是下载了过时的DEMO,现在是17年3月份,导致一直跟PAYPAL验证失败!
这个是我找到的中文手册:https://www.paypal-biz.com/development/documentation/PayPal_IPN&PDT_Guide_V1.0.pdf
但是不要直接用上面的源码,已经用不了的!
开发者文档:https://developer.paypal.com/docs/
最后这里在强调下,PAYPAL都是通过表单提交的方式生成的订单的,当然APP的方式不用,可以直接用类库帮你生成表单提交;这里我贴上我的DEMO,是自定义表单:
* 生成支付代码
* @param array $order 订单信息
* @param array $payment 支付方式信息
*/
function get_code($config)
{
//测试 https://www.sandbox.paypal.com/cgi-bin/webscr
$deal_url = '
"" .//告诉paypal该表单是立即购买
"" .//卖家帐号 也就是收钱的帐号
"" .//商品名称 item_number
"" .//物品号 item_number
"" .// 订单金额
"" .// 货币
"" .// 支付成功后网页跳转地址
"" .//支付成功后paypal后台发送订单通知地址
"" .//用户取消交易返回地址
"" .//自定义订单号
"" .// 字符集
"" .// 不要求客户提供收货地址
"" .// 付款说明
"" .
"
";
return $deal_url;
}
提交给PAYPAL会生成一个页面,上面有你刚刚填写对应的订单信息;而且它集成手机端自适应的方式,会自动调整好页面,我就不贴图了,可以自己去试试:
填写好你的资料,帐号或者用信用卡支付都可以,确认完成后会提示你支付成功,10秒钟会自动返回!APP的方式是立即返回的!
返回就会有对应的地址了:
http://xxx.com/index.php/pay/paypal_url/houtai/amt=1.00&cc=USD&item_name=C14896341493008718&item_number=C14896341493008718&st=Pending&tx=6R903017GR561561Y
这个就是你PDT返回的地址,即通过GET的方式获取到参数跟PAYPAL验证!
废话不说,贴DEMO:
//获取 PayPal 交易流水号 tx
$tx = $_GET['tx'];
$pay_type =$this->db->GetOne("SELECT * from `@#_pay` where `pay_class` = 'paypal' and `pay_start` = '1'");
$pay_type_key = unserialize($pay_type['pay_key']);
$at_token = $pay_type_key['key']['val']; //your_pdt_identity_token
$partner = $pay_type_key['id']['val']; //支付商号
// Init cURL
$request = curl_init();
// Set request options
curl_setopt_array($request, array
(
// CURLOPT_URL => 'https://www.sandbox.paypal.com/cgi-bin/webscr',//测试
CURLOPT_URL => 'https://www.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 connection
curl_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 array
preg_match_all('/^([^=\r\n]++)=(.*+)/m', $response, $m, PREG_PATTERN_ORDER);
$response = array_combine($m[1], $m[2]);
// Fix character encoding if needed
if(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 keys
ksort($response);
// Done!
}else{
echo 'pay fail curl';
die();
}
//下面是做对应的验证,验证payment_status 状态是否已支付,有人一直说这个状态是待接收的状态,这是因为你的开发者帐号那里设置了开启了待审核的状态,把它关掉即可(商家帐号->profile->setting->Payment Review->off)。
// var_dump($response);exit;
// check whether the payment_status is Completed
// check that txn_id has not been previously processed
// check that receiver_email is your Primary PayPal email
// check that payment_amount/payment_currency are correct
// process the notification
// assign posted variables to local variables
验证了以上对应参数,就可以数据库入库了做相应的操作。
接着就是异步的方式:具体代码就不贴了。验证方式类同,只不过是换了个地址,请你们自己去下载对应的源码在集成到自身网站即可;直接提供对应的SDK给你们自己去看吧,方法都大同小异;
注意的是:最好你的PHP是5.3以上的版本,而且也支持CURL等函数的支持,环境必须是线上的,本地的没办法拿到参数的哦!
中文接口文档地址:https://www.paypal-biz.com/development/documentation/PayPal_IPN&PDT_Guide_V1.0.pdf
IPN SDK:https://github.com/paypal/ipn-code-samples/blob/master/php/PaypalIPN.php
PDT SDK:https://github.com/paypal/pdt-code-samples
app源码方式 SDK如下:
通过composer(composer安装教程)下载PayPal-PHP-SDK,具体的composer.json如下:
{
"require" : {
"paypal/rest-api-sdk-php" : "1.7.4"
},
"repositories": {
"packagist": {
"type": "composer",
"url": "https://packagist.phpcomposer.com"
}
}
}
composer install
,PayPal-PHP-SDK安装完毕。这个我也是通过这位哥们写的博客安装的,很多人都采用这个方式开发,你们要看详细的例子这里有传送门,我就不重复造轮子了:http://blog.csdn.net/alexander_phper/article/details/52057524
以上就是最近我总结出来很全面的PAYPAL支付开发,相信从头看到尾你们自己去试一试折腾一下就知道了,网上很多博客自己都是没有去写出来,
或者没写很全,很多代码都过时了,还贴出来坑了不少人,我就是其中一员,希望分享出来这个案例,大伙开发少走弯路吧。
--请支持原创,转载请注明
2017.03.22晚22:32
注:这个是我当时刚好有做到支付功能顺便写的,17年写的,有些文章链接失效了也正常,官方文档肯定也会有所改版,但是万变不离其宗,支付流程是不变的,可以参考国内的一些主流支付:支付宝、微信,或一些第三方支付/也有一些封装好的包,可以通过composer安装使用即可。大体的流程都是一致的。无非就是 创建订单->调起支付->用户授权(扫码/账号密码/扫脸)->根据回调参数再提交支付授权->异步/同步通知->验证异步结果->订单支付成功.
还有就是,自己去折腾一遍就会了,发现有些童鞋加了微信之后,全然不知道所以然,百度GOOGLE都可以解决的问题,为何还如此麻烦,更让我哭笑不得的是,我告诉有些人详细的流程,却直接把代码扔给我,让我帮他调试,感情我是为了你发一毛钱的红包就要给你服务?所以把微信删除了,希望大家自己可以去多折腾技术,毕竟就算我帮你搞定了问题,你自己也掌握不了,此文章仅供参考,有些东西确实太久了,等忙完之后我再出一篇新的文章。