分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 运营维护

使用React JS和PHP RESTful进行PayPal Express Checkout

发布时间:2023-09-06 02:16责任编辑:赖小花关键词:PHPReact

目前市场上有几种付款方式可供选择。PayPal结账选项就是其中之一。在我之前的文章中,我已经讨论了几个支付选项 - 使用PHP的Braintree PayPal,支付系统和使用PHP和MySQL的PayPal Express Checkout。这些是迄今为止观看次数最多的热门文章。今天,让我们看看PayPal Express Checkout如何与React JS配合使用。

?



用于测试用户名的实时演示沙箱PayPal凭据:demos@9lessons.info密码:9lessons

Live Demo


第一部分:使用ReactJS和RESTful API登录Facebook和Google

数据库设计
要构建PayPal结账订购系统,您必须创建以下表格。社交登录用户表已出现在上一篇文章中。

产品
产品表包含所有产品详细信息。您可以根据需要扩展此表。

CREATE TABLE产品(
pidintAUTO_INCREMENTPRIMARY KEY,
产品varchar(300),
product_imagevarchar(200),
价格浮动,
货币varchar(10)
);


订单
订单表包含PayPal付款ID的所有用户订单详细信息。

CREATE TABLE命令(
oidintAUTO_INCREMENTPRIMARY KEY,
pid_fkint,
uid_fkint,
payerIDvarchar(500),
paymentIDvarchar(500),
tokenvarchar(500),
createdint(11)
);



Home.js
让我们继续这篇文章。这里存在用户会话存储数据,用setState存储数据。使用用户ID和令牌,您可以访问其他信息,如产品和订单详细信息。

从‘react‘导入React,{Component};

import‘./Home.css‘;

从‘react-router-dom‘导入{Redirect};

classHomeextendsComponent{

构造函数(道具){

超级(道具);

这个。state={

名字:‘‘,

重定向:false,

};

}

componentDidMount(){

让data=JSON。解析(的sessionStorage。的getItem(‘用户数据‘));

安慰。记录(数据);

这个。的setState({名称:数据。用户数据。名称})

}

render(){

如果(!的sessionStorage。的getItem(‘用户数据‘)||此。状态。重定向){

return(<Redirect to={‘/‘}/>)

}

回来(

<div>

欢迎{this。state.name}

</div>

);

}

}

出口默认首页;


让我们开始
您必须为多种用途创建通用组件。在这个项目中,我们通常使用项目标题并注销。

Title.js
此组件包含项目标题和注销功能。使用道具可以扰乱数据。您可以在多个页面中导入此组件。

从“react”导入React,{Component};

从“react-router-dom”导入{Redirect};

import“./ Title.css”;

classTitleextendsComponent{

构造函数(道具){

超级(道具);

这个。注销=这个。注销。bind(this);

这个。state={

重定向:false

};

}

logout(){

sessionStorage。setItem(“userData”,“”);

sessionStorage.clear();

这个。setState({redirect:true});

}

render(){

如果(此。状态。重定向){

return<Redirect to={“/”}/>;

}

回来(

<div className=“row”>

<div className=“medium-12 columns”>

<ul className=“right”>

<li>

<A HREF=“/订单”>订单</一>

</li>

<li>

<a href=“#”onClick={this。注销}>

登出

</a>

</li>

</ul>

<h2>欢迎{this。道具.name}</h2>

</div>

</div>

);

}

}

出口默认标题;



ProductsList.js
用于显示所有产品详细信息的组件。这里的产品数据是从React propsconstuctor调用的。onClick按钮this.props.checkOut指向父函数,您将在下一步中找到它。

从“react”导入React,{Component};

import“./ ProductsList.css”;

classProductsList扩展Component{

构造函数(道具){

超级(道具);

}

render(){

让productList=这个。道具。productsData。map(function(productData,index){

回来(

<div className=“row list”key={index}>

<div className=“medium-3 columns”>

<img

src={

“https://demos.9lessons.info/PHP-PayPal-ExpressCheckout/img/”+

productData。product_img

}

/>

</div>

<div className=“medium-3 columns”>{productData.product}</div>

<div className=“medium-3 columns”>$ {productData。价格}</div>

<div className=“medium-3 columns”>

<button className=“button”value={productData。pid}

onClick={this。道具。结帐}>

订购

</button>

</div>

</div>

);

},此);

return<div>{productList}</div>;

}

}

