添加一个支付扩展,首先第一步我们需要找到文档,如果有相关的sdk最好。
paypal的文档和sdk地址:
https://github.com/paypal/PayPal-PHP-SDK
https://github.com/paypal/PayPal-PHP-SDK/wiki
示例代码:https://github.com/paypal/PayPal-PHP-SDK/tree/master/sample
支付流程:https://developer.paypal.com/docs/api/quickstart/payments/
第二步,我们需要开发者账号。
https://www.paypal.com/注册一个账号,然后到https://developer.paypal.com登陆
接下来我们需要sandbox账号,一个是买家一个是卖家。(注意,不要创建两个中国区的账号,因为Paypal规定中国之间的账户无法实现支付,据说是外汇监管的问题)
有了账号后,我们现在创建一个应用,生成Client ID和Secret
------------------------
然后我们下载一个thinkphp框架,使用composer安装php的sdk,在框架根目录下运行
composer require paypal/rest-api-sdk-php:*
安装成功后,我们接下来怎么使用。
看了文档https://github.com/paypal/PayPal-PHP-SDK/wiki
他基本上要做的事情有两样,
1,生成一个跳转的支付链接。
2,做一个回调地址接收数据。
支付流程:
---------------------------------------------------
我们在thinkphp中建一个pay的应用
添加控制器Index.php
<?php
namespace app\pay\controller;
use think\Controller;
class Index extends Controller
{
public function index()
{
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'AYSq3RDGsmBLJE-otTkBtM-jBRd1TCQwFf9RGfwddNXWz0uFU9ztymylOhRS', // ClientID
'EGnHDxD_qRPdaLdZz8iCr8N7_MzF-YHPTkjs6NKYQvQSBngp4PTTVWkPZRbL' // ClientSecret
)
);
/*sandbox 模式*/
$apiContext->setConfig(array('mode' => 'sandbox'));
$payer = new \PayPal\Api\Payer();
$payer->setPaymentMethod('paypal');
$amount = new \PayPal\Api\Amount();
$amount->setTotal('1.00');
$amount->setCurrency('USD');
$transaction = new \PayPal\Api\Transaction();
$transaction->setAmount($amount);
$redirectUrls = new \PayPal\Api\RedirectUrls();
$sn=time();
$redirectUrls->setReturnUrl("http://t1.com/pay/Index/returnUrl/sn/".$sn)
->setCancelUrl("http://t1.com/pay/Index/cancelUrl/sn/".$sn);
$payment = new \PayPal\Api\Payment();
$payment->setIntent('sale')
->setPayer($payer)
->setTransactions(array($transaction))
->setRedirectUrls($redirectUrls);
try {
$payment->create($apiContext);
echo $url=$payment->getApprovalLink();
echo "<br><a href='".$url."'>点击支付</a>\n";
}
catch (\PayPal\Exception\PayPalConnectionException $ex) {
echo $ex->getData();
}
}
public function returnUrl(){
$apiContext = new \PayPal\Rest\ApiContext(
new \PayPal\Auth\OAuthTokenCredential(
'AYSq3RDGsmBLJE-otTkBtM-jBRd1TCQwFf9RGfwddNXWz0uFU9ztymylOhRS', // ClientID
'EGnHDxD_qRPdaLdZz8iCr8N7_MzF-YHPTkjs6NKYQvQSBngp4PTTVWkPZRbL' // ClientSecret
)
);
/*sandbox 模式*/
$apiContext->setConfig(array('mode' => 'sandbox'));
// Get payment object by passing paymentId
$paymentId = $this->request->param('paymentId');
$payment = new \PayPal\Api\Payment();
$payment = $payment->get($paymentId, $apiContext);
$payerId = $this->request->param('PayerID');
// Execute payment with payer ID
$execution = new \PayPal\Api\PaymentExecution();
$execution->setPayerId($payerId);
try {
// Execute payment
$result = $payment->execute($execution, $apiContext);
if ($result && isset ( $result->state ) && $result->state == 'approved') {
echo "支付成功";
}else{
echo "支付失败";
var_dump($result);
}
} catch (PayPal\Exception\PayPalConnectionException $ex) {
echo $ex->getCode();
echo $ex->getData();
die($ex);
} catch (Exception $ex) {
die($ex);
}
}
public function cancelUrl(){
echo '取消支付';
}
}
运行http://t1.com/pay得到一个支付的跳转链接,点击
登陆进行支付
支付成功后,跳转到我们原来设置的url.
到这里我们就把paypal在thinkphp走了一遍过程。