外貿獨立站商城之Stripe境外支付接口對接 - ManBetX万博全站app網絡
400-800-9385
網站建設資訊詳細

外貿獨立站商城之Stripe境外支付接口對接

發表日期:2022-01-12 15:07:05   作者來源:劉紅旺   瀏覽:770   標簽:外貿獨立站商城    Stripe境外支付    
外貿獨立站是做外貿的公司自己開設的獨立品牌商城,主要區別於商城平台如亞馬遜、阿裏巴巴等,優點是自己的地盤自己說了算,缺點是需要自己推廣引流,適合有一定品牌的商家。

大部分外貿公司都是兩者都做,從商品平台推廣獲客,然後把流量引入自己的品牌商城,打造自己的私域流量商城。

Stripe支付公司是由一對來自愛爾蘭的天才兄弟Collison Brothers一手創辦的,他們表示隨著美國最大的民營金融科技公司進入小企業貸款領域,新一輪融資使其價值增加了一半以上。
KlipC分析稱,Stripe的商業模式主要是梳理目前有的支付方式,將不同的支付方式打包成一套SDK接口,通過整體接入,降低用戶的接入成本,以收取手續費或者服務盈利。目前在金融行業,很多公司已經采用了Stripe的支付通道,比起傳統通道,Stripe效率更高,成本更低。
 

支付工具份額

第一步:安裝類庫
composer require stripe/stripe-php
 
第二步後台控製器:
 function create (){
      
        \Stripe\Stripe::setApiKey($this->clientSecret);//私鑰
        try {
            $jsonStr = file_get_contents('php://input');
            $jsonObj = json_decode($jsonStr);//獲取頁麵參數
            $arr=object_array($jsonObj);//轉換為數組
            $order_id=$arr['items'][0]['order_id'];//訂單單號
            $order = db('order')->where('order_id', $order_id)->find();//查找訂單
            //訂單是否存在和支付狀態
            if(empty($order)) {
                echo "can't find order!";
                exit();
            }
             if($order['pay_status'] == 20) {
                echo  'The order was paid!';
                exit();
            }
            
            $request = Request::instance();
            $base_url = $request->domain();//獲取網址
            $time=time();
            //判斷支付訂單是不是已經生成
            if(!$order['stripe_pay'] || $time-$order['stripe_time']>30*60){
                $currency_list = ExchangeRateModel::getFront();
                $currency = $currency_list['code'];
                $total_amount_currency =  $order['pay_price'];
                $paymentIntent = \Stripe\PaymentIntent::create([
                    'amount' =>  $total_amount_currency*100,//訂單金額
                    'currency' => $currency,
                    'automatic_payment_methods' => [
                        'enabled' => true,
                    ],
                ]);
                $output = [
                    'clientSecret' => $paymentIntent->client_secret,
                ];
                 
                $transaction=explode('_secret_',$paymentIntent->client_secret);//記錄生成的支付單號,單號後麵會加‘單號_secret_安全碼’
                $transaction_id=$transaction[0];
                db('order')->where('order_id',$order_id)->update(['stripe_pay' => $paymentIntent->client_secret,'stripe_time'=>$time,'transaction_id'=>$transaction_id]);//記錄單號
            }else{
                $output = [
                    'clientSecret' => $order['stripe_pay'],
                ];
 
            }
            // Create a PaymentIntent with amount and currency
       
          
            echo json_encode($output);
        } catch (Error $e) {
            http_response_code(500);
            echo json_encode(['error' => $e->getMessage()]);
        }
    }
 
 
三,前端
    <link rel="stylesheet" href="__STATIC__/css/style.css">
    <link rel="stylesheet" href="__STATIC__/css/checkout.css">
    <script src="https://js.stripe.com/v3/"></script>
    <script>
    var order_id="{$order_id}" //訂單號
    var URL="/home/Stripepay"
    var key="{$key}"
    var base_url="{$base_url}";
    </script>
    <script src="__STATIC__/js/checkout.js" defer></script>
  
 
    <form id="payment-form">
        <div id="payment-element">
          <!--Stripe.js injects the Payment Element-->
        </div>
        <button id="submit">
          <div class="spinner hidden" id="spinner"></div>
          <span id="button-text">Pay now</span>
        </button>
        <div id="payment-message" class="hidden"></div>
      </form>
 
Checout.js
     // This is your test publishable API key.
const stripe = Stripe(key);//公鑰
 
// The items the customer wants to buy
const items = [{ id: "xl-tshirt",order_id:order_id }];
 
let elements;
 
initialize();
checkStatus();
 
document
  .querySelector("#payment-form")
  .addEventListener("submit", handleSubmit);
 
// Fetches a payment intent and captures the client secret
async function initialize() {
  const { clientSecret } = await fetch(URL+"/create", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ items }),
  }).then(res => res.json()) ;
 
  elements = stripe.elements({ clientSecret });


  const paymentElement = elements.create("payment");
  paymentElement.mount("#payment-element");
}
 