出口默认的产品列表;


使用RESTful API导入组件和数据绑定

Home.js使用PostData URL提取提供程序
导入TitleProductList组件。函数getProducts()根据登录用户ID令牌从产品API获取数据。

从“react”导入React,{Component};

import“./ Home.css”;

从“react-router-dom”导入{Redirect};

从“../../services/PostData”导入{PostData};

从“../Title/Title”导入标题;

从“../ProductsList/ProductsList”导入ProductsList;

classHomeextendsComponent{

构造函数(道具){

超级(道具);

这个。state={

名称:“”,

重定向:false,

产品:[],

pid:“”

};

这个。getProducts=this。getProducts。bind(this);

这个。checkout=这个。结帐。bind(this);

}

componentDidMount(){

让data=JSON。解析(的sessionStorage。的getItem(“用户数据”));

这个。的getProducts(数据。用户数据);

这个。的setState({名称:数据。用户数据。名称});

}

getProducts(userData){

让postData={uid:userData。uid,token:userData。令牌};

安慰。log(postData);

PostData(“产品”,postData)。然后(result=>{

让responseJson=结果;

这个。的setState({产品:responseJson。产品});

});

}

结帐(e){

让pid=e.target。getAttribute(“value”);

sessionStorage。setItem(“pid”,pid);

这个。setState({pid:pid});

}

render(){

如果(!的sessionStorage。的getItem(“用户数据”)||此。状态。重定向){

return<Redirect to={“/”}/>;

}

如果(此。状态。PID>0){

return<Redirect to={“/ checkout”}/>;

}

回来(

<div className=“row body”>

<Title name={this。state.name}/>

<ProductsList productsData={this。国家。产品}

checkout={this。结帐}/>

</div>

);

}

}

出口默认首页;


函数checkOut()根据product value属性更改this.state.pid值。在render方法中,如果pid值存在,则它将重定向到/ checkout页面。

使用PayPal和Checkout页面
您必须安装PayPal结账组件才能连接PayPal API。

为React安装PayPal Express Checkout插件。

$npminstallreact-paypal-express-checkout--save


Paypal.js
使用Paypal Express Button插件创建自定义组件。您必须配置您的PayPal沙箱和生产merchent ID以获得更多信息,并使用PHP和MySQL检查PayPal Express Checkout。在付款成功时,它将使用createOther方法调用onSuccess。此PHP API将使用payerID,paymentToken等付款数据进行验证。有效调用将重定向状态值更改为true,并将其重定向到订单页面。

从“react”导入React,{Component};

import“./ PayPal.css”;

从“react-paypal-express-checkout”导入PaypalExpressBtn;

从“../../services/PostData”导入{PostData};

从“react-router-dom”导入{Redirect};

PayPal类扩展了Component{

构造函数(道具){

超级(道具);

这个。state={

重定向:false

};

这个。createOrder=this。createOrder。bind(this);

}

createOrder(payment){

让postData={

uid:这个。道具。userData。uid,

令牌:这个。道具。userData。令牌,

payerID:付款。payerID,

paymentID:付款。paymentID,

paymentToken:付款。paymentToken,

pid:这个。道具。PID

};

PostData(“createOrder”,postData)。然后(result=>{

让responseJson=结果;

if(responseJson.status===“true”){

这个。setState({redirect:true});

}

});

}

render(){

如果(此。状态。重定向){

return<Redirect to={“/ orders”}/>;

}

constonSuccess=payment=>{

这个。createOrder(付款);

};

constonCancel=data=>{

安慰。log(“付款已取消!”,数据);

};

constonError=err=>{

安慰。log(“错误!”,错误);

};

让env=“沙盒”;//改为直播的“制作”

letcurrency=“USD”;

让total=this。道具.value;

constclient={

沙箱:“AQwoZAAHsmA5vBLj_mZffS3NWJjNJODewuV2WakPm-BQilgsawTtnbLvWHNC73idcfiaHBOjaeTDkAS8”,

生产:“<插入生产客户端ID>”

};

回来(

<PaypalExpressBtn

env={env}

client={client}

货币={货币}

总计={总计}

onError={onError}

onSuccess={onSuccess}

onCancel={onCancel}

/>

);

}

}

出口默认PayPal;

对于生产,您可以将let evn值更改为“production”。使用我的沙盒令牌进行测试。

