参考:https://github.com/paypal/PayPal-PHP-SDK/wiki

     https://blog.csdn.net/markely/article/details/79044145

  最近公司做一个国际版商城,国内的支付宝和微信支付不太适用,故而选择PayPal。PayPal在国内开发还是比较少的,不如支付宝和微信,所以没有中文文档,辛辛苦苦啃了好几天终于跑通了,在这里做一下总结,方便以后再用。

  PayPal在国外的市场占有率还是很高的,只是手续费之高让人有点儿肾疼,不过这不是我关心的东西,只是实现功能。

  废话不多说,直接展示开发过程。

一、准备工作:

  首先需要测试账号,PayPal开发感觉好的一点是提供测试账号(也叫沙箱账号)

  1、浏览器访问 https://www.paypal.com/c2/home 进入PayPal官网

  2、点击注册,根据 要求填写信息进行注册(easy)

  

  3、注册完成以后,访问https://developer.paypal.com/

  4、点击右上角的 Log Into Dashboard 按钮,登录你刚才注册的账号,进入仪表盘

  5、登录之后点击左侧的accounts,左侧页面会显示你的买家和买家测试账号

  

  6、点击profile,会进入买家的账户管理,在里面可以设置密码和金额等信息

  7、点击左上角的My apps & credentials ,出现如下页面

  8、点击create app,创建自己的应用,这一步主要clientID和secret,在调用API接口是生成token需要这两个值,很重要

  

  二、准备工作做完了,要上代码了

  1、根据wiki上提供的有两种方式下载安装

  

  我选择的是composer,没有安装composer的童鞋自行安装,这里不再赘述。当然也可以使用第二种方式

  2、新建文件夹

  

  3、进去后打开cmd,输入composer require "paypal/rest-api-sdk-php:*" ,回车

  

  4、当看到这个的时候说明下载完成

  

  目录结构如下:vendor目录下是PayPal-PHP-SDK的API接口

  

  新建目录:目录结构如下

  

  payment.php

  

<?php
 require_once("./common.php");
use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\Item;
use PayPal\Api\ItemList;
use PayPal\Api\Payer;
use PayPal\Api\Payment;
use PayPal\Api\RedirectUrls;
use PayPal\Api\ShippingAddress;
use PayPal\Api\Transaction; $payer = new Payer();
$payer->setPaymentMethod("paypal"); //设置商品详情
/**
* 详情信息:单价、收货地址等请结合自己的业务去数据库或者其他存储数据的地方查询
* 这里只是演示支付流程,不结合实际业务
*/
$item1 = new Item();
$item1->setName('test pro 1')
->setCurrency('USD')
->setQuantity()
->setSku("testpro1_01")
->setPrice(2.3);
$item2 = new Item();
$item2->setName('test pro 2')
->setCurrency('USD')
->setQuantity()
->setSku("testpro2_01")
->setPrice(1.1);
$itemList = new ItemList();
$itemList->setItems(array($item1, $item2));
// 自定义用户收货地址,如果这里不定义,在支付页面能够修改,可能会误操作,与用户想等地质不一致
$address = new ShippingAddress(); $address->setRecipientName("张三")
->setLine1("小区名")
->setLine2("楼号")
->setCity("城市")
->setState("省份")
->setPhone() //收货电话
->setPostalCode() //邮编
->setCountryCode('CN'); $itemList->setShippingAddress($address); //设置总价,运费等金额。注意:setSubtotal的金额必须与详情里计算出的总金额相等,否则会失败
$details = new Details();
$details->setShipping()
->setTax()
->setSubtotal(7.8); // 同上,金额要相等
$amount = new Amount();
$amount->setCurrency("USD")
->setTotal(10.8)
->setDetails($details); $transaction = new Transaction();
$transaction->setAmount($amount)
->setItemList($itemList)
->setDescription("Payment description")
->setInvoiceNumber(uniqid()); /**
* 回调
* 当支付成功或者取消支付的时候调用的地址
* success=true 支付成功
* success=false 取消支付
*/
$redirectUrls = new RedirectUrls();
$redirectUrls->setReturnUrl("http://localhost/paypal/payment/exec.php?success=true")
->setCancelUrl("http://localhost/paypal/payment/cancel.php?success=false"); $payment = new Payment();
$payment->setIntent("sale")
->setPayer($payer)
->setRedirectUrls($redirectUrls)
->setTransactions(array($transaction));
//创建支付
$payment->create($apiContext);
//生成地址
$approvalUrl = $payment->getApprovalLink(); // var_dump($approvalUrl);
//跳转
header("location:" . $approvalUrl);

