PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

藏色散人
풀어 주다: 2020-06-15 12:02:57
앞으로
4781명이 탐색했습니다.

PayPal

전 세계 많은 사용자가 사용하는 국제 무역 결제 도구인 PayPal을 통해 해외 수금 및 결제를 손쉽게 완료할 수 있습니다! 하나의 계정이 보편적이며 PayPal 판매자가 되면 어디에서나 더 많은 결제 방법을 사용할 수 있습니다.

페이팔 SDK 다운로드

그림에 표시된 대로 작곡가.json에 "paypal/rest-api-sdk-php": "1.7.4"를 추가하세요.

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

Executecomposer update

개발자 등록 계정, 테스트 애플리케이션 만들기, 테스트 계정

주소:

https://developer.paypal.com
로그인 후 복사

샌드박스 테스트 계정 만들기

계정 배경(자신의 소비 기록을 볼 수 있음):

https://www.sandbox.paypal.com/signin?returnUri=https%3A%2F%2Fwww.sandbox.paypal.com%2Fmyaccount%2Fsummary&state=%2F
로그인 후 복사

애플리케이션 만들기

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

애플리케이션 구성 보기

생성된 애플리케이션을 클릭하면 나중에 요청 인터페이스에 사용될 구성 클라이언트 ID, 비밀을 볼 수 있습니다. 샌드박스는 테스트 환경이고 라이브는 온라인 환경

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

만들기 새로운 테스트 계정

금액과 비밀번호를 설정할 수 있습니다

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

액세스 코드

주문 로직