CheckOut.js
Checkout页面,用于显示有关所选产品的更多详细信息。导入PayPal组件并设置属性值,如产品piduserData

从“react”导入React,{Component};

import“./ Checkout.css”;

从“react-router-dom”导入{Redirect};

从“../../services/PostData”导入{PostData};

从“../Title/Title”导入标题;

从“../PayPal/PayPal”导入PayPal;

classCheckout扩展Component{

构造函数(道具){

超级(道具);

这个。state={

名称:“”,

重定向:false,

pid:“”,

产品:[],

userData:[]

};

}

componentDidMount(){

让data=JSON。解析(的sessionStorage。的getItem(“用户数据”));

这个。getProductData(数据。用户数据);

这个。的setState({名称:数据。用户数据。名称});

这个。的setState({的UserData:数据。的UserData});

}

getProductData(userData){

让pid=sessionStorage。getItem(“pid”);

让postData={uid:userData。uid,token:userData。token,pid:pid};

PostData(“getProduct”,postData)。然后(result=>{

让responseJson=结果;

这个。setState({product:responseJson.product});

});

}

render(){

如果(!的sessionStorage。的getItem(“用户数据”)||此。状态。重定向){

return<Redirect to={“/”}/>;

}

回来(

<div className=“row body”>

<Title name={this。state.name}/>

<h4>结帐</h4>

<div className=“row”>

<div className=“medium-4 columns”>Product</div>

<div className=“medium-4 columns”>名称</div>

<div className=“medium-4 columns”>价格</div>

</div>

<div className=“row”>

<div className=“medium-4 columns”>

<img

src={

“https://demos.9lessons.info/PHP-PayPal-ExpressCheckout/img/”+

这个。国家。产品。product_img

}

/>

</div>

<div className=“medium-4 columns”>{this。state.product.product}</div>

<div className=“medium-4 columns”>

{这。国家。产品。价格}

<PayPal

value={this。国家。产品。价格}

pid={this。国家。产品。pid}

userData={this。国家。userData}

/>

</div>

</div>

</div>

);

}

}

出口默认结帐;#


Orders.js
Orders页面包含您所有成功的订单。函数getOrders从RESTful apis获取订单,组件OrdersList基于state.orders数组呈现。

从“react”导入React,{Component};

import“./ Orders.css”;

从“react-router-dom”导入{Redirect};

从“../../services/PostData”导入{PostData};

从“../Title/Title”导入标题;

从“../OrdersList/OrdersList”导入OrdersList;

classOrdersextendsComponent{

构造函数(道具){

超级(道具);

这个。state={

名称:“”,

重定向:false,

订单:[]

};

这个。getOrders=这个。getOrders。bind(this);

}

componentDidMount(){

让data=JSON。解析(的sessionStorage。的getItem(“用户数据”));

这个。getOrders(数据。用户数据);

这个。的setState({名称:数据。用户数据。名称});

}

getOrders(userData){

让postData={uid:userData。uid,token:userData。令牌};

PostData(“orders”,postData)。然后(result=>{

让responseJson=结果;

这个。的setState({订单:responseJson。订单});

});

}

render(){

如果(!的sessionStorage。的getItem(“用户数据”)||此。状态。重定向){

return<Redirect to={“/”}/>;

}

回来(

<div className=“row body”>

<Title name={this。state.name}/>

<OrdersList ordersData={this。国家。订单}/>

</div>

);

}

}

出口默认订单;


OrderList.js
显示用户付款订单的组件。

从“react”导入React,{Component};

import“./ OrdersList.css”;

classOrdersListextendsComponent{

构造函数(道具){

超级(道具);

}

render(){

让ordersList=这个。道具。ordersData。map(function(orderData,index){

回来(

<div clasName=“row orderList”key={index}>

<div className=“medium-3 columns”>{orderData。oid}</div>

<div className=“medium-3 columns”>{orderData.product}</div>

<div className=“medium-3 columns”>$ {orderData。价格}</div>

<div className=“medium-3 columns”>{orderData。已创建}</div>

</div>

);

},此);

return<div>{ordersList}</div>;

}

}

exportdefaultOrdersList;


使用PHP RESTful
这个项目是使用ReactJS登录Facebook和谷歌以及使用PHP和MySQL的PayPal Express Checkout

PayPal Express Checkout PHP RESTful +社交登录API在Github上下载此项目


index.php
包含在POST方法调用之后。请使用ReactJS查看使用Facebook和Google登录