exec.php

<?php

set_time_limit(3600);
require_once('./common.php'); use PayPal\Api\Amount;
use PayPal\Api\Details;
use PayPal\Api\ExecutePayment;
use PayPal\Api\Payment;
use PayPal\Api\PaymentExecution;
use PayPal\Api\Transaction; if (isset($_GET['success']) && $_GET['success'] == 'true') { $paymentId = $_GET['paymentId'];
$payment = Payment::get($paymentId, $apiContext); $execution = new PaymentExecution();
$execution->setPayerId($_GET['PayerID']); $transaction = new Transaction();
$amount = new Amount();
$details = new Details(); $details->setShipping(1)
->setTax(2)
->setSubtotal(7.8); $amount->setCurrency('USD');
$amount->setTotal(10.8);
$amount->setDetails($details);
$transaction->setAmount($amount); $execution->addTransaction($transaction); try {
$result = $payment->execute($execution, $apiContext);
echo "支付成功"; } catch (Exception $ex) {
echo "支付失败";
die;
} return $payment;
} else {
echo "PayPal返回回调地址参数错误";
}

common.php

<?php

require_once('../vendor/autoload.php');

use PayPal\Rest\ApiContext;
use PayPal\Auth\OAuthTokenCredential; // 下面为申请app获得的clientId和clientSecret,必填项,否则无法生成token。
$clientId = 'ATnuSLiYPPpNovryQJ4ZsiD1FfR2Jelv5GBkSGNjd59Ef8SW8XEH48fFwOf7L9wcyZARGx3LanesBuvb';
$clientSecret = 'EAadzJ40KVcpBanjhdAR13N2mxPBi2O7uQYMs8h-wMga5scKmwHEyCIOLLgQk2FLEcEOc2xS5ORwyQSo';
$apiContext = new ApiContext(
new OAuthTokenCredential(
$clientId,
$clientSecret
)
);
$apiContext->setConfig(
array(
'mode' => 'sandbox',
'log.LogEnabled' => true,
'log.FileName' => '../PayPal.log',
'log.LogLevel' => 'DEBUG',
'cache.enabled' => true
)
);

cancel.php

<?php

echo "用户取消支付";

浏览器访问:http://localhost/paypal/payment/payment.php

成功后跳转到

登录买家的账号,在前面提到过。登录成功后跳转到支付页面

点击继续进行付款,成功后回调代码中提供的url

然后登陆自己的沙箱账号:https://sandbox.paypal.com/us/signin,(注:是自己的卖家账号)就能看到刚才支付的详情了

这样一个完整的支付流程就跑通了,如果需要根据自己的业务去设置商品价格详情。

注:这个流程只对两位小数有效,我们的业务是四位小数,当传入四位小数时一直提示传入参数错误,目前还没有找到解决办法,等解决后再来补充,如果有能解决的大佬,欢迎留言,不胜感激。

