外贸独立站商城之Stripe境外支付接口对接

发布时间:2025-08-04 点击:13
外贸独立站是做外贸的公司自己开设的独立品牌商城,主要区别于商城平台如亚马逊、阿里巴巴等,优点是自己的地盘自己说了算,缺点是需要自己推广引流,适合有一定品牌的商家。
大部分外贸公司都是两者都做,从商品平台推广获客,然后把流量引入自己的品牌商城,打造自己的私域流量商城。
stripe支付公司是由一对来自爱尔兰的天才兄弟collison brothers一手创办的,他们表示随着美国大的民营金融科技公司进入小企业贷款领域,新一轮融资使其价值增加了一半以上。
klipc分析称,stripe的商业模式主要是梳理目前有的支付方式,将不同的支付方式打包成一套sdk接口,通过整体接入,降低用户的接入成本,以收取手续费或者服务盈利。目前在金融行业,很多公司已经采用了stripe的支付通道,比起传统通道,stripe效率更高,成本更低。
第一步:安装类库
composer require stripe/stripe-php
第二步后台控制器:
functioncreate(){
\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'tfindorder!";
exit();
}
if($order['pay_status']==20){
echo'theorderwaspaid!';
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'],
];
}
//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}"//订单号
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");
}
}
在平台付款可以看到支付信息
四,获取支付状态:
webhooks
添加回调地址和事件
charge.succeeded-支付成功后
需要密钥
五、获取回调信息,控制器
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;
//实例化订单模型
$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;
}
}


扬州到仁寿物流专线
昆明到霸州物流专线
163网和169网是指什么二者之间有什么关系?
深圳到朔州物流专线
杭州到秦皇岛物流专线
郑州到靖边物流专线
僵尸网络在大规模DDoS攻击中的作用
泉州到延安物流专线