<?PHP

/ * ### Srinivas Tamada ### * /

/ * ### https://www.9lessons.info ### * /

需要‘config.php文件‘;

要求‘Slim / Slim.php‘;

\ Slim \Slim::registerAutoloader();

$ app=new\ Slim \Slim();

$ app- >post(‘/ signup‘,‘signup‘);/ *用户注册* /

$ app- >post(‘/ products‘,‘products‘);/ *用户产品* /

$ app- >post(‘/ orders‘,‘orders‘);/ *用户订单* /

$ app- >post(‘/ getProduct‘,‘getProduct‘);/ *获得自豪* /

$ app- >post(‘/ createOrder‘,‘createOrder‘);/ *创建订单* /

$ app- >run();

......

......

......

......

?>


产品
获取产品表的产品详细信息。如果你想要你可以扩展添加分页。

functionproducts(){

$ request=\ Slim \Slim::getInstance()- >request();

$ data=json_decode($ request- >getBody());

$ uid=$ data- >uid;

$ token=$ data- >token;

$ system_token=apiToken($ uid);

if($ token==$ system_token){

$ db=getDB();

$ sql=“SELECT*FROMproducts”;

$ stmt=$ db- >prepare($ sql);

$ stmt- >execute();

$ products=$ stmt- >fetchALL(PDO::FETCH_OBJ);

if($ products){

$ products=json_encode($ products);

echo‘{“products”:‘。$产品。‘}‘;

}else{

echo‘{“error”:{“text”:“无数据可用”}}‘;

}

}

其他{

echo‘{“error”:{“text”:“No access”}}‘;

}

}



订单
基于帖子输入uid的用户订单详细信息。

functionorders(){

$ request=\ Slim \Slim::getInstance()- >request();

$ data=json_decode($ request- >getBody());

$ uid=$ data- >uid;

$ token=$ data- >token;

$ system_token=apiToken($ uid);

if($ token==$ system_token){

$ db=getDB();

$的SQL=“SELECT*FROM订单O,产品P.WHERE?。pid_fk=P。PID和uid_fk=:UID按订单?。OIDDESC;”;

$ stmt=$ db- >prepare($ sql);

$ stmt- >bindParam(“uid”,$ uid,PDO::PARAM_INT);

$ stmt- >execute();

$ orders=$ stmt- >fetchALL(PDO::FETCH_OBJ);

if($ orders){

$ orders=json_encode($ orders);

echo‘{“orders”:‘。$订单。‘}‘;

}else{

echo‘{“error”:{“text”:“无数据可用”}}‘;

}

}

其他{

echo‘{“error”:{“text”:“No access”}}‘;

}

}



getProduct
根据产品ID获取单个产品详细信息。

functiongetProduct(){

$ request=\ Slim \Slim::getInstance()- >request();

$ data=json_decode($ request- >getBody());

$ uid=$ data- >uid;

$ token=$ data- >token;

$ pid=$ data- >pid;

$ system_token=apiToken($ uid);

if($ token==$ system_token){

$ db=getDB();

$ sql=“SELECT*FROMproductsWHEREpid=:pid”;

$ stmt=$ db- >prepare($ sql);

$ stmt- >bindParam(“pid”,$ pid,PDO::PARAM_STR);

$ stmt- >execute();

$ product=$ stmt- >fetch(PDO::FETCH_OBJ);

if($ product){

$ product=json_encode($ product);

echo‘{“product”:‘。$ product。‘}‘;

}else{

echo‘{“error”:{“text”:“无数据可用”}}‘;

}

}

其他{

echo‘{“error”:{“text”:“No access”}}‘;

}

}



createOrder
创建成功付款的订单。这将调用内部CURL动作函数paypalCheck

functioncreateOrder(){

$ request=\ Slim \Slim::getInstance()- >request();

$ data=json_decode($ request- >getBody());

$ uid=$ data- >uid;

$ token=$ data- >token;

$ pid=$ data- >pid;

$ payerID=$ data- >payerID;

$ paymentToken=$ data- >paymentToken;

$ paymentID=$ data- >paymentID;

$ system_token=apiToken($ uid);

if($ token==$ system_token){

if(paypalCheck($ paymentID,$ pid,$ payerID,$ paymentToken,$ uid)){

echo‘{“status”:“true”}‘;

}else{

echo‘{“error”:{“text”:“无数据可用”}}‘;

}

}

其他{

echo‘{“error”:{“text”:“No access”}}‘;

}

}


