您的位置:

php支付宝支付开发流程,php支付宝支付开发流程怎么做

本文目录一览:

php开发中app怎么接入支付宝

准备工作

APP支付接口:alipay.trade.app.pay

服务器端使用框架:TP5

登录蚂蚁金服开放平台 -- 创建应用 -- 添加App支付功能。具体查看官方文档

下载官方 SDK (PHP版本资源)——当前SDK版本:106 生成时间:2017-07-25 11:46:10

将SDK原码放置在TP5的vendor目录下的alipay文件夹(可根据实际使用框架技术进行实际调整)。

支付接口调用原理

1、APP支付系统架构

APP支付系统架构图

2、数据校验原理

数据校验原理

应用公钥(商户自身的RSA公钥):支付宝使用该公钥验证该交易是商户发起。

支付宝公钥(支付宝的RSA公钥):商户使用该公钥验证该结果是支付宝返回的。

3、系统交互流程

系统交互流程图

4、支付场景具体实现流程(最详细图解)

在集成App支付能力时,建议实现如下支付流程,创建订单并支付,根据返回的结果确定支付状态,并进行相应的异常处理,其过程如下图所示.

支付场景具体实现流程

商家APP在创建订单并且唤起支付宝APP支付,流程如上图所示,根据第2.2,3步返回的支付结果,确定支付状态,并且做相应的异常处理(必要时关闭订单)

代码实现

步骤1:商户APP端请求商户服务器接口,提交订单数据。

步骤2:商户服务器端接收数据,然后对数据进行签名,返回请求参数到商户APP端。

官方接口文档:

——代码如下:

//vendor();为TP5框架的方法,作用:导入第三方框架类库

vendor('alipay.aop.AopClient');

vendor('alipay.aop.request.AlipayTradeAppPayRequest');

//实例化支付接口

$aop = new \AopClient();

$aop-gatewayUrl = ""; //支付宝网关

$aop-appId = “应用ID,填写你的APPID”;

$aop-rsaPrivateKey = "商户私钥,您的原始格式RSA私钥()";

$aop-alipayrsaPublicKey = "支付宝公钥";

$aop-apiVersion = '1.0';

$aop-signType = "签名方式,如 RSA2 ";

$aop-postCharset = 'UTF-8';

$aop-format = "json";

//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay

$appRequest = new \AlipayTradeAppPayRequest();

//SDK已经封装掉了公共参数,这里只需要传入业务参数

$bizcontent = json_encode([

'body' = '余额充值', //订单描述

'subject' = '充值', //订单标题

'timeout_express' = '30m',

'out_trade_no' = ‘20170125test01’, //商户网站唯一订单号

'total_amount' = '0.01', //订单总金额

'product_code' = 'QUICK_MSECURITY_PAY', //固定值

]);

$appRequest-setNotifyUrl($url); //设置异步通知地址

$appRequest-setBizContent($bizcontent);

//这里和普通的接口调用不同,使用的是sdkExecute

$response = $aop-sdkExecute($appRequest);

//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题

echo htmlspecialchars($response);//就是orderString 可以直接给客户端请求,无需再做处理。

// 如果最后有问题可以尝试把htmlspecialchars方法去掉,直接返回$response

说明:sdkExecute()方法,作用生成签名,详细步骤如下:

将请求参数组装分下列3步,以最后第三步获取到的请求为准。

1)将请求参数的键按字典排序,然后按照key=valuekey=value方式拼接,得到未签名原始字符串如下:

app_id=2015052600090779biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}charset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0

2)再对原始字符串进行签名

app_id=2015052600090779biz_content={"timeout_express":"30m","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是测试数据","out_trade_no":"IQJZSRC1YMQB5HU"}charset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=;sign_type=RSA2×tamp=2016-08-25 20:26:31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=

3)最后对请求字符串的所有一级value(biz_content作为一个value)进行encode,编码格式按请求串中的charset为准,没传charset按UTF-8处理,获得最终的请求字符串:

app_id=2015052600090779biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7Dcharset=utf-8format=jsonmethod=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notifysign_type=RSA2×tamp=2016-08-25%2020%3A26%3A31version=1.0sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

步骤3:商户APP接收从商户服务器端返回的请求参数,然后调起支付宝支付面板。

若用户支付成功,支付宝会同步给商户APP端返回一个支付结果。相应地,支付宝也会通过异步通知给商户服务器端返回一个支付结果。

注意:由于同步通知和异步通知都可以作为支付完成的凭证,且异步通知支付宝一定会确保发送给商户服务端。为了简化集成流程,商户可以将同步结果仅仅作为一个支付结束的通知(忽略执行校验),实际支付是否成功,完全依赖服务端异步通知。

步骤4:服务端异步通知处理机制(支付宝主动发起通知,该方式才会被启用)

官方接口文档:

注意点:

1)必须保证服务器异步通知页面(notify_url)上无任何字符,如空格、HTML标签、开发系统自带抛出的异常提示信息等;

2)支付宝是用POST方式发送通知信息,因此该页面中获取参数的方式,如:$_POST[‘out_trade_no’];

3)程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);

4)当商户收到服务器异步通知并打印出success时,服务器异步通知参数notify_id才会失效。

——代码如下:

$aop = new AopClient;

$aop-alipayrsaPublicKey = '请填写支付宝公钥,一行字符串';

$flag = $aop-rsaCheckV1($_POST, NULL, "RSA2"); //验证签名

if($flag){

//校验通知数据的正确性

$out_trade_no = $_POST[‘out_trade_no']; //商户订单号

$trade_no = $_POST[‘trade_no']; //支付宝交易号

$trade_status = $_POST[‘trade_status']; //交易状态trade_status

$total_amount = $_POST[‘'total_amount']; //订单的实际金额

$app_id = $_POST[‘app_id'];

if($app_id!=$this-config['app_id']) exit('fail'); //验证app_id是否为该商户本身

//只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。

if($trade_status != 'TRADE_FINISHED' $trade_status != 'TRADE_SUCCESS')

exit('fail');

//校验订单的正确性

if(!empty($out_trade_no)){

//1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号;

//2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额);

//3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)。

//上述1、2、3有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。

//校验成功后在response中返回success,校验失败返回failure

}

exit('fail');

}

echo"fail"; //验证签名失败

步骤5:当商户APP端接收到支付宝的同步返回结果为成功时,商户APP端再请求商户服务器端API,判断订单最终支付结果,并做出最终响应。

thinkPHP框架的项目怎么做支付宝支付功能

1、在配置文件中Conf/Config.php文件中对支付宝相关参数进行配置:

//支付宝配置参数

'alipay_config'=array(

'partner' ='20********50', //这里是你在成功申请支付宝接口后获取到的PID;

'key'='9t***********ie',//这里是你在成功申请支付宝接口后获取到的Key

'sign_type'=strtoupper('MD5'),

'input_charset'= strtolower('utf-8'),

'cacert'= getcwd().'\\cacert.pem',

'transport'= 'http',

),

//以上配置项,是从接口包中alipay.config.php 文件中复制过来,进行配置;

'alipay' =array(

//这里是卖家的支付宝账号,也就是你申请接口时注册的支付宝账号

'seller_email'='pay@xxx.com',

//这里是异步通知页面url,提交到项目的Pay控制器的notifyurl方法;

'notify_url'='',

//这里是页面跳转通知url,提交到项目的Pay控制器的returnurl方法;

'return_url'='',

//支付成功跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参payed(已支付列表)

'successpage'='User/myorder?ordtype=payed',

//支付失败跳转到的页面,我这里跳转到项目的User控制器,myorder方法,并传参unpay(未支付列表)

'errorpage'='User/myorder?ordtype=unpay',

),

复制代码

2、新建一个PayAction控制器代码如下:

?php

class PayAction extends Action{

//在类初始化方法中,引入相关类库

public function _initialize() {

vendor('Alipay.Corefunction');

vendor('Alipay.Md5function');

vendor('Alipay.Notify');

vendor('Alipay.Submit');

}

//doalipay方法

/*该方法其实就是将接口文件包下alipayapi.php的内容复制过来

然后进行相关处理

*/

public function doalipay(){

/*********************************************************

把alipayapi.php中复制过来的如下两段代码去掉,

第一段是引入配置项,

第二段是引入submit.class.php这个类。

为什么要去掉??

第一,配置项的内容已经在项目的Config.php文件中进行了配置,我们只需用C函数进行调用即可;

第二,这里调用的submit.class.php类库我们已经在PayAction的_initialize()中已经引入;所以这里不再需要;

*****************************************************/

// require_once("alipay.config.php");

// require_once("lib/alipay_submit.class.php");

//这里我们通过TP的C函数把配置项参数读出,赋给$alipay_config;

$alipay_config=C('alipay_config');

/**************************请求参数**************************/

$payment_type = "1"; //支付类型 //必填,不能修改

$notify_url = C('alipay.notify_url'); //服务器异步通知页面路径

$return_url = C('alipay.return_url'); //页面跳转同步通知页面路径

$seller_email = C('alipay.seller_email');//卖家支付宝帐户必填

$out_trade_no = $_POST['trade_no'];//商户订单号 通过支付页面的表单进行传递,注意要唯一!

$subject = $_POST['ordsubject']; //订单名称 //必填 通过支付页面的表单进行传递

$total_fee = $_POST['ordtotal_fee']; //付款金额 //必填 通过支付页面的表单进行传递

$body = $_POST['ordbody']; //订单描述 通过支付页面的表单进行传递

$show_url = $_POST['ordshow_url']; //商品展示地址 通过支付页面的表单进行传递

$anti_phishing_key = "";//防钓鱼时间戳 //若要使用请调用类文件submit中的query_timestamp函数

$exter_invoke_ip = get_client_ip(); //客户端的IP地址

/************************************************************/

//构造要请求的参数数组,无需改动

$parameter = array(

"service" = "create_direct_pay_by_user",

"partner" = trim($alipay_config['partner']),

"payment_type" = $payment_type,

"notify_url" = $notify_url,

"return_url" = $return_url,

"seller_email" = $seller_email,

"out_trade_no" = $out_trade_no,

"subject" = $subject,

"total_fee" = $total_fee,

"body" = $body,

"show_url" = $show_url,

"anti_phishing_key" = $anti_phishing_key,

"exter_invoke_ip" = $exter_invoke_ip,

"_input_charset" = trim(strtolower($alipay_config['input_charset']))

);

//建立请求

$alipaySubmit = new AlipaySubmit($alipay_config);

$html_text = $alipaySubmit-buildRequestForm($parameter,"post", "确认");

echo $html_text;

}

/******************************

服务器异步通知页面方法

其实这里就是将notify_url.php文件中的代码复制过来进行处理

*******************************/

function notifyurl(){

/*

同理去掉以下两句代码;

*/

//require_once("alipay.config.php");

//require_once("lib/alipay_notify.class.php");

//这里还是通过C函数来读取配置项,赋值给$alipay_config

$alipay_config=C('alipay_config');

//计算得出通知验证结果

$alipayNotify = new AlipayNotify($alipay_config);

$verify_result = $alipayNotify-verifyNotify();

if($verify_result) {

//验证成功

//获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表

$out_trade_no = $_POST['out_trade_no']; //商户订单号

$trade_no = $_POST['trade_no']; //支付宝交易号

$trade_status = $_POST['trade_status']; //交易状态

$total_fee = $_POST['total_fee']; //交易金额

$notify_id = $_POST['notify_id']; //通知校验ID。

$notify_time = $_POST['notify_time']; //通知的发送时间。格式为yyyy-MM-dd HH:mm:ss。

$buyer_email = $_POST['buyer_email']; //买家支付宝帐号;

$parameter = array(

"out_trade_no" = $out_trade_no, //商户订单编号;

"trade_no" = $trade_no, //支付宝交易号;

"total_fee" = $total_fee, //交易金额;

"trade_status" = $trade_status, //交易状态

"notify_id" = $notify_id, //通知校验ID。

"notify_time" = $notify_time, //通知的发送时间。

"buyer_email" = $buyer_email, //买家支付宝帐号;

);

if($_POST['trade_status'] == 'TRADE_FINISHED') {

//

}else if ($_POST['trade_status'] == 'TRADE_SUCCESS') { if(!checkorderstatus($out_trade_no)){

orderhandle($parameter);

//进行订单处理,并传送从支付宝返回的参数;

}

}

echo "success"; //请不要修改或删除

}else {

//验证失败

echo "fail";

}

}

/*

页面跳转处理方法;

这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;

*/

function returnurl(){

//头部的处理跟上面两个方法一样,这里不罗嗦了!

$alipay_config=C('alipay_config');

$alipayNotify = new AlipayNotify($alipay_config);//计算得出通知验证结果

$verify_result = $alipayNotify-verifyReturn();

if($verify_result) {

//验证成功

//获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表

$out_trade_no = $_GET['out_trade_no']; //商户订单号

$trade_no = $_GET['trade_no']; //支付宝交易号

$trade_status = $_GET['trade_status']; //交易状态

$total_fee = $_GET['total_fee']; //交易金额

$notify_id = $_GET['notify_id']; //通知校验ID。

$notify_time = $_GET['notify_time']; //通知的发送时间。

$buyer_email = $_GET['buyer_email']; //买家支付宝帐号;

$parameter = array(

"out_trade_no" = $out_trade_no, //商户订单编号;

"trade_no" = $trade_no, //支付宝交易号;

"total_fee" = $total_fee, //交易金额;

"trade_status" = $trade_status, //交易状态

"notify_id" = $notify_id, //通知校验ID。

"notify_time" = $notify_time, //通知的发送时间。

"buyer_email" = $buyer_email, //买家支付宝帐号

);

if($_GET['trade_status'] == 'TRADE_FINISHED' || $_GET['trade_status'] == 'TRADE_SUCCESS') {

if(!checkorderstatus($out_trade_no)){

orderhandle($parameter); //进行订单处理,并传送从支付宝返回的参数;

}

$this-redirect(C('alipay.successpage'));//跳转到配置项中配置的支付成功页面;

}else {

echo "trade_status=".$_GET['trade_status'];

$this-redirect(C('alipay.errorpage'));//跳转到配置项中配置的支付失败页面;

}

}else {

//验证失败

//如要调试,请看alipay_notify.php页面的verifyReturn函数

echo "支付失败!";

}

}

}

?

复制代码

3、这里有几个支付处理过程中需要用到的函数,我把这些函数写到了项目的Common/common.php中,这样不用手动调用,即可直接使用这些函数,代码如下:

//////////////////////////////////////////////////////

//Orderlist数据表,用于保存用户的购买订单记录;

/* Orderlist数据表结构;

CREATE TABLE `tb_orderlist` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`userid` int(11) DEFAULT NULL,购买者userid

`username` varchar(255) DEFAULT NULL,购买者姓名

`ordid` varchar(255) DEFAULT NULL,订单号

`ordtime` int(11) DEFAULT NULL,订单时间

`productid` int(11) DEFAULT NULL,产品ID

`ordtitle` varchar(255) DEFAULT NULL,订单标题

`ordbuynum` int(11) DEFAULT '0',购买数量

`ordprice` float(10,2) DEFAULT '0.00',产品单价

`ordfee` float(10,2) DEFAULT '0.00',订单总金额

`ordstatus` int(11) DEFAULT '0',订单状态

`payment_type` varchar(255) DEFAULT NULL,支付类型

`payment_trade_no` varchar(255) DEFAULT NULL,支付接口交易号

`payment_trade_status` varchar(255) DEFAULT NULL,支付接口返回的交易状态

`payment_notify_id` varchar(255) DEFAULT NULL,

`payment_notify_time` varchar(255) DEFAULT NULL,

`payment_buyer_email` varchar(255) DEFAULT NULL,

`ordcode` varchar(255) DEFAULT NULL, //这个字段不需要的,大家看我西面的修正补充部分的说明!

`isused` int(11) DEFAULT '0',

`usetime` int(11) DEFAULT NULL,

`checkuser` int(11) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

*/

//在线交易订单支付处理函数

//函数功能:根据支付接口传回的数据判断该订单是否已经支付成功;

//返回值:如果订单已经成功支付,返回true,否则返回false;

function checkorderstatus($ordid){

$Ord=M('Orderlist');

$ordstatus=$Ord-where('ordid='.$ordid)-getField('ordstatus');

if($ordstatus==1){

return true;

}else{

return false;

}

}

//处理订单函数

//更新订单状态,写入订单支付后返回的数据

function orderhandle($parameter){

$ordid=$parameter['out_trade_no'];

$data['payment_trade_no'] =$parameter['trade_no'];

$data['payment_trade_status'] =$parameter['trade_status'];

$data['payment_notify_id'] =$parameter['notify_id'];

$data['payment_notify_time'] =$parameter['notify_time'];

$data['payment_buyer_email'] =$parameter['buyer_email'];

$data['ordstatus'] =1;

$Ord=M('Orderlist');

$Ord-where('ordid='.$ordid)-save($data);

}

支付宝支付流程

支付宝支付流程:

1.扫描二维码付款。首先点击进入支付宝APP,在支付宝左上角中找到扫码选项,点击扫码后用相机对准付款的二维码,即可进入付款界面,在付款界面依次输入付款额和密码就可以完成二维码付款操作。

2.用付款码付款。买东西付账的时候,把手机支付宝打开。点击“付款码”的图片。将出现的条码递给收银员,收银员将条码扫入电脑,就可以完成支付。支付完成后,马上可以收到付款成功的短信。

3.在手机应用中使用支付宝付款。这里以网易云会员为例展示支付宝付款,首先在网易云主界面点击左上角的用户界面,在用户界面中选择会员服务,再点击续费即可进入付费界面。在付费界面中选择第一项使用支付宝支付,在弹出的支付宝界面中找到点击付费并开通即可用支付宝在手机应用上付款。

(操作环境:支付宝APP 安卓版本:10.2.38.8200 网易云音乐APP 安卓版本:8.6.31 )

拓展资料:

1.支付宝余额支付功能开通方法:打开支付宝客户端,然后点击右下角的我的图标,点击右上角的齿轮形图标,进入设置页面,点击上方的支付设置选项,点击上方的扣款顺序选项,将自定义扣款顺序开关打开,长按并拖动账户余额右侧的三横图标,将账户余额拖动至最上方即可。

2.支付宝扣款顺序设置方法:首先打开支付宝客户端,进入到【我的】页面,在其页面的右上角看到【设置】字样,点击,然后在设置界面下方会看到【支付设置】一栏,点击进入,随后在支付设置界面下方点击进入【扣款顺序】一栏,即可设置默认的付款方式,比如可以开启系统自动选择付款方式,可以拖动进行顺序调整。

支付宝的支付流程是什么?

首先,简单来说,支付宝的支付有两种方式,一种是“你扫我”,即打开自己的付款码让商家扫。另一种是“我扫你”,即开打支付宝扫一扫,扫商家的收款码,然后输入支付的金额,然后确认按密码或是指纹或是刷脸。另外,还是一种是网上支付,即在网上购物时,选择用支付宝支付,页面跳转,确认信息无误后输密码,或者是指纹确认付款。

拓展资料:

支付宝(中国)网络技术有限公司成立于2004年,是国内的第三方支付平台,致力于为企业和个人提供“简单、安全、快速、便捷”的支付解决方案。支付宝公司从2004年建立开始,始终以“信任”作为产品和服务的核心。旗下有“支付宝”与“支付宝钱包”两个独立品牌。自2014年第二季度开始成为当前全球最大的移动支付厂商。

支付宝与国内外180多家银行以及VISA、MasterCard国际组织等机构建立战略合作关系,成为金融机构在电子支付领域最为信任的合作伙伴。

参考资料:支付宝-百度百科