使用paypal-php-sdk开发php国际支付
<p> 参考:https://github.com/paypal/PayPal-PHP-SDK/wiki</p><p> https://blog.csdn.net/markely/article/details/79044145</p>
<p> 最近公司做一个国际版商城,国内的支付宝和微信支付不太适用,故而选择PayPal。PayPal在国内开发还是比较少的,不如支付宝和微信,所以没有中文文档,辛辛苦苦啃了好几天终于跑通了,在这里做一下总结,方便以后再用。</p>
<p> PayPal在国外的市场占有率还是很高的,只是手续费之高让人有点儿肾疼,不过这不是我关心的东西,只是实现功能。</p>
<p> 废话不多说,直接展示开发过程。</p>
<p>一、准备工作:</p>
<p> 首先需要测试账号,PayPal开发感觉好的一点是提供测试账号(也叫沙箱账号)</p>
<p> 1、浏览器访问 https://www.paypal.com/c2/home 进入PayPal官网</p>
<p> 2、点击注册,根据 要求填写信息进行注册(easy)</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718132210610-458161638.png"></p>
<p> 3、注册完成以后,访问https://developer.paypal.com/ </p>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718132747810-1104330475.png"></p>
<p> 4、点击右上角的 Log Into Dashboard 按钮,登录你刚才注册的账号,进入仪表盘</p>
<p> 5、登录之后点击左侧的accounts,左侧页面会显示你的买家和买家测试账号</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718133218676-191353971.png"><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718133352898-1577923852.png"></p>
<p> </p>
<p> 6、点击profile,会进入买家的账户管理,在里面可以设置密码和金额等信息</p>
<p> 7、点击左上角的My apps & credentials ,出现如下页面</p>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718133720064-1415485305.png"></p>
<p> </p>
<p> 8、点击create app,创建自己的应用,这一步主要clientID和secret,在调用API接口是生成token需要这两个值,很重要</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718134022492-159452048.png"></p>
<p> 二、准备工作做完了,要上代码了</p>
<p> 1、根据wiki上提供的有两种方式下载安装</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718134310700-1045421041.png"></p>
<p> 我选择的是composer,没有安装composer的童鞋自行安装,这里不再赘述。当然也可以使用第二种方式</p>
<p> 2、新建文件夹</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718134633196-1929649259.png"></p>
<p> 3、进去后打开cmd,输入composer require "paypal/rest-api-sdk-php:*" ,回车</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718134823351-1510494818.png"></p>
<p> 4、当看到这个的时候说明下载完成</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718134928257-103376382.png"></p>
<p> 目录结构如下:vendor目录下是PayPal-PHP-SDK的API接口</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718135017291-1296813066.png"></p>
<p> 新建目录:目录结构如下</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718143453761-1487610552.png"></p>
<p> payment.php</p>
<p> </p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span></pre>
<div> require_once("./common.php");</div>
<pre><span style="color: rgba(0, 0, 0, 1)">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 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Payer();
$payer</span>->setPaymentMethod(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">paypal</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置商品详情</span><span style="color: rgba(0, 128, 0, 1)">
/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 详情信息:单价、收货地址等请结合自己的业务去数据库或者其他存储数据的地方查询
* 这里只是演示支付流程,不结合实际业务
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
$item1 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Item();
$item1</span>->setName(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">test pro 1</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setCurrency(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">USD</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setQuantity(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setSku(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">testpro1_01</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setPrice(<span style="color: rgba(128, 0, 128, 1)">2.3</span><span style="color: rgba(0, 0, 0, 1)">);
$item2 </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Item();
$item2</span>->setName(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">test pro 2</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setCurrency(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">USD</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setQuantity(<span style="color: rgba(128, 0, 128, 1)">5</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setSku(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">testpro2_01</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setPrice(<span style="color: rgba(128, 0, 128, 1)">1.1</span><span style="color: rgba(0, 0, 0, 1)">);
$itemList </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ItemList();
$itemList</span>-><span style="color: rgba(0, 0, 0, 1)">setItems(array($item1, $item2));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 自定义用户收货地址,如果这里不定义,在支付页面能够修改,可能会误操作,与用户想等地质不一致</span>
$address = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ShippingAddress();
$address</span>->setRecipientName(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">张三</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setLine1(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">小区名</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setLine2(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">楼号</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setCity(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">城市</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setState(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">省份</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setPhone(<span style="color: rgba(128, 0, 128, 1)">15211111111</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">收货电话</span>
->setPostalCode(<span style="color: rgba(128, 0, 128, 1)">000000</span>) <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">邮编</span>
->setCountryCode(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
$itemList</span>-><span style="color: rgba(0, 0, 0, 1)">setShippingAddress($address);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设置总价,运费等金额。注意:setSubtotal的金额必须与详情里计算出的总金额相等,否则会失败</span>
$details = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Details();
$details</span>->setShipping(<span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setTax(<span style="color: rgba(128, 0, 128, 1)">2</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setSubtotal(<span style="color: rgba(128, 0, 128, 1)">7.8</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 同上,金额要相等</span>
$amount = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Amount();
$amount</span>->setCurrency(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">USD</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setTotal(<span style="color: rgba(128, 0, 128, 1)">10.8</span><span style="color: rgba(0, 0, 0, 1)">)
</span>-><span style="color: rgba(0, 0, 0, 1)">setDetails($details);
$transaction </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Transaction();
$transaction</span>-><span style="color: rgba(0, 0, 0, 1)">setAmount($amount)
</span>-><span style="color: rgba(0, 0, 0, 1)">setItemList($itemList)
</span>->setDescription(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Payment description</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>-><span style="color: rgba(0, 0, 0, 1)">setInvoiceNumber(uniqid());
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 回调
* 当支付成功或者取消支付的时候调用的地址
* success=true 支付成功
* success=false取消支付
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
$redirectUrls </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> RedirectUrls();
$redirectUrls</span>->setReturnUrl(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://localhost/paypal/payment/exec.php?success=true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>->setCancelUrl(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">http://localhost/paypal/payment/cancel.php?success=false</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
$payment </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Payment();
$payment</span>->setIntent(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">sale</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span>-><span style="color: rgba(0, 0, 0, 1)">setPayer($payer)
</span>-><span style="color: rgba(0, 0, 0, 1)">setRedirectUrls($redirectUrls)
</span>-><span style="color: rgba(0, 0, 0, 1)">setTransactions(array($transaction));
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建支付</span>
$payment-><span style="color: rgba(0, 0, 0, 1)">create($apiContext);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">生成地址</span>
$approvalUrl = $payment-><span style="color: rgba(0, 0, 0, 1)">getApprovalLink();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> var_dump($approvalUrl);
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">跳转</span>
header(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">location:</span><span style="color: rgba(128, 0, 0, 1)">"</span> . $approvalUrl);</pre>
</div>
<p>exec.php</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 128, 128, 1)">set_time_limit</span>(3600<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>('./common.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\Amount;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\Details;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\ExecutePayment;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\Payment;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\PaymentExecution;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Api\Transaction;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (<span style="color: rgba(0, 0, 255, 1)">isset</span>(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['success']) && <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['success'] == 'true'<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(128, 0, 128, 1)">$paymentId</span> = <span style="color: rgba(128, 0, 128, 1)">$_GET</span>['paymentId'<span style="color: rgba(0, 0, 0, 1)">];
</span><span style="color: rgba(128, 0, 128, 1)">$payment</span> = Payment::get(<span style="color: rgba(128, 0, 128, 1)">$paymentId</span>, <span style="color: rgba(128, 0, 128, 1)">$apiContext</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$execution</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> PaymentExecution();
</span><span style="color: rgba(128, 0, 128, 1)">$execution</span>->setPayerId(<span style="color: rgba(128, 0, 128, 1)">$_GET</span>['PayerID'<span style="color: rgba(0, 0, 0, 1)">]);
</span><span style="color: rgba(128, 0, 128, 1)">$transaction</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Transaction();
</span><span style="color: rgba(128, 0, 128, 1)">$amount</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Amount();
</span><span style="color: rgba(128, 0, 128, 1)">$details</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Details();
</span><span style="color: rgba(128, 0, 128, 1)">$details</span>->setShipping(1<span style="color: rgba(0, 0, 0, 1)">)
</span>->setTax(2<span style="color: rgba(0, 0, 0, 1)">)
</span>->setSubtotal(7.8<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$amount</span>->setCurrency('USD'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$amount</span>->setTotal(10.8<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$amount</span>->setDetails(<span style="color: rgba(128, 0, 128, 1)">$details</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$transaction</span>->setAmount(<span style="color: rgba(128, 0, 128, 1)">$amount</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(128, 0, 128, 1)">$execution</span>->addTransaction(<span style="color: rgba(128, 0, 128, 1)">$transaction</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(128, 0, 128, 1)">$result</span> = <span style="color: rgba(128, 0, 128, 1)">$payment</span>->execute(<span style="color: rgba(128, 0, 128, 1)">$execution</span>, <span style="color: rgba(128, 0, 128, 1)">$apiContext</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "支付成功"<span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span> (<span style="color: rgba(0, 0, 255, 1)">Exception</span> <span style="color: rgba(128, 0, 128, 1)">$ex</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "支付失败"<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">die</span><span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(128, 0, 128, 1)">$payment</span><span style="color: rgba(0, 0, 0, 1)">;
} </span><span style="color: rgba(0, 0, 255, 1)">else</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "PayPal返回回调地址参数错误"<span style="color: rgba(0, 0, 0, 1)">;
}</span></pre>
</div>
<p>common.php</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">require_once</span>('../vendor/autoload.php'<span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Rest\ApiContext;
</span><span style="color: rgba(0, 0, 255, 1)">use</span><span style="color: rgba(0, 0, 0, 1)"> PayPal\Auth\OAuthTokenCredential;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 下面为申请app获得的clientId和clientSecret,必填项,否则无法生成token。</span>
<span style="color: rgba(128, 0, 128, 1)">$clientId</span> = 'ATnuSLiYPPpNovryQJ4ZsiD1FfR2Jelv5GBkSGNjd59Ef8SW8XEH48fFwOf7L9wcyZARGx3LanesBuvb'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$clientSecret</span> = 'EAadzJ40KVcpBanjhdAR13N2mxPBi2O7uQYMs8h-wMga5scKmwHEyCIOLLgQk2FLEcEOc2xS5ORwyQSo'<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(128, 0, 128, 1)">$apiContext</span> = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ApiContext(
</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> OAuthTokenCredential(
</span><span style="color: rgba(128, 0, 128, 1)">$clientId</span>,
<span style="color: rgba(128, 0, 128, 1)">$clientSecret</span><span style="color: rgba(0, 0, 0, 1)">
)
);
</span><span style="color: rgba(128, 0, 128, 1)">$apiContext</span>-><span style="color: rgba(0, 0, 0, 1)">setConfig(
</span><span style="color: rgba(0, 0, 255, 1)">array</span><span style="color: rgba(0, 0, 0, 1)">(
</span>'mode' => 'sandbox',
'log.LogEnabled' => <span style="color: rgba(0, 0, 255, 1)">true</span>,
'log.FileName' => '../PayPal.log',
'log.LogLevel' => 'DEBUG',
'cache.enabled' => <span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">
)
);</span></pre>
</div>
<p>cancel.php</p>
<div class="cnblogs_code">
<pre><?<span style="color: rgba(0, 0, 0, 1)">php
</span><span style="color: rgba(0, 0, 255, 1)">echo</span> "用户取消支付";</pre>
</div>
<p>浏览器访问:http://localhost/paypal/payment/payment.php</p>
<p>成功后跳转到</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718145034458-1597732617.png"></p>
<p>登录买家的账号,在前面提到过。登录成功后跳转到支付页面</p>
<p> <img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718145254205-987265058.png"></p>
<p>点击继续进行付款,成功后回调代码中提供的url</p>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718145420248-1581580505.png"></p>
<p>然后登陆自己的沙箱账号:https://sandbox.paypal.com/us/signin,(注:是自己的卖家账号)就能看到刚才支付的详情了</p>
<p><img src="https://img2018.cnblogs.com/blog/1583755/201907/1583755-20190718150321391-1724362488.png"></p>
<p> </p>
<p>这样一个完整的支付流程就跑通了,如果需要根据自己的业务去设置商品价格详情。</p>
<p><span style="color: rgba(255, 0, 0, 1)">注:<span style="color: rgba(0, 0, 0, 1)">这个流程只对两位小数有效,我们的业务是四位小数,当传入四位小数时一直提示传入参数错误,目前还没有找到解决办法,等解决后再来补充,如果有能解决的大佬,欢迎留言,不胜感激。</span></span></p>
<p> </p><br><br>
来源:https://www.cnblogs.com/lxhyty/p/11207244.html
頁:
[1]