<?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 = &#39;xxxxxxxxx&#39;;//应用Client ID
    const clientSecret = &#39;xxxxxxxx&#39;;//Secret
    const accept_url = &#39;http://xxx.laravel.com/Api/paypal/Callback&#39;; //支付成功和取消交易的跳转地址
    const Currency = &#39;USD&#39;;//货币单位
    protected $PayPal;
    public function __construct()
    {
        $this->PayPal = new ApiContext(
            new OAuthTokenCredential(
                self::clientId,
                self::clientSecret
            )
        );
 //如果是沙盒测试环境不设置,请注释掉
//        $this->PayPal->setConfig(
//            array(
//                &#39;mode&#39; => &#39;live&#39;,
//            )
//        );
    }
    /**
     * @param
     * $product 商品
     * $price 价钱
     * $shipping 运费
     * $description 描述内容
     */
    public function pay()
    {
        $product = &#39;1123&#39;;
        $price = 1;
        $shipping = 0;
        $description = &#39;1123123&#39;;
        $paypal = $this->PayPal;
        $total = $price + $shipping;//总价
        $payer = new Payer();
        $payer->setPaymentMethod(&#39;paypal&#39;);
        $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 . &#39;?success=true&#39;)->setCancelUrl(self::accept_url . &#39;/?success=false&#39;);
        $payment = new Payment();
        $payment->setIntent(&#39;sale&#39;)->setPayer($payer)->setRedirectUrls($redirectUrls)->setTransactions([$transaction]);
        try {
            $payment->create($paypal);
        } catch (PayPalConnectionException $e) {
            echo $e->getData();
            die();
        }
        $approvalUrl = $payment->getApprovalLink();
        header("Location: {$approvalUrl}");
    }
로그인 후 복사

주문 로직을 완료한 후 페이팔 결제 페이지로 이동해야 합니다. 그림과 같이 처음으로 계정 비밀번호를 입력하세요.

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

Enter 결제 페이지에서 Paypal 잔액 결제를 선택하세요. 결제가 완료되거나 거래가 취소되면 자동으로 점프 주소로 이동합니다. 주문할 때 전달되었으며 두 개의 매개변수인 PaymentId(페이팔 주문 번호)와 PayerID(사용자 ID)가 전달됩니다. 일반적으로 동기 콜백은 사용자가 지불하는지 확인하고 비동기 콜백을 처리합니다. 비즈니스 로직.

동기식 콜백

 /**
     * 回调
     */
    public function Callback()
    {
        $success = trim($_GET[&#39;success&#39;]);
        if ($success == &#39;false&#39; && !isset($_GET[&#39;paymentId&#39;]) && !isset($_GET[&#39;PayerID&#39;])) {
            echo &#39;取消付款&#39;;die;
        }
        $paymentId = trim($_GET[&#39;paymentId&#39;]);
        $PayerID = trim($_GET[&#39;PayerID&#39;]);
        if (!isset($success, $paymentId, $PayerID)) {
            echo &#39;支付失败&#39;;die;
        }
        if ((bool)$_GET[&#39;success&#39;] === &#39;false&#39;) {
            echo  &#39;支付失败,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
        }
        $payment = Payment::get($paymentId, $this->PayPal);
        $execute = new PaymentExecution();
        $execute->setPayerId($PayerID);
        try {
            $payment->execute($execute, $this->PayPal);
        } catch (Exception $e) {
            echo &#39;,支付失败,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
        }
        echo &#39;支付成功,支付ID【&#39; . $paymentId . &#39;】,支付人ID【&#39; . $PayerID . &#39;】&#39;;die;
    }
로그인 후 복사

비동기 콜백

주소는 https로 시작해야 합니다. 설정이 적용되는 데 시간이 좀 걸립니다. 사진과 같이 오후에 적용되었으며 다음 날 아침에 적용되었습니다.

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

알림을 보내는 다양한 이벤트를 확인할 수 있지만 가장 중요한 것은 결제 판매 완료 및 환불(결제 판매 환불됨)

입니다. 결제 완료

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[&#39;invoice&#39;] = $json_data[&#39;resource&#39;][&#39;invoice_number&#39;];
          $data[&#39;txn_id&#39;] = $json_data[&#39;resource&#39;][&#39;id&#39;];
          $data[&#39;total&#39;] = $json_data[&#39;resource&#39;][&#39;amount&#39;][&#39;total&#39;];
          $data[&#39;status&#39;] = isset($json_data[&#39;status&#39;])?$json_data[&#39;status&#39;]:&#39;&#39;;
          $data[&#39;state&#39;] = $json_data[&#39;resource&#39;][&#39;state&#39;];
        try {
                 //处理相关业务
        } catch (\Exception $e) {
            //记录错误日志
            Log::error("paypal notify fail:".$e->getMessage());
            return "fail";
        }
        return "success";
    }
    public function get_JsonData(){
        $json = file_get_contents(&#39;php://input&#39;);
        if ($json) {
            $json = str_replace("&#39;", &#39;&#39;, $json);
            $json = json_decode($json,true);
        }
        return $json;
    }
로그인 후 복사

환불 처리 중

public function returnMoney()
    {
        try {
            $txn_id = "xxxxxxx";  //异步加调中拿到的id
            $amt = new Amount();
            $amt->setCurrency(&#39;USD&#39;)
                ->setTotal(&#39;99&#39;);  // 退款的费用
            $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([&#39;message&#39; => $e->getMessage(), &#39;code&#39; => $e->getCode(), &#39;state&#39; => $e->getMessage()]));  // to object
        }
        // 退款完成
        return $refundedSale; 
    }
로그인 후 복사

관련 흐름 보기

PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명

요약

Paypal은 여전히 ​​해외 결제 사업 확장에 큰 도움이 됩니다. 네, 다양한 통화를 지원하고 다양한 연동이 가능합니다. 신용카드, 은행카드.. 연결시 연결해줄 페이팔 기술자가 없다는게 단점이군요.. 아무튼 연결이 완료된 후에야 페이팔 연결 담당자에게 연락을 드렸는데, 접속도 어렵지 않습니다. 온라인에서 많은 정보를 얻을 수 있기를 바랍니다. 해외 결제에 관심이 있으시면 저와 상의해 보세요.

laravel"

위 내용은 PayPal 결제에 대한 Laravel 액세스에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