paypalCheck内部函数
使用CURL方法验证PayPal转换以便更好地了解使用PHP和MySQL检查PayPal Express Checkout。

functionpaypalCheck($ paymentID,$ pid,$ payerID,$ paymentToken,$ uid){

$ ch=curl_init();

$ clientId=PayPal_CLIENT_ID;

$ secret=PayPal_SECRET;

curl_setopt($ CH,CURLOPT_URL,PayPal_BASE_URL。‘的oauth2 /令牌‘);

curl_setopt($ ch,CURLOPT_HEADER,false);

curl_setopt($ ch,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ ch,CURLOPT_POST,true);

curl_setopt($ ch,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ ch,CURLOPT_USERPWD,$ clientId。“:”。$ secret);

curl_setopt($ ch,CURLOPT_POSTFIELDS,“grant_type = client_credentials”);

$ result=curl_exec($ ch);

$ accessToken=null;

if(empty($ result)){

返回虚假;

}

其他{

$ json=json_decode($ result);

$ accessToken=$ json- >access_token;

$卷曲=curl_init(PayPal_BASE_URL。‘付款/支付/‘。$ paymentID);

curl_setopt($ curl,CURLOPT_POST,false);

curl_setopt($ curl,CURLOPT_SSL_VERIFYPEER,false);

curl_setopt($ curl,CURLOPT_HEADER,false);

curl_setopt($ curl,CURLOPT_RETURNTRANSFER,true);

curl_setopt($ curl,CURLOPT_HTTPHEADER,array(

‘授权:持票人‘。$ accessToken,

‘接受:application / json‘,

‘Content-Type:application / xml‘

));

$ response=curl_exec($ curl);

$ result=json_decode($ response);

$ state=$ result- >state;

$ total=$ result- >transactions[0]- >amount- >total;

$ currency=$ result- >transactions[0]- >amount- >currency;

$ subtotal=$ result- >transactions[0]- >amount- >details- >subtotal;

$ recipient_name=$ result- >transactions[0]- >item_list- >shipping_address- >recipient_name;

curl_close($ ch);

curl_close($ curl);

$ product=getProductData($ pid);

if($ state==‘approved‘&&$ currency==$ product- >currency&&$ product- >price==$ subtotal){

updateOrder($ pid,$ payerID,$ paymentID,$ paymentToken,$ uid);

返回true;

}

其他{

返回虚假;

}

}

}


updateOrder内部函数
使用付款详细信息插入订单详细信息。

functionupdateOrder($ pid,$ payerID,$ paymentID,$ token,$ uid)

{

if(paymentCheck($ paymentID)<1&&$ uid>0){

$ db=getDB();

$ stmt=$ db- >prepare(“INSERTINTOorders(uid_fk,pid_fk,payerID,paymentID,token,created)VALUES(:uid,:pid,:payerID,:paymentID,:token,:created)”);

$ stmt- >bindParam(“paymentID”,$ paymentID,PDO::PARAM_STR);

$ stmt- >bindParam(“payerID”,$ payerID,PDO::PARAM_STR);

$ stmt- >bindParam(“token”,$ token,PDO::PARAM_STR);

$ stmt- >bindParam(“pid”,$ pid,PDO::PARAM_INT);

$ stmt- >bindParam(“uid”,$ uid,PDO::PARAM_INT);

$ created=time();

$ stmt- >bindParam(“created”,$ created,PDO::PARAM_INT);

$ stmt- >execute();

$ db=null;

返回true;

}

其他{

返回虚假;

}

}


paymentCheck内部功能
使用方法交叉检查预付款不是。

功能paymentCheck($ paymentID)

{

$ db=getDB();

$ stmt=$ db- >prepare(“SELECT*FROMordersWHEREpaymentID=:paymentID”);

$ stmt- >bindParam(“paymentID”,$ paymentID,PDO::PARAM_STR);

$ stmt- >execute();

$ count=$ stmt- >rowcount();

$ db=null;

返回$ count;

}


运行此项目React

$gitclonehttps://github.com/srinivastamada/react-login-paypal.git
$cdreact-login-paypal
$yarnstart

使用React JS和PHP RESTful进行PayPal Express Checkout

原文地址:https://www.cnblogs.com/xjsp/p/9723234.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved