注册paypal账号注册paypal开发者账号创建paypal沙盒测试账户创建paypal应用下载php sdk实现支付实现支付成功回调实现退款更多api代码模板注册paypal账号
www.paypal.com 注册商家账户选择,”创建商家用户”,根据要求填写信息,注册完得去邮箱激活注册paypal开发者账号
developer.paypal.com 使用上一步注册的账号登录在左侧导航栏点击accounts,创建两个sandbox账号,一个个人账号(personal)用于付款,一个商家账号(business)用于收款,系统已经默认创建了两个,可以自己选择创建,方便记忆; 创建账号后记得给当前账号添加余额用于接下来的测试。
用刚才创建的测试账号登录沙盒测试站点,查看金额和交易信息www.sandbox.paypal.com创建沙盒应用app
账号默认给创建好了一个default application,点击查看获取 clientid和secret;保存起来,接下来接口调用会使用到;(上线时请重新创建一个live的应用)
下载sdk
本人使用laravel框架,使用composer下载paypal包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());//发生异常 } }
更多接口代码示例http://paypal.github.io/paypal-php-sdk/sample/
推荐:《php视频教程》以上就是详解php对接paypal支付的详细内容。