支付宝H5、APP支付服务端的区别(php)
php支付宝H5和APP支付
1.准备工作
需要前往 蚂蚁金服开放平台申请
https://openhome.alipay.com/developmentDocument.htm
2.大致流程
1.用户添加商品生成订单,选择支付宝支付方式,点击购买按钮,前端发送ajax请求到后端,后端调用支付宝统一下单接口生成预付单。对于H5支付返回的是一个表单的字符串,前端接收到直接复制给页面某个div,会自动调起支付宝APP进行支付,如下图:
首先出现的是前面一个图然后自己跳到后面的图进行支付,点击后退回到前面的图,可以点继续支付重新打开后面的图。用户支付完成跳转到支付宝统一下单接口中设置的同步回调接口。H5的支付结果应该以异步回调或者查询订单API返回的值为准。APP支付同步异步的返回结果都可以作为判断是否成功支付的依据。APP支付代开的页面没有前面的图,
3.核心代码
1.统一下单接口
pay_type 0表示H5支付,1表示APP支付,下载支付宝SDK解压到项目中的目录。
if($pay_type==0)
{
$request = new AlipayTradeWapPayRequest();
$request->setNotifyUrl(PAYNOTIFYURL);//异步回调接口
$bizcontent =json_encode(array('subject'=>$goods_id,'out_trade_no'=>$order_num,'total_amount'=>$order_price,'product_code'=>'QUICK_WAP_WAY'));
$request->setReturnUrl(API_URL.'/cloud/alipay?method=alipay.trade.wap.pay.return');//同步回调接口
$request->setBizContent($bizcontent);
$response = $aop->pageExecute($request);
}else
{
$request = new AlipayTradeAppPayRequest();
$request->setNotifyUrl(PAYNOTIFYURL);
$bizcontent=json_encode(array('subject'=>$goods_id,'out_trade_no'=>$order_num,'total_amount'=>$order_price,'product_code'=>'QUICK_MSECURITY_PAY'));
$request->setReturnUrl(API_URL.'/cloud/alipay?method=pay_check');
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
}
$retObj = new stdClass();
$retObj->appId = $alipay_appid;
$retObj->priv_key_md5 = md5($private_key);
$retObj->order_sign = $response;
echo json_encode($retObj);
2.异步回调接口
判断返回参数是否合法:
if(!array_key_exists('out_trade_no',$_POST)
|| !array_key_exists('trade_no',$_POST)
|| !array_key_exists('auth_app_id',$_POST)
|| !array_key_exists('seller_id',$_POST)
|| !array_key_exists('total_amount',$_POST)
|| !array_key_exists('sign',$_POST)
|| !array_key_exists('sign_type',$_POST)
|| !array_key_exists('trade_status',$_POST))
{
exit;
}
$order_num = $_REQUEST['out_trade_no'];
$alinum = $_REQUEST['trade_no'];
$aliapp_id = $_REQUEST['auth_app_id'];
$seller_id = $_REQUEST['seller_id'];
$total_amount = $_REQUEST['total_amount'];
$sign = $_REQUEST['sign'];
$signType = $_REQUEST['sign_type'];
$trade_status = $_REQUEST['trade_status'];
if(!in_array($trade_status,array('TRADE_SUCCESS','TRADE_FINISHED')))
{
exit;
}
2.查询订单表的状态是否已经更改,若已经更改说明已经回调过,直接exit。
3.核对支付宝商户号,app_id,支付金额是否对得上,验证传过来的签名是否合法,从而拒绝非法回调。
if($aliapp_id != $alipay_appid || $total_amount != $order_price || $seller!=$seller_id)
{
$db->close();
exit;
}
$sign = str_replace(' ','+',$_POST['sign']);
$result=$aop->rsaCheckV1($_POST, NULL, "RSA2");
if(!$result)
{
$db->close();
exit();
}
4.开启事务,更新订单表支付状态,订单状态等,写支付日志。
5.代码最后输出success,以免支付宝重复回调。
echo "success";
3.查询订单接口
H5与APP返回不同,不能共用一个接口。
APP:
1.检验返回值
$retObj = new stdClass();
if( !array_key_exists('order_id',$_POST)
|| !array_key_exists('result',$_POST)
|| !array_key_exists('resultStatus',$_POST))
{
$retObj->msg=0;
echo json_encode($retObj);
unset($retObj);
exit;
}
$order_id = trim($_POST['order_id']);
//转义result反斜杠
$syncrst = stripslashes(trim($_POST['result']));
$resultStatus = (int)$_POST['resultStatus'];
if(empty($syncrst)||empty($order_id) || empty($resultStatus))
{
$retObj->msg=0;
echo json_encode($retObj);
unset($retObj);
exit;
}
if(!is_object(json_decode($syncrst)))
{
$retObj->msg=0;
echo json_encode($retObj);
unset($retObj);
exit;
}
2.根据返回状态判断
if($resultStatus == 9000 || $resultStatus ==8000 || $resultStatus==6004)
{
$arr = json_decode($syncrst);
//支付是否成功 ,订单号码,订单交易号,订单完成时间
$msg = $arr->alipay_trade_app_pay_response->msg;
$order_num_get = $arr->alipay_trade_app_pay_response->out_trade_no;
$order_trade = $arr->alipay_trade_app_pay_response->trade_no;
$time = strtotime($arr->alipay_trade_app_pay_response->timestamp);
$total_amount = $arr->alipay_trade_app_pay_response->total_amount;
$seller_id_get = $arr->alipay_trade_app_pay_response->seller_id;
$alipay_appid_get = $arr->alipay_trade_app_pay_response->app_id;
//支付成功验证签名
if($msg == "Success")
{ //支付成功,后续可以查询订单的状态值是否更改过,若已经更改,说明异步回调成功了,若没有更改可以再次更改订单状态,处理业务
$sign = $arr->sign;
$signType = $arr->sign_type;
$aop = new AopClient;
$aop->alipayrsaPublicKey=$public_key;
$sign = str_replace(' ','+',$arr->sign);
$result = $aop->verify(json_encode($arr->alipay_trade_app_pay_response),$sign,NULL,$signType);
}
}
H5:
1.接收返回值
$order_num = $_GET['out_trade_no'];
$alinum = $_GET['trade_no'];
$aliapp_id = $_GET['app_id'];
$seller_id = $_GET['seller_id'];
$total_amount = $_GET['total_amount'];
$sign = $_GET['sign'];
$signType=$_GET['sign_type'];
2.查询订单表订单状态,若为已支付,则直接返回支付成功
3.调用支付宝查询接口
//调用支付宝sdk
$aop = new AopClient ();
$aop->gatewayUrl = WAYURL;
$aop->appId = $alipay_appid;
//$aop->rsaPrivateKeyFilePath =$private_key;
$aop->rsaPrivateKey =$private_key;
$aop->format = FORMAT;
$aop->charset = CHARSET;
$aop->signType = SIGNTYPE;
$aop->apiVersion = '1.0';
$aop->postCharset=CHARSET;
$request = new AlipayTradeQueryRequest ();
$request->setBizContent("{" .
"\"out_trade_no\":\"$order_num\"," .
"\"trade_no\":\"$alinum\"" .
" }");
$result = $aop->execute ($request);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultNode = $result->$responseNode;
4.根据状态判断
if($resultNode->code == 10000 || $resultNode->msg =='Success')
{
//支付成功
}
支付宝H5、APP支付服务端的区别(php)的更多相关文章
- 支付宝app支付服务端流程
支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付封装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...
- 微信APP支付服务端开发Java版(一)
一.准备工作 去微信开发者中心下载(扫码支付,里面的大部分代码是可以用的) https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=11 ...
- 支付宝支付-APP支付服务端详解
支付宝APP支付服务端详解 前面接了微信支付,相比微信支付,支付宝APP支付提供了支付分装类,下面将实现支付宝APP支付.订单查询.支付结果异步通知.APP支付申请参数说明,以及服务端返回APP端发起 ...
- 网站的优化----首页优化---app调取服务端数据
高并发经常会发生在有大活跃用户量来访问网站的某个点,例如用户高聚集的业务场景中,如:抢购,促销等.为了让用户流畅的访问网站,来根据自己的业务设计适合系统的处理方案. //对于APP网站首页数据,通常是 ...
- 无框架完整搭建安卓app及其服务端(一)
技术背景: 我的一个项目做的的是图片处理,用 python 实现图片处理的核心功能后,想部署到安卓app中,但是对于一个对安卓和服务器都一知半解的小白来说要现学的东西太多了. 而实际上,我们的项目要求 ...
- H5 APP 页面移动端适配方案
H5 APP 页面移动端适配方案 https://segmentfault.com/a/1190000011586301 https://juejin.im/post/5cbdee71f265da03 ...
- 支付宝(移动支付)服务端java版
所需支付宝jar包: sdk2-2.0.jar(点击下载) 工具类目录结构: 点击下载 商户信息已经公钥私钥的配置(公钥私钥的生成与支付宝商户平台配置请看官方文档:https://doc.open ...
- php 支付宝新版本app支付以及回调
;支付宝快速接入; 支付宝2017年新版本支付基本业务逻辑 服务端生成字符串 交给客户端, 客户端调用接口,将这段字符串str传过去 调用起支付界面. 其中字符串str包含了所有请求参数,以及请求参数 ...
- 微信app支付(android端+java后台)
本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...
随机推荐
- 面对IBM与亚马逊的犄角攻势,微软云如何招架?
亚马逊AWS和微软Azure是全球公有云的焦点.不就前公布的财报不久前公布的财报,这两家公司云计算的收入越来越接近,从数据显示来看,亚马逊的利润比微软稍高,有人称微软云的高增长来自于捆绑销售,背后真正 ...
- 从传输流收到意外的 EOF 或 0 个字节
/// <summary> /// 发送POST请求 /// </summary> /// <param name="json"></pa ...
- C# Request获取URL常见用法
如果测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下: Request.ApplicationPath: /testweb Request ...
- Linux账号管理和ACL
by zjmyster version :1.2 Linux账号管理和ACL权限设置: 主要相关配置文件:/etc/passwd /etc/shadow /etc/group /etc/gshadow ...
- 应用线性代数简介 - 向量,矩阵和最小二乘法 By Stephen Boyd and Lieven Vandenberghe
Introduction to Applied Linear Algebra – Vectors, Matrices, and Least Squares 应用线性代数简介 - 向量,矩阵和最小二乘法 ...
- Spring注解开发-全面解析常用注解使用方法之组件注册
目录 1. @Configuration 2. @ComponentScan excludeFilters includeFilters 使用自定义TypeFilter 3. @Bean @Scope ...
- shell命令详解
sed命令 将文本input.txt中含有”姓名”字符串的行中的谢朝辉替换成扎巴依 sed -e '/姓名/s/谢朝辉/扎巴依/g' input.txt 将input.txt中第n(5)行替换成”ji ...
- 小程序——使用Easy Mock
使用Easy Mock 一.什么是Easy Mock Easy Mock 是一个可视化的能快速生成模拟数据的持久化服务.在实际开发中常见的Mock方式一般是将模拟数据直接写在代码里,利用Java ...
- February 6 2017 Week 6 Monday
There are no shortcuts to any place worth going. 任何值得去的地方,都没有捷径. Several years ago, I climbed the Hu ...
- Oracle基础操作
数据库的定义.作用介绍: 什么是数据库? 按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. 数据库的发展史: 起始于1962年,1968年在IBM出现 数据库在测试过程中的作用: 需 ...