async function handleSubmit(e) {
  e.preventDefault();
  setLoading(true);
  console.log(elements);
  const { error } = await stripe.confirmPayment({
    elements,
    confirmParams: {
      // Make sure to change this to your payment completion page
      return_url: base_url+URL+"/successful.html",//成功後,回跳地址
    },
  });
 
  // This point will only be reached if there is an immediate error when
  // confirming the payment. Otherwise, your customer will be redirected to
  // your `return_url`. For some payment methods like iDEAL, your customer will
  // be redirected to an intermediate site first to authorize the payment, then
  // redirected to the `return_url`.
  if (error.type === "card_error" || error.type === "validation_error") {
    showMessage(error.message);
  } else {
    showMessage("An unexpected error occured.");
  }
 
  setLoading(false);
}
 
// Fetches the payment intent status after payment submission
async function checkStatus() {
  const clientSecret = new URLSearchParams(window.locations.search).get(
    "payment_intent_client_secret"
  );
 
  if (!clientSecret) {
    return;
  }
 
  const { paymentIntent } = await stripe.retrievePaymentIntent(clientSecret);
 
  switch (paymentIntent.status) {
    case "succeeded":
      showMessage("Payment succeeded!");
      break;
    case "processing":
      showMessage("Your payment is processing.");
      break;
    case "requires_payment_method":
      showMessage("Your payment was not successful, please try again.");
      break;
    default:
      showMessage("Something went wrong.");
      break;
  }
}
 
// ------- UI helpers -------
 
function showMessage(messageText) {
  const messageContainer = document.querySelector("#payment-message");
 
  messageContainer.classList.remove("hidden");
  messageContainer.textContent = messageText;
 
  setTimeout(function () {
    messageContainer.classList.add("hidden");
    messageText.textContent = "";
  }, 4000);
}
 
// Show a spinner on payment submission
function setLoading(isLoading) {
  if (isLoading) {
    // Disable the button and show a spinner
    document.querySelector("#submit").disabled = true;
    document.querySelector("#spinner").classList.remove("hidden");
    document.querySelector("#button-text").classList.add("hidden");
  } else {
    document.querySelector("#submit").disabled = false;
    document.querySelector("#spinner").classList.add("hidden");
    document.querySelector("#button-text").classList.remove("hidden");
  }
}
 
在平台付款可以看到支付信息
 

Stripe境外支付事件


四,獲取支付狀態:
webhooks

Stripe支付狀態

添加回調地址和事件
charge.succeeded-支付成功後

Stripe支付結果

 
需要密鑰
 
五、獲取回調信息,控製器
 public function callback()
    {
        $endpoint_secret = '密鑰';//;
       
        $payload = @file_get_contents('php://input');
        $sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
        $event = null;
       
        if( $payload){
        try {
          
            $event = \Stripe\Webhook::constructEvent(
                $payload, $sig_header, $endpoint_secret
              );
        }catch(\Stripe\Exception\SignatureVerificationException $e) {
            // Invalid signature
            http_response_code(400);
            exit();
          }
        }
        $log_name = "notify_url.log";
        $this->log_result($log_name, 'pay-start|--'.$event->data->object->paymentIntent.'--|');
 
        // Handle the event
        switch ($event->type) {
            case 'charge.succeeded':
                $paymentIntent = $event->data->object; 
                //$payment=json_decode($paymentIntent);
                $payID=$paymentIntent->payment_intent; 
                $order_no=db('order')->where('transaction_id',$payID)->value('order_no');
                try {
                    $total_money =  $event->amount/100;
                    // 實例化訂單模型
                    $model = $this->getOrderModel($order_no, 10);
                    // 訂單信息
                    $order = $model->getOrderInfo();
                    if(empty($order)){
                       echo 'Order not exist';
                    }
                    $update_data['transaction_id'] = $payID;
                    $status = $model->onPaySuccess(20, $update_data);
                    $this->log_result($log_name, 'order_no:'.$order_no.'pay|--'.   $paymentIntent->payment_intent.'--|'.'status:'.$status);
                    if ($status == false) {
                        echo $model->getError();
                    }
                } catch (Exception $e) {
                    $this->error('Pay Error!', 'home/member/order');
                    
                    //echo $e . ',支付失敗,支付ID【' . $paymentId . '】,支付人ID【' . $PayerID . '】';
                    //exit();
                }
                
                
                break;
            case 'charge.attached':
                $paymentMethod = $event->data->object; 
                $this->log_result($log_name, 'pay-attached|--'.$event->type.'--|');
                break;
            // ... handle other event types
            default:
            $this->log_result($log_name, 'pay-fail|--'.$event->type.'--|');
            echo 'Received unknown event type '.$event->type ;
        }
    
       
 
    }
 
如沒特殊注明,文章均為ManBetX万博全站app網絡原創,轉載請注明來自https://www.engstuff.com/news/6325.html
外貿相關公司評論
  • 積極搭建服務平台,優化外貿主體結構。鼓勵現有龍大集團、春雪食品和永和食品等外貿骨幹企業進行設備技術升級、新產品研發、新項目投入,提高出口產品附加值和國際貿易競爭力,初...
    新餘開發網站公司
  • ManBetX万博全站app處在一個互聯網爆炸時代,在變革的年代裏充滿了機會,每個人都應該做好準備迎接機遇的到來。互聯網已經不是遙遠的神話,而是企業間切實拚殺的戰場。這十幾年裏京東商城、凡客、淘寶...
    九江建設網站公司