外貿(mào)獨(dú)立站商城之Stripe境外支付接口對(duì)接

2023-03-27    分類: 網(wǎng)站建設(shè)

外貿(mào)獨(dú)立站是做外貿(mào)的公司自己開(kāi)設(shè)的獨(dú)立品牌商城,主要區(qū)別于商城平臺(tái)如亞馬遜、阿里巴巴等,優(yōu)點(diǎn)是自己的地盤自己說(shuō)了算,缺點(diǎn)是需要自己推廣引流,適合有一定品牌的商家。
大部分外貿(mào)公司都是兩者都做,從商品平臺(tái)推廣獲客,然后把流量引入自己的品牌商城,打造自己的私域流量商城。
Stripe支付公司是由一對(duì)來(lái)自愛(ài)爾蘭的天才兄弟Collison Brothers一手創(chuàng)辦的,他們表示隨著美國(guó)大的民營(yíng)金融科技公司進(jìn)入小企業(yè)貸款領(lǐng)域,新一輪融資使其價(jià)值增加了一半以上。
KlipC分析稱,Stripe的商業(yè)模式主要是梳理目前有的支付方式,將不同的支付方式打包成一套SDK接口,通過(guò)整體接入,降低用戶的接入成本,以收取手續(xù)費(fèi)或者服務(wù)盈利。目前在金融行業(yè),很多公司已經(jīng)采用了Stripe的支付通道,比起傳統(tǒng)通道,Stripe效率更高,成本更低。

第一步:安裝類庫(kù)
composer require stripe/stripe-php
第二步后臺(tái)控制器:
functioncreate(){
\Stripe\Stripe::setApiKey($this->clientSecret);//私鑰
try{
$jsonStr=file_get_contents('php://input');
$jsonObj=json_decode($jsonStr);//獲取頁(yè)面參數(shù)
$arr=object_array($jsonObj);//轉(zhuǎn)換為數(shù)組
$order_id=$arr['items'][0]['order_id'];//訂單單號(hào)
$order=db('order')->where('order_id',$order_id)->find();//查找訂單
//訂單是否存在和支付狀態(tài)
if(empty($order)){
echo"can'tfindorder!";
exit();
}
if($order['pay_status']==20){
echo'Theorderwaspaid!';
exit();
}
$request=Request::instance();
$base_url=$request->domain();//獲取網(wǎng)址
$time=time();
//判斷支付訂單是不是已經(jīng)生成
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);//記錄生成的支付單號(hào),單號(hào)后面會(huì)加‘單號(hào)_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]);//記錄單號(hào)
}else{
$output=[
'clientSecret'=>$order['stripe_pay'],
];
}
//CreateaPaymentIntentwithamountandcurrency
echojson_encode($output);
}catch(Error$e){
http_response_code(500);
echojson_encode(['error'=>$e->getMessage()]);
}
}
三,前端
<linkrel="stylesheet"href="__STATIC__/css/style.css">
<linkrel="stylesheet"href="__STATIC__/css/checkout.css">
<scriptsrc="https://js.stripe.com/v3/"></script>
<script>
varorder_id="{$order_id}"//訂單號(hào)
varURL="/home/Stripepay"
varkey="{$key}"
varbase_url="{$base_url}";
</script>
<scriptsrc="__STATIC__/js/checkout.js"defer></script>
<formid="payment-form">
<divid="payment-element">
<!--Stripe.jsinjectsthePaymentElement-->
</div>
<buttonid="submit">
<divclass="spinnerhidden"id="spinner"></div>
<spanid="button-text">Paynow</span>
</button>
<divid="payment-message"class="hidden"></div>
</form>
Checout.js
//ThisisyourtestpublishableAPIkey.
conststripe=Stripe(key);//公鑰
//Theitemsthecustomerwantstobuy
constitems=[{id:"xl-tshirt",order_id:order_id}];
letelements;
initialize();
checkStatus();
document
.querySelector("#payment-form")
.addEventListener("submit",handleSubmit);
//Fetchesapaymentintentandcapturestheclientsecret
asyncfunctioninitialize(){
const{clientSecret}=awaitfetch(URL+"/create",{
method:"POST",
headers:{"Content-Type":"application/json"},
body:JSON.stringify({items}),
}).then(res=>res.json());
elements=stripe.elements({clientSecret});
constpaymentElement=elements.create("payment");
paymentElement.mount("#payment-element");
}
asyncfunctionhandleSubmit(e){
e.preventDefault();
setLoading(true);
console.log(elements);
const{error}=awaitstripe.confirmPayment({
elements,
confirmParams:{
//Makesuretochangethistoyourpaymentcompletionpage
return_url:base_url+URL+"/successful.html",//成功后,回跳地址
},
});
//Thispointwillonlybereachedifthereisanimmediateerrorwhen
//confirmingthepayment.Otherwise,yourcustomerwillberedirectedto
//your`return_url`.ForsomepaymentmethodslikeiDEAL,yourcustomerwill
//beredirectedtoanintermediatesitefirsttoauthorizethepayment,then
//redirectedtothe`return_url`.
if(error.type==="card_error"||error.type==="validation_error"){
showMessage(error.message);
}else{
showMessage("Anunexpectederroroccured.");
}
setLoading(false);
}
//Fetchesthepaymentintentstatusafterpaymentsubmission
asyncfunctioncheckStatus(){
constclientSecret=newURLSearchParams(window.location.search).get(
"payment_intent_client_secret"
);
if(!clientSecret){
return;
}
const{paymentIntent}=awaitstripe.retrievePaymentIntent(clientSecret);
switch(paymentIntent.status){
case"succeeded":
showMessage("Paymentsucceeded!");
break;
case"processing":
showMessage("Yourpaymentisprocessing.");
break;
case"requires_payment_method":
showMessage("Yourpaymentwasnotsuccessful,pleasetryagain.");
break;
default:
showMessage("Somethingwentwrong.");
break;
}
}
//-------UIhelpers-------
functionshowMessage(messageText){
constmessageContainer=document.querySelector("#payment-message");
messageContainer.classList.remove("hidden");
messageContainer.textContent=messageText;
setTimeout(function(){
messageContainer.classList.add("hidden");
messageText.textContent="";
},4000);
}
//Showaspinneronpaymentsubmission
functionsetLoading(isLoading){
if(isLoading){
//Disablethebuttonandshowaspinner
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");
}
}
在平臺(tái)付款可以看到支付信息

Stripe境外支付事件

四,獲取支付狀態(tài):

Stripe支付狀態(tài)

webhooks
添加回調(diào)地址和事件

Stripe支付結(jié)果

charge.succeeded-支付成功后
需要密鑰
五、獲取回調(diào)信息,控制器
publicfunctioncallback()
{
$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){
//Invalidsignature
http_response_code(400);
exit();
}
}
$log_name="notify_url.log";
$this->log_result($log_name,'pay-start|--'.$event->data->object->paymentIntent.'--|');
//Handletheevent
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;
//實(shí)例化訂單模型
$model=$this->getOrderModel($order_no,10);
//訂單信息
$order=$model->getOrderInfo();
if(empty($order)){
echo'Ordernotexist';
}
$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('PayError!','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;
//...handleothereventtypes
default:
$this->log_result($log_name,'pay-fail|--'.$event->type.'--|');
echo'Receivedunknowneventtype'.$event->type;
}
}

分享名稱:外貿(mào)獨(dú)立站商城之Stripe境外支付接口對(duì)接
當(dāng)前鏈接:http://www.muchs.cn/news0/248250.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、動(dòng)態(tài)網(wǎng)站、外貿(mào)建站、云服務(wù)器、微信公眾號(hào)商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)