支付宝PC端的支付(PHP)
现在的一个项目支付宝PC支付还是用的以前网关:https://mapi.alipay.com/gateway.do (是支付宝 2012年7月13日的3.3版本)
所以现在要做下支付宝PC支付的升级,用最新的网关:https://openapi.alipay.com/gateway.do
与之前的相比,代码上比之前更安全了,有公钥、私钥、APPID、签名、验签等。
支付效果见图:
首先下载好PC支付的sdk,一共有两段代码,代码是基于tp3.2框架写的
第一段:直接用get方式访问下面的这个方法
/*
* 支付宝支付--new 扫码支付
* $out_trade_no 是需要你自定义的订单号
* $subject 是这次订单的标题自定义的
* $total_fee 是付款的金额 0.01
* */
public function alipay_new($out_trade_no, $subject, $total_fee) {
//配置参数
$res = array();
$res['out_trade_no'] = $out_trade_no;
$res['subject'] = $subject;
$res['total_amount'] = $total_fee;
$res['body'] = '';
//引入核心的支付文件
vendor('AlipayPc.AopSdk');
vendor('AlipayPc.aop.AopClient');
vendor('AlipayNew.aop.request.AlipayTradePagePayRequest');
//支付宝配置参数
$config = [
'app_id' => '这个支付宝管理中心可以找到',
'merchant_private_key' => '这里面写是私钥,注意要是一行,生成的那个西药文件里面的都有回车',
'notify_url' =>'异步的回调地址',
'return_url' => '同步的回调地址',
'charset' => 'UTF-8',
'sign_type' => 'RSA2',
'gatewayUrl' => 'https://openapi.alipay.com/gateway.do',
'alipay_public_key' => '公钥,注意的地方和私钥一样',
'MaxQueryRetry' => '10',
'QueryDuration' => '3'
];
//构造参数
$timeExpress = "5m";
$aop = new \AopClient();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = '2018071560647164';
$aop->rsaPrivateKey = $config['merchant_private_key'];
$aop->alipayrsaPublicKey = $config['alipay_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='UTF-8';
$aop->format='json';
$request = new \AlipayTradePagePayRequest();
$request->setNotifyUrl($config['notify_url']);
$request->setReturnUrl($config['return_url']);
//下面的参数可以去看文档,这里有个问题我还没解决,就是passback_params这在同步返回的时候没有给带回来,有知道的可以给我留言,谢谢了
$request->setBizContent("{" .
"\"out_trade_no\":\"".$out_trade_no."\"," .
"\"passback_params\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\"," .
"\"product_code\":\"FAST_INSTANT_TRADE_PAY\"," .
"\"total_amount\":0.01," .
"\"subject\":\"".$subject."\"," .
"\"body\":\"".$subject."\"," .
"\"timeout_express\":\"5m\"" .
"}");
$result = $aop->pageExecute ($request);
echo $result;exit;//这个结果是html代码直接输出就好了,它是一个form表单,会自动触发,提交数据到网关。 }
支付完成后,它会自动跳转,会跳转到你的同步回调地址,在同步回调地址中可以用$_GET来获取到传来的信息。
第二段:这里就是获取到信息,来调用下面这个接口

public function alipayReturnNew() {
//引入核心的支付文件
vendor('AlipayPc.AopSdk');
vendor('AlipayPc.aop.AopClient');
vendor('AlipayNew.aop.request.AlipayTradeQueryRequest');
//支付宝配置参数
$config = [
'app_id' => '',
'merchant_private_key' => '',
'notify_url' => '',
'return_url' => '',
'charset' => 'UTF-8',
'sign_type' => 'RSA2',
'gatewayUrl' => 'https://openapi.alipay.com/gateway.do',
'alipay_public_key' => '',
'MaxQueryRetry' => '10',
'QueryDuration' => '3'
];
$aop = new \AopClient ();
$aop->gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$aop->appId = '';
$aop->rsaPrivateKey = $config['merchant_private_key'];
$aop->alipayrsaPublicKey = $config['alipay_public_key'];
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset='UTF-8';
$aop->format='json';
$request = new \AlipayTradeQueryRequest ();
$request->setBizContent("{" .
"\"out_trade_no\":\"".$_GET['out_trade_no']."\"," .
"\"trade_no\":\"".$_GET['trade_no']."\"" .
"}");
$result = $aop->execute ( $request);
//dump($result);exit;
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if(!empty($resultCode)&&$resultCode == 10000){
//说明支付成功了,下面就是获取需要存储的数据,存到我们的数据库,更新订单的状态了
$out_user = explode('_',$_GET['out_trade_no']);
//验证成功
$out_trade_no = $_GET['out_trade_no']; //商户订单号
$trade_no = $result->$responseNode->trade_no; //支付宝交易号
$trade_status = $result->$responseNode->trade_status; //交易状态
$total_fee = $_GET['total_amount']; //交易金额
$notify_id = $_GET['notify_id']; //通知校验ID
$notify_time = $result->$responseNode->send_pay_date; //通知的发送时间
$buyer_email = $result->$responseNode->buyer_logon_id; //买家支付宝帐号
$userID = $out_user[1]; //买家id
$parameter = [
"userID" => $userID,
"type" => 'alipay',
"orderNo" => $out_trade_no, //商户订单编号
"trade_no" => $trade_no, //支付宝交易号
"total_fee" => $total_fee, //交易金额
"trade_status" => $result->$responseNode->trade_status, //交易状态
"notify_id" => $notify_id, //通知校验ID
"notify_time" => $notify_time, //通知的发送时间
"buyer_email" => $buyer_email, //买家支付宝帐号
];
if ($result->$responseNode->trade_status == 'TRADE_FINISHED' || $result->$responseNode->trade_status == 'TRADE_SUCCESS') {
if (!checkOrderStatus($out_trade_no)) {
orderHandle($parameter); //进行订单处理,并传送从支付宝返回的参数;
}
$this->redirect('写你要跳转的地址'); //跳转到配置项中的支付成功页面;
} else {
echo "trade_status=" . $result->$responseNode->trade_status;
$this->redirect('写你要跳转的地址'); //跳转到配置项中的支付失败页面;
}
echo "验证成功<br />";
} else {
//验证失败
echo "验证失败";
}
}
前面说的 passback_params 不起作用,回调时我需要获取用户的id,所以暂时采用了将用户的id拼接进的订单号里面。
还有一个问题回调的时候验签这里通不过,所以我直接给注释了,简单粗暴,至于有什么影响还在看。


有知道原因的留下言,谢谢~~
支付宝PC端的支付(PHP)的更多相关文章
- 支付宝PC端单笔支付同步回调session失效问题
一次调用支付宝PC场景下单笔支付之后同步回调遇到的session失效问题记录 问题描述: 调用支付宝接口:alipay.trade.page.pay,该接口请求参数中有两个返回地址需要设置,retur ...
- 支付宝pc端支付接入PHP实现
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- 支付宝PC端接入PHP
引入支付宝接口 放入一个插件库中,方便管理 创建支付类 1.发起支付 public function init() { $order_id = $_REQUEST['order_id']; $orde ...
- PHP PC端支付宝扫码支付
前面的文章已经描述过在蚂蚁金服开放平台创建应用签约等流程,详见:PHP App端支付宝支付,这里就不多说了,剩下的分两步,第一步是支付前的准备工作,也就是整合支付类文件,我已经整合好可以直接用,代码开 ...
- 前端:微信支付和支付宝支付在pc端和h5页面中的应用
1:h5微信支付 使用的是https://pay.weixin.qq.com/wiki/doc/api/index.html 中的 (1):公司需要首先要配置公众号微信支付地址和测试白名单(支付的时 ...
- Python接入支付宝进行PC端支付
1. 支付宝开放平台登录,使用支付宝账号登录 https://open.alipay.com/platform/home.htm 2.选择沙箱模式 [支付宝提供了测试环境] https://docs ...
- 支付宝PC即时到账和手机网站支付同步
前几个月做了一个旅游网站,有PC站和手机站,涉及支付宝支付功能. 要求:PC站下的单,用户用手机登录也能支付;同理,手机站下的单,PC端登录也能支付. 附支付宝开放平台网址:即时到账 ,手机网站支付. ...
- 微信二维码支付-模式一(PC端,解决中文乱码问题)
近期公司调完银联,调支付宝,调完支付宝调微信.说实话微信的帮助文档确实是烂,而且有没有技术支持,害的我头发都掉了一桌.不说废话了,看代码. 首先登陆微信的公众平台(微信的服务号不是订阅号),然后选择微 ...
- 支付宝支付-PC电脑网站支付
支付产品全面升级(更新时间:2017/05/05 ),若您使用的是老接口,请移步老版本即时到账文档. 支持沙盒环境的测试 此项目已开源欢迎Start.PR.发起Issues一起讨论交流共同进步 htt ...
随机推荐
- web统计数据搜集及分析原理
在现代web应用开发中,数据扮演着越来越重要的角色:通过数据我们能够知道系统哪些地方有待改进,从而迭代开发重新上线, 随后再次通过数据我们来评估新的迭代开发是否满足了我们的预期目标,从而形成了一个数据 ...
- 我的前端页面开发js简易有效环境
前端开发主要涉及到html, css(less/sass), javascript这几个方面的知识.真正的快速有效开发,必须实现所谓所见即所得.在构建生产时,可能需要使用gulp/grunt等task ...
- 基于腾讯云centos简单搭建VSFTP
基于腾讯云centos7.3搭建VSFTP 环境分析: 基于vsftp服务在于云主机上,所以推荐使用FTP的PASV模式: FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动 ...
- nfs 服务器
1.创建共享目录 #mkdir /home/hellolinux/nfs 2.创建或修改/etc/exports文件 #vi /etc/exports home/hellolinux/nfs 192. ...
- apache log4j-1.2.15的使用
1.这个log4j的下载 下载 http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip 2. ...
- poj3259 Wormholes【Bellman-Ford或 SPFA判断是否有负环 】
题目链接:poj3259 Wormholes 题意:虫洞问题,有n个点,m条边为双向,还有w个虫洞(虫洞为单向,并且通过时间为倒流,即为负数),问你从任意某点走,能否穿越到之前. 贴个SPFA代码: ...
- 【[NOI2016]区间】
发现自己的离散化姿势一直有问题 今天终于掌握了正确的姿势 虽然这并不能阻挡我noip退役爆零的历史进程 还是先来看看离散化怎么写吧,我以前都是这么写的 for(std::set<int>: ...
- 利用SPF记录缺失发送伪造邮件
SPF,也就是 Sender Policy Framework 的缩写,是一种以IP地址认证电子邮件发件人身份的技术,是非常高效的垃圾邮件解决方案. 如何查询所属域名邮箱的SPF记录? 查询的结果,从 ...
- 【转】Spring Boot Profile使用
http://blog.csdn.net/he90227/article/details/52981747 摘要: spring Boot使用@Profile注解可以实现不同环境下配置参数的切换,任何 ...
- 二十三、详述 IntelliJ IDEA 中恢复代码的方法「进阶篇」
咱们已经了解了如何将代码恢复至某一版本,但是通过Local History恢复代码有的时候并不方便,例如咱们将项目中的代码进行了多处修改,这时通过Local History恢复代码就显得很麻烦,因为它 ...
