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')
{//支付成功
}

基于PHP的支付宝H5、APP支付相关推荐

  1. 苹果内购、支付宝微信app支付H5支付、退款

    /*** @author: tjr* @Date: 2021/4/20 15:11* @Description: 支付接口*/ @Slf4j @RestController @RequestMappi ...

  2. 支付宝手机网站支付(基于Java实现支付宝手机网站支付)

    支付宝支付核心需要的参数是(APPID,PRIVATE_KEY,ALIPAY_PUBLIC_KEY) APPID:创建应用后就有的APPID. PRIVATE_KEY:应用私钥 ALIPAY_PUBL ...

  3. 关于支付宝申请APP支付和网页支付在申请时需要的材料

    1.当我们向支付宝申请支付接口时,一般会申请网页或者移动应用. 2.当应用类型选择网页应用,如果需要账号每天不限充值额度的账号,需要有进行域名备案的网站,且必须主体是公司,才行. 3.当应用类型选择移 ...

  4. 支付宝:APP支付接口2.0(alipay.trade.app.pay)

    本章是跟支付宝进行签约对接商户服务端(也就是自行开发的JAVA后端),做此记录. 文献基本都来源于支付宝,详情请看支付宝官方文档:APP支付 目录 系统交互图 服务端demo 配置参数 获取APPID ...

  5. 小猪o2o生活通v14.17双系统版源码支付宝H5微信支付配置流程及修改方法

    1>获取移动应用的APPID填写到O2O系统后台 2> 移动应用签约功能 3> 点击支付宝开放平台移动应用信息 4> 查看支付宝公钥 5> 利用秘钥生成工具,生成一对私钥 ...

  6. php支付宝h5 app,H5网站接入支付宝的支付接口

    [HttpPost]public voidAsyncPay() {SortedDictionary sPara =GetRequestPost();//将post请求过来的参数传化为SortedDic ...

  7. java 支付宝h5网页支付接口,移动端h5网页调用支付宝支付接口

    领导第一次让我做h5支付宝支付的时候,去了支付宝开放平台,一顿上上下下左左右右,看完了长呼一口气.这个支付好像没我啥事儿啊!小伙伴儿们自行查看:https://opendocs.alipay.com/ ...

  8. 支付宝app支付回调php,php 支付宝新版本app支付以及回调

    支付宝2017年新版本支付基本业务逻辑算法 服务端生成字符串 交给客户端,express 客户端调用接口,将这段字符串str传过去 调用起支付界面.json 其中字符串str包含了全部请求参数,以及请 ...

  9. Golang Gin接入支付宝H5网页支付

    安装依赖 go get github.com/smartwalle/alipay/v3 发起账单接口 func FinishAliPayment(c *gin.Context) {appG := ap ...

最新文章

  1. torch The “freeze_support()” line can be omitted if the programis not going to be frozen to produce
  2. 手机 服务器 推送消息推送消息,推送信息到手机的pushover使用方法及sample code
  3. wsdl文档中的soap:address的生成规则_BAT大牛都在使用的数据库文档生成插件,不来看一下?...
  4. 一张图看懂SOA与微服务
  5. emWin 2天速成实例教程013_修改BUTTON按钮等控件背景皮肤颜色_SetBkColor
  6. android电源管理白名单,刷BIOS工具分享(白名单,高级菜单,电源管理
  7. 有道词典翻译功能数字有时无法翻译出来解决方案
  8. #STM32学习#6D加速度传感器测量风机震动
  9. python pandas向已有excel添加新表sheet/添加数据
  10. c语言三个灯一直亮 一个灯闪烁,电脑键盘不能用了,三个指示灯一直在闪,也用不了,是为什么...
  11. 如何引流至企业微信社群
  12. 淘宝商家批量上架宝贝的方式有哪些
  13. Tennessee Eastman(TE过程)简介
  14. 百度地图坐标增强现实 (雷达效果)附全国离线地图
  15. 体育、医药、股票思维导图模板
  16. winwebmail轻松搭建邮件服务器
  17. 软件园三区VR虚拟漫游实训项目规划
  18. Google台湾工程研究所所长:开发人员如何培养自己
  19. dede 梦织生成xml 网站地图
  20. MySQL数据库的SQLyog如何配置

热门文章

  1. 短链接网址是如何生成的?
  2. 个人收集的一个比较喜欢的词句
  3. python偷回灭霸的宝石_复联4不能合理解释:钢铁侠是怎么从灭霸手中偷走无限宝石的!...
  4. “以计算律师费、诉讼费为例”:分段计费计算器的python编写
  5. AI绘图制作超复杂风格混合抽象艺术混合体(不断更新中...)| AI绘图工具也可以玩艺术,艺术家设计师会被替代么?
  6. 终于,朋友圈要清净些了
  7. 小红书多图剪裁+微信图片选择器+大图预览+图片剪裁等等 相册
  8. 【Uniapp】二、UniAPP项目全局文件配置
  9. HQChart使用教程25- 叠加多个品种设置
  10. ”微服务一条龙“最佳指南-“最佳实践”篇:Dockerfile