使用paypal-php-sdk开发php国际支付的更多相关文章

  1. PayPal 开发详解(六):下载paypal立即付款SDK 并编译打包

    1.下载PayPal REST SDKs,地址:https://developer.paypal.com/docs/api/rest-sdks/ paypal api比较混乱,有的已经不推荐使用,比如 ...

  2. IOS开发之—— iOS 支付 [支付宝、银联、微信]

    支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId ...

  3. php 微信开发之 微信支付 V3 开发 -CURLOP_TIMEOUT问题

    如果不懂怎么配置的话请看文章 php 微信开发之 微信支付配置 基本配置后在继续本文章的开发 . 本文章就先继续基本的实现!也并不困难.我大概的思路的返回购买者的唯一id 和 订单号的唯一 id 就2 ...

  4. PHP微信支付开发之扫描支付(模式二)后如何回调

    其实在写这篇文章的时候感觉自己已经落伍了,不过笔者在百度上搜索"微信支付开发之扫描支付(模式二)后如何回调"寻找答案时,发现依旧有很多朋友没有解决这个问题,所以就把自己的解决思路分 ...

  5. Android SDK开发与使用的那些事儿

    前言 最近由于工作需要,将应用里的部分功能独立了出来,封装成 SDK 提供给合作伙伴使用.由于经验不足,网上也没多少写这方面内容的文章,遇到了不少的坑,决定记录下来. SDK 其实,刚说到要写SDK也 ...

  6. android开发之微信支付功能的实现

    移动开发中,支付类的App越来越多,对于开发者来说也是不可少的,不可不会的:下面就来说一说支付开发的流程 1.申请你的AppID 请到 开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该 ...

  7. Kinect for Windows SDK开发学习相关资源

    Kinect for Windows SDK(K4W)将Kinect的体感操作带到了平常的应用学习中,提供了一种不同于传统的鼠标,键盘及触摸的无接触的交互方式,在某种程度上实现了自然交互界面的理想,即 ...

  8. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  9. 高拍仪拍照SDK开发(良田影像S300L|S500L)

    高拍仪拍照SDK开发下载地址:点击下载 本SDK适用于:良田影像S300L|S500L 高拍仪如图: SDN开发包安装之后找到安装目录,如图: 大家找到各自需要的版本即可,需要注意的是如果需要上传图片 ...

随机推荐

  1. boost 线程库

    http://www.boost.org/ Boost的安装 step1.从www.boost.org下载boost库 step2 在 tools\build\jam_src目录下 运行build.b ...

  2. TynSerial基本数据类型序列(还原)

    TynSerial基本数据类型序列(还原) procedure TForm1.ToolButton17Click(Sender: TObject); var serial: TynSerial; be ...

  3. 在IntelliJ IDEA中启动tomcat出现Can't load AMD 64-bit .dll on a IA 32-bit' platform问题详解

    第一查看jdk版本 第二查看IntelliJ IDEA中运行tomcat的配置的jdk 比较两个jdk版本是否一致.或者查看tomcat是64还是32位的

  4. 导入GoogleClusterData到MySQL

    本篇随笔记录如何导入google-cluster-data-2011-1-2的 job_events和task_events到MySQL 1. 下载数据 download_job_events: im ...

  5. Oracle存在则更新,不存在则插入应用-merge

    转: Oracle存在则更新,不存在则插入应用-merge 2017年01月11日 14:15:26 周星猩 阅读数 11354更多 分类专栏: Oracle   版权声明:本文为博主原创文章,遵循C ...

  6. 使用注解注入properties中的值的简单示例

    spring使用注解注入properties中的值的简单示例   1.在web项目的src目录下新建setting.properties的文件,内容如下: version=1 2.在spring的xm ...

  7. 直接用的tar压缩

    将目录里的doc文件夹压缩成tar.gz tar -czf  doc.tar.gz   doc 解压tar.gz tar -xzvf doc.tar.gz 在不解压的情况下查看压缩包的内容: tar ...

  8. Linux hostname介绍

    以下操作均时基于 Centos 6.8 操作. 一.现象 在平时工作中,当需要修改主机名时,我们一般会这样操作: 第一步,通过 hostname 命令临时修改主机名. hostname kwang-t ...

  9. (十七)jdbc(Java Data Base Connectivity,java数据库连接)基础使用

    一.JDBC相关概念介绍 1.1 JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范(接口),称之为JDBC.这套接口由数据库厂商去实现,这样,开发人员只需要学习 ...

  10. 第一次linux下安装nginx记录

    CentOS 7 安装Nginx 并配置自动启动 1.下载Nginx安装包---->地址:http://nginx.org/en/download.html 2.上传安装包到服务期 : rz 命 ...