您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

详解PHP对接paypal支付

2024/10/11 9:50:24发布28次查看
环境准备
注册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支付的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product