PHP对接 paypal 支付的方法?这个问题可能是我们日常学习或工作经常见到的。希望通过这个问题能让你收获颇深。下面是小编给大家带来的参考内容,让我们一起来看看吧!
环境准备
注册paypal账号
注册paypal开发者账号
创建沙盒应用APP
下载SDK
composer require paypal/rest-api-sdk-php
实现支付
以下是生成支付的代码片段,伪代码
function createPayPal(){
$shippingPrice = 2;
$taxPrice = 0;
$subTotal = 26;
$item1 = new PayPal\Api\Item();
$item1->setName("产品2")->setCurrency("USD")->setQuantity(1)->setPrice(10);
$item2 = new PayPal\Api\Item();
$item2->setName("产品1")->setCurrency("USD")->setQuantity(2)->setPrice(8);
$itemList = new PayPal\Api\ItemList();
$itemList->addItems([$item1,$item2]);
// Set payment details
$details = new PayPal\Api\Details();
$details->setShipping($shippingPrice)->setTax($taxPrice)->setSubtotal($subTotal);
// Set payment amount
//注意,此处的subtotal,必须是产品数*产品价格,所有值必须是正确的,否则会报错
$total = $shippingPrice + $subTotal + $taxPrice;
$amount = new PayPal\Api\Amount();
$amount->setCurrency("USD")->setTotal($total)->setDetails($details);
// Set transaction object
$transaction = new PayPal\Api\Transaction();
$transaction->setAmount($amount)->setItemList($itemList)->setDescription("这是交易描述")
->setInvoiceNumber(uniqid());//setInvoiceNumber为支付唯一标识符,在使用时建议改成订单号
$payer = new PayPal\Api\Payer();
$payer->setPaymentMethod('paypal');//["credit_card", "paypal"]
$redirectUrls = new PayPal\Api\RedirectUrls();
$redirectUrl = "http://test.com/redirect/success";//支付成功跳转的回调
$cancelUrl = "http://test.com/redirect/cancel";//取消支付的回调
$redirectUrls->setReturnUrl($redirectUrl)->setCancelUrl($cancelUrl);
// Create the full payment object
$payment = new PayPal\Api\Payment();
$payment->setIntent("sale")->setPayer($payer)->setRedirectUrls($redirectUrls)->addTransaction($transaction);
try {
$clientId = "xxxxxx";//上面应用的clientId和secret
$secret = "XXXXXX";
$oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
$apiContext = new \PayPal\Rest\ApiContext($oAuth);
if(env('APP_DEBUG') === false ){
$apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
}
$payment->create($apiContext);
$approvalUrl = $payment->getApprovalLink();
dd($approvalUrl);//这个是请求支付的链接,在浏览器中请求此链接就会跳转到支付页面
} catch (\Exception $e) {
dd($e->getMessage());//错误提示
}
}
以下是支付成功的回调代码片段,伪代码
function payRedirect(Request $request)
{
$paymentID = $request->get('paymentId');
$payerId = $request->get('PayerID');
$clientId = "xxxxxx";//上面应用的clientId和secret
$secret = "XXXXXX";
$oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
$apiContext = new \PayPal\Rest\ApiContext($oAuth);
if(env('APP_DEBUG') === false ){
$apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
}
$payment = \PayPal\Api\Payment::get($paymentID, $apiContext);
$execute = new \PayPal\Api\PaymentExecution();
$execute->setPayerId($payerId);
try{
$payment = $payment->execute($execute, $apiContext);//执行,从paypal获取支付结果
$paymentState = $payment->getState();//Possible values: created, approved, failed.
$invoiceNum = $payment->getTransactions()[0]->getInvoiceNumber();
$payNum = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getId();//这是支付的流水单号,必须保存,在退款时会使用到
$total = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getAmount()->getTotal();//支付总金额
$transactionState = $payment->getTransactions()[0]->getRelatedResources()[0]->getSale()->getState();//Possible values: completed, partially_refunded, pending, refunded, denied.
if($paymentState == 'approved' && $transactionState == 'completed'){
//处理成功的逻辑,例如:判断支付金额与订单金额,更新订单状态等
return "success";//返回成功标识
}else{
//paypal回调错误,paypal状态不正确
return "error";//返回错误标识
}
}catch(\Exception $e){
dd($e->getMessage());
}
}
退款
退款必须要有支付成功的流水单号
一个流水单号可以进行多次退款
退款成功之后,在账号的交易记录中不体现,测试时请登录测试账号自己记录一下余额的变化情况,以确定退款是否成功
商家账号会减少余额并增加手续费(手续费是之前付款多收的),用户账号会增加余额
function refundOrder()
{
try{
$refundRequest = new \PayPal\Api\RefundRequest();
$amount = new \PayPal\Api\Amount();
$amount->setCurrency("USD")->setTotal(10);//退总金额
$refundRequest->setAmount($amount);
$refundRequest->setDescription("退款测试");
$sale = new \PayPal\Api\Sale();
$sale->setId("XXXXXXXXX");//支付单号,支付成功时保存的支付流水单号
$clientId = "xxxxxx";//上面应用的clientId和secret
$secret = "XXXXXX";
$oAuth = new \PayPal\Auth\OAuthTokenCredential($clientId, $secret);
$apiContext = new \PayPal\Rest\ApiContext($oAuth);
if(env('APP_DEBUG') === false ){
$apiContext->setConfig(['mode' => 'live']);//设置线上环境,默认是sandbox
}
$detailedRefund = $sale->refundSale($refundRequest, $apiContext);//调接口
$refundState = $detailedRefund->getState();//Possible values: pending, completed, cancelled, failed.
//var_dump($refundedSale);
if($refundState == 'completed'){
//退款成功,返回
}else{
dd('paypal 退款失败, 状态不正确');
}
}catch (\Exception $exception){
dd($exception->getMessage());//发生异常
}
}
感谢各位的阅读!看完上述内容,你们对PHP对接 paypal 支付的方法大概了解了吗?希望文章内容对大家有所帮助。如果想了解更多相关文章内容,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。