PayPal
전 세계 많은 사용자가 사용하는 국제 무역 결제 도구인 PayPal을 통해 해외 수금 및 결제를 손쉽게 완료할 수 있습니다! 하나의 계정이 보편적이며 PayPal 판매자가 되면 어디에서나 더 많은 결제 방법을 사용할 수 있습니다.
페이팔 SDK 다운로드
그림에 표시된 대로 작곡가.json에 "paypal/rest-api-sdk-php": "1.7.4"를 추가하세요.
Executecomposer update
개발자 등록 계정, 테스트 애플리케이션 만들기, 테스트 계정
주소:
https://developer.paypal.com
샌드박스 테스트 계정 만들기
계정 배경(자신의 소비 기록을 볼 수 있음):
https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F
애플리케이션 만들기
애플리케이션 구성 보기
생성된 애플리케이션을 클릭하면 나중에 요청 인터페이스에 사용될 구성 클라이언트 ID, 비밀을 볼 수 있습니다. 샌드박스는 테스트 환경이고 라이브는 온라인 환경
만들기 새로운 테스트 계정
금액과 비밀번호를 설정할 수 있습니다
액세스 코드
주문 로직
<?php namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\Controller; use PayPal\Api\Payer; use PayPal\Api\Item; use PayPal\Api\ItemList; use PayPal\Api\Details; use PayPal\Api\Amount; use PayPal\Api\Transaction; use PayPal\Api\RedirectUrls; use PayPal\Api\Payment; use PayPal\Auth\OAuthTokenCredential; use PayPal\Exception\PayPalConnectionException; use PayPal\Rest\ApiContext; use PayPal\Api\PaymentExecution; class paypalController extends Controller { const clientId = 'xxxxxxxxx';//应用Client ID const clientSecret = 'xxxxxxxx';//Secret const accept_url = 'http://xxx.laravel.com/Api/paypal/Callback'; //支付成功和取消交易的跳转地址 const Currency = 'USD';//货币单位 protected $PayPal; public function __construct() { $this->PayPal = new ApiContext( new OAuthTokenCredential( self::clientId, self::clientSecret ) ); //如果是沙盒测试环境不设置,请注释掉 // $this->PayPal->setConfig( // array( // 'mode' => 'live', // ) // ); } /** * @param * $product 商品 * $price 价钱 * $shipping 运费 * $description 描述内容 */ public function pay() { $product = '1123'; $price = 1; $shipping = 0; $description = '1123123'; $paypal = $this->PayPal; $total = $price + $shipping;//总价 $payer = new Payer(); $payer->setPaymentMethod('paypal'); $item = new Item(); $item->setName($product)->setCurrency(self::Currency)->setQuantity(1)->setPrice($price); $itemList = new ItemList(); $itemList->setItems([$item]); $details = new Details(); $details->setShipping($shipping)->setSubtotal($price); $amount = new Amount(); $amount->setCurrency(self::Currency)->setTotal($total)->setDetails($details); $transaction = new Transaction(); $transaction->setAmount($amount)->setItemList($itemList)->setDescription($description)->setInvoiceNumber(uniqid()); $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl(self::accept_url . '?success=true')->setCancelUrl(self::accept_url . '/?success=false'); $payment = new Payment(); $payment->setIntent('sale')->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]); try { $payment->create($paypal); } catch (PayPalConnectionException $e) { echo $e->getData(); die(); } $approvalUrl = $payment->getApprovalLink(); header("Location: {$approvalUrl}"); }
주문 로직을 완료한 후 페이팔 결제 페이지로 이동해야 합니다. 그림과 같이 처음으로 계정 비밀번호를 입력하세요.
Enter 결제 페이지에서 Paypal 잔액 결제를 선택하세요. 결제가 완료되거나 거래가 취소되면 자동으로 점프 주소로 이동합니다. 주문할 때 전달되었으며 두 개의 매개변수인 PaymentId(페이팔 주문 번호)와 PayerID(사용자 ID)가 전달됩니다. 일반적으로 동기 콜백은 사용자가 지불하는지 확인하고 비동기 콜백을 처리합니다. 비즈니스 로직.
동기식 콜백
/** * 回调 */ public function Callback() { $success = trim($_GET['success']); if ($success == 'false' && !isset($_GET['paymentId']) && !isset($_GET['PayerID'])) { echo '取消付款';die; } $paymentId = trim($_GET['paymentId']); $PayerID = trim($_GET['PayerID']); if (!isset($success, $paymentId, $PayerID)) { echo '支付失败';die; } if ((bool)$_GET['success'] === 'false') { echo '支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } $payment = Payment::get($paymentId, $this->PayPal); $execute = new PaymentExecution(); $execute->setPayerId($PayerID); try { $payment->execute($execute, $this->PayPal); } catch (Exception $e) { echo ',支付失败,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; } echo '支付成功,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';die; }
비동기 콜백
주소는 https로 시작해야 합니다. 설정이 적용되는 데 시간이 좀 걸립니다. 사진과 같이 오후에 적용되었으며 다음 날 아침에 적용되었습니다.
알림을 보내는 다양한 이벤트를 확인할 수 있지만 가장 중요한 것은 결제 판매 완료 및 환불(결제 판매 환불됨)
입니다. 결제 완료
public function notify(){ //获取回调结果 $json_data = $this->get_JsonData(); if(!empty($json_data)){ Log::debug("paypal notify info:\r\n".json_encode($json_data)); }else{ Log::debug("paypal notify fail:参加为空"); } //自己打印$json_data的值看有那些是你业务上用到的 //比如我用到 $data['invoice'] = $json_data['resource']['invoice_number']; $data['txn_id'] = $json_data['resource']['id']; $data['total'] = $json_data['resource']['amount']['total']; $data['status'] = isset($json_data['status'])?$json_data['status']:''; $data['state'] = $json_data['resource']['state']; try { //处理相关业务 } catch (\Exception $e) { //记录错误日志 Log::error("paypal notify fail:".$e->getMessage()); return "fail"; } return "success"; } public function get_JsonData(){ $json = file_get_contents('php://input'); if ($json) { $json = str_replace("'", '', $json); $json = json_decode($json,true); } return $json; }
환불 처리 중
public function returnMoney() { try { $txn_id = "xxxxxxx"; //异步加调中拿到的id $amt = new Amount(); $amt->setCurrency('USD') ->setTotal('99'); // 退款的费用 $refund = new Refund(); $refund->setAmount($amt); $sale = new Sale(); $sale->setId($txn_id); $refundedSale = $sale->refund($refund, $this->PayPal); } catch (\Exception $e) { // PayPal无效退款 return json_decode(json_encode(['message' => $e->getMessage(), 'code' => $e->getCode(), 'state' => $e->getMessage()])); // to object } // 退款完成 return $refundedSale; }
관련 흐름 보기
요약
Paypal은 여전히 해외 결제 사업 확장에 큰 도움이 됩니다. 네, 다양한 통화를 지원하고 다양한 연동이 가능합니다. 신용카드, 은행카드.. 연결시 연결해줄 페이팔 기술자가 없다는게 단점이군요.. 아무튼 연결이 완료된 후에야 페이팔 연결 담당자에게 연락을 드렸는데, 접속도 어렵지 않습니다. 온라인에서 많은 정보를 얻을 수 있기를 바랍니다. 해외 결제에 관심이 있으시면 저와 상의해 보세요.
laravel"
위 내용은 PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!