PHP支付,TP5.0接入支付宝支付流程

news/2024/9/29 15:58:12

一、支付宝沙箱

1.登录支付宝开放平台https://open.alipay.com/;点击右上角的“控制台”菜单

 2.下拉到页末找到“沙盒”

 

 配置一下基础信息:配置一下信息,特别注意,网关地址:沙箱环境是有dev的,正式上要去掉 dev;

二、DEMO

1.下载电脑网站支付Demo php版本

 2.下载后把整个文件解压,整体放倒TP5项目的 extend 文件夹中,此文件夹就是为了放一些扩展的。(名字改简单alipay)

 

有几个文件,需要特别注意:
1.config : 文件是防止你所有的配置,公钥,私钥,回调地址,appid等信息
2.notify_url :是回调地址的文件
3.return_url : 是同步调用的文件
解释:
回调地址:说白了,就是告诉你支付成功了,这个识货,你需要在这个里面修改订单状态。——后续再说整体支付流程
同步调用:再说白了,就是支付成功,跳转到一个新的页面,支付成功会带着支付的一些信息。
回调地址是看不到请求的,因为是服务器请求服务器,只能看日志,所以需要在回调地址里面 写上日志请求。

三、创建支付

1.前端

<?php
/* ** 功能:支付宝电脑支付调试入口页面* 说明:* 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。* 这个是支付宝自带的页面,可以用这个进行测试*/?>
<!DOCTYPE html>
<html><head><title>支付宝电脑网站支付</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>*{margin:0;padding:0;}ul,ol{list-style:none;}body{font-family: "Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;}.tab-head{margin-left:120px;margin-bottom:10px;}.tab-content{clear:left;display: none;}h2{border-bottom: solid #02aaf1 2px;width: 200px;height: 25px;margin: 0;float: left;text-align: center;font-size: 16px;}.selected{color: #FFFFFF;background-color: #02aaf1;}.show{clear:left;display: block;}.hidden{display:none;}.new-btn-login-sp{padding: 1px;display: inline-block;width: 75%;}.new-btn-login {background-color: #02aaf1;color: #FFFFFF;font-weight: bold;border: none;width: 100%;height: 30px;border-radius: 5px;font-size: 16px;}#main{width:100%;margin:0 auto;font-size:14px;}.red-star{color:#f00;width:10px;display:inline-block;}.null-star{color:#fff;}.content{margin-top:5px;}.content dt{width:100px;display:inline-block;float: left;margin-left: 20px;color: #666;font-size: 13px;margin-top: 8px;}.content dd{margin-left:120px;margin-bottom:5px;}.content dd input {width: 85%;height: 28px;border: 0;-webkit-border-radius: 0;-webkit-appearance: none;}#foot{margin-top:10px;position: absolute;bottom: 15px;width: 100%;}.foot-ul{width: 100%;}.foot-ul li {width: 100%;text-align:center;color: #666;}.note-help {color: #999999;font-size: 12px;line-height: 130%;margin-top: 5px;width: 100%;display: block;}#btn-dd{margin: 20px;text-align: center;}.foot-ul{width: 100%;}.one_line{display: block;height: 1px;border: 0;border-top: 1px solid #eeeeee;width: 100%;margin-left: 20px;}.am-header {display: -webkit-box;display: -ms-flexbox;display: box;width: 100%;position: relative;padding: 7px 0;-webkit-box-sizing: border-box;-ms-box-sizing: border-box;box-sizing: border-box;background: #1D222D;height: 50px;text-align: center;-webkit-box-pack: center;-ms-flex-pack: center;box-pack: center;-webkit-box-align: center;-ms-flex-align: center;box-align: center;}.am-header h1 {-webkit-box-flex: 1;-ms-flex: 1;box-flex: 1;line-height: 18px;text-align: center;font-size: 18px;font-weight: 300;color: #fff;}
</style>
</head>
<body text=#000000 bgColor="#ffffff" leftMargin=0 topMargin=4>
<header class="am-header"><h1>支付宝电脑网站支付体验入口页</h1>
</header>
<div id="main"><div id="tabhead" class="tab-head"><h2 id="tab1" class="selected" name="tab">付 款</h2><h2 id="tab2" name="tab">交 易 查 询</h2><h2 id="tab3" name="tab">退 款</h2><h2 id="tab4" name="tab">退 款 查 询</h2><h2 id="tab5" name="tab">交 易 关 闭</h2></div>
<!--        <form name=alipayment action=pagepay/pagepay.php method=post target="_blank">--><form name=alipayment action=payDemo method=post target="_blank"><div id="body1" class="show" name="divcontent"><dl class="content"><dt>商户订单号
:</dt><dd><input id="WIDout_trade_no" name="WIDout_trade_no" /></dd><hr class="one_line"><dt>订单名称
:</dt><dd><input id="WIDsubject" name="WIDsubject" /></dd><hr class="one_line"><dt>付款金额
:</dt><dd><input id="WIDtotal_amount" name="WIDtotal_amount" /></dd><hr class="one_line"><dt>商品描述:</dt><dd><input id="WIDbody" name="WIDbody" /></dd><hr class="one_line"><dt></dt><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">付 款</button></span><span class="note-help">如果您点击“付款”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form><form name=tradequery action=pagepay/query.php method=post target="_blank"><div id="body2" class="tab-content" name="divcontent"><dl class="content"><dt>商户订单号
:</dt><dd><input id="WIDTQout_trade_no" name="WIDTQout_trade_no" /></dd><hr class="one_line"><dt>支付宝交易号
:</dt><dd><input id="WIDTQtrade_no" name="WIDTQtrade_no" /></dd><hr class="one_line"><dt></dt><dd><span style="line-height: 28px; color:red;">注意:商户订单号和支付宝交易号不能同时为空。 trade_no、  out_trade_no如果同时存在优先取trade_no</span></dd><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">交 易 查 询</button></span><span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“交易查询”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form><form name=traderefund action=pagepay/refund.php method=post target="_blank"><div id="body3" class="tab-content" name="divcontent"><dl class="content"><dt>商户订单号
:</dt><dd><input id="WIDTRout_trade_no" name="WIDTRout_trade_no" /></dd><hr class="one_line"><dt>支付宝交易号
:</dt><dd><input id="WIDTRtrade_no" name="WIDTRtrade_no" /></dd><hr class="one_line"><dt>退款金额
:</dt><dd><input id="WIDTRrefund_amount" name="WIDTRrefund_amount" /></dd><hr class="one_line"><dt>退款原因
:</dt><dd><input id="WIDTRrefund_reason" name="WIDTRrefund_reason" /></dd><hr class="one_line"><dt>退款请求号
:</dt><dd><input id="WIDTRout_request_no" name="WIDTRout_request_no" /></dd><hr class="one_line"><dt></dt><dd><span style="line-height: 28px; color:red;">注意:如是部分退款,则参数退款单号(out_request_no)必传。</span></dd><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">退 款</button></span><span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“退款”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form><form name=traderefundquery action=pagepay/refundquery.php method=post target="_blank"><div id="body4" class="tab-content" name="divcontent"><dl class="content"><dt>商户订单号
:</dt><dd><input id="WIDRQout_trade_no" name="WIDRQout_trade_no" /></dd><hr class="one_line"><dt>支付宝交易号
:</dt><dd><input id="WIDRQtrade_no" name="WIDRQtrade_no" /></dd><hr class="one_line"><dt>退款请求号
:</dt><dd><input id="WIDRQout_request_no" name="WIDRQout_request_no" /></dd><hr class="one_line"><dt></dt><dd><span style="line-height: 28px; color:red;">注意:退款请求号值(必传,退款时传的值,如果退款时没传则无法查询)商户订单号和支付宝交易号不能同时为空。 trade_no、  out_trade_no如果同时存在优先取trade_no</span></dd><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">退 款 查 询</button></span><span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“退款查询”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form><form name=tradeclose action=pagepay/close.php method=post target="_blank"><div id="body5"  class="tab-content" name="divcontent"><dl class="content"><dt>商户订单号
:</dt><dd><input id="WIDTCout_trade_no" name="WIDTCout_trade_no" /></dd><hr class="one_line"><dt>支付宝交易号
:</dt><dd><input id="WIDTCtrade_no" name="WIDTCtrade_no" /></dd><hr class="one_line"><dt></dt><dd><span style="line-height: 28px; color:red;">注意:商户订单号和支付宝交易号不能同时为空。 trade_no、  out_trade_no如果同时存在优先取trade_no</span></dd><dd id="btn-dd"><span class="new-btn-login-sp"><button class="new-btn-login" type="submit" style="text-align:center;">交 易 关 闭</button></span><span class="note-help">商户订单号与支付宝交易号二选一,如果您点击“交易关闭”按钮,即表示您同意该次的执行操作。</span></dd></dl></div></form><div id="foot"><ul class="foot-ul"><li>支付宝版权所有 2015-2018 ALIPAY.COM</li></ul></div></div>
</body>
<script language="javascript">var tabs = document.getElementsByName('tab');var contents = document.getElementsByName('divcontent');(function changeTab(tab) {for(var i = 0, len = tabs.length; i < len; i++) {tabs[i].onmouseover = showTab;}})();function showTab() {for(var i = 0, len = tabs.length; i < len; i++) {if(tabs[i] === this) {tabs[i].className = 'selected';contents[i].className = 'show';} else {tabs[i].className = '';contents[i].className = 'tab-content';}}}function GetDateNow() {var vNow = new Date();var sNow = "";sNow += String(vNow.getFullYear());sNow += String(vNow.getMonth() + 1);sNow += String(vNow.getDate());sNow += String(vNow.getHours());sNow += String(vNow.getMinutes());sNow += String(vNow.getSeconds());sNow += String(vNow.getMilliseconds());document.getElementById("WIDout_trade_no").value =  sNow;document.getElementById("WIDsubject").value = "测试";document.getElementById("WIDtotal_amount").value = "0.01";}GetDateNow();
</script>
</html>
test.html

2.后端

   public function test(){return $this->fetch();} public function payDemo(){require_once '../extend/alipay/pagepay/service/AlipayTradeService.php';require_once '../extend/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php';// 接取所有的值,或者可以使用 input('params.');$data = input('post.');// 咳咳... 这里只是为了方便理解,正常是要调用config的,或者封装起来的!!! 千万不要在代码里面这么写 $config = array (//应用ID,您的APPID。'app_id' => "9021000139649462",//商户私钥,您的原始格式RSA私钥'merchant_private_key' => "MIIEpAIBAAKCAQEAv1lnXdJvQJZlcoxJE5SnUrGiDvFaGMHN5E31/TryfHyG/3QwaD5apc6gh5Ruam4N86wu4tONrQPjVzXGSW0MXIuoNWlKU+UVhHIefK6yO6bUBixHe58KaR370M2/QIJcMZ6XoirzulsRuUdWwgvVwJkmyL/2DGBY0LPTeOs2YKBuktrLf0JT27Qg7Cj8TnRjM+6nIFfzrqVurlgI927uHP1Y/JOOoIejIfdno3G4suvZU3RIlgHDCLdvIp/Sm+nSrfueTcLQATvcPd0gEJNyfkk0RDiVlPo/coij7x/jrQMn0MinSUhS7ZUhBNhtDEO77zerCCuB+PJlzfNJUR/kLwIDAQABAoIBAH+EukEpSyD02XikCtM0vul6HbDtoQhcp7SdS/DNhun1JxY4vUXLQCe9cvfHsGnXHA8m0TwylfkWXTwyRwmJ1bIbFCc8Gt+cDGHul2iqF3dvb18JxT2aOJri830skGcSORSMRys4iqLHrCEYbLX2oyWuKs2gN/35e1bicGzl+6AaQ3cro8sfagsYhaKDHQz4aZtrAndXLnbNPOBN/56kf7Pu1G+fEsIkrsImHGs968fliBXVtKQB75tAoYHLPRgfkjp23FH3SRzR61uHn9V/uq3ki1xkLJfkdYfHiuD3SCS1Uz1sJTun2blJR0R//IXDrLmKZ4fZjnLo81ZWEh0V1uECgYEA3YHieS5z9VB+luhiBk5pFSgM6P7veXNFF2nfP7JB/dC0xgG3mNBiPqG+AVskEannqtAE6nW6PZFJFEI8wJTUCMzNmZp37CrbPvhRETx6YcSSLvNYeuTb/JXHIhljrQpFShugHVmB12C8t9CiawHc6AwZ7QizES1UGmZe2EqQE7ECgYEA3SVNh7EP5M9E8FUeTiyDMS98lgSzXuZkfKGWhZ0A0rrr7mwTltmamWhVZwBXCVzQ59VltIakDYojt2K96wj2dnn4aRpE7yxCczyDwYVQ/Rd6yugcLznnVK+IvyMZkwq9Nbmd3rlbXKXNsuPOvwcfuyCFL2L/cj2NJ3XZo7P6zd8CgYAUmNVES2uA7iE3SxiCWZwv2W+J4trFwlA0YyXdOGgmf9evac12qjnYdRXD7oOmGNRv77PlUVkmDHJtLdOUXMJypwifNdvc3AdTDagMIEGJAcxODVa25r0F+a9wnkfEeWYEBBmZYQ9PxbEGrqHLrXqrISTwA5UTDdH6OnarShOnoQKBgQDDZH8xIhfJ8fyWYI6rQZcU8UEiB7s4YVZt7BPjsEoW50MoYOOaCGAZpV636Ev+oLyP6jO3orL2p5RRJvRo431oRvJeYvB/Zlq8GL7NUO6zAHjlKNomPAISCBpJz0h8bCOrgXpkXN/FZ1Xs9m0oybGWk/A5Yz4SgSHjuLP4eUBjfwKBgQDb5CEXZ9uxHfgTzaWBnr2XcUFV9j0Fo7wytBQivQKNDzrFZ+18+kLN1neeXkZ2O+p99+0i/GAUf7ps4w7OWBOFz3nLNBy38HBBC9JIyta6xkqVunS5ugaLPmYCVuF2yBROu7NAJdBsznt9qZ1Gm6P3OeEV7VUEIsJWzaPw+S1xbw==",//异步通知地址'notify_url' => "https://app.xxx.com/api/wallet/alinotify",//同步跳转'return_url' => "https://app.xxx.com/api/wallet/alinotify",//编码格式'charset' => "UTF-8",//签名方式'sign_type'=>"RSA2",//支付宝网关'gatewayUrl' => "https://openapi.alipaydev.com/gateway.do",//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。'alipay_public_key' => "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgSwMMsbNGYNQ6bcop7qDUHp1fA3cD/XdIgm8US7ziqpj4+MYGONZEv6rqr8K4JzHkUVo3DWuFW7u81mf0FwIySojrnRLlz8MJOVpPnifeUPMXaC7SDAqJHxRpWm6gkFsgDLlq1vLsdeRcH2YBjI16DqEwfZ/0RT0M/hgO0RfsgEN0yKsTUOzC4CEs3xxBnxJ+NO9Af4JaB3xiEkRHKO9AK8K2zt7LZCe8icoOdxjTk/mbBBaf1T0QcjnfOyADUHOh3r6uh5Mhlj1TI8BA+oxm+NMzVsCr2/QPuTLVvLthqqgxjE8yWAYfzpOc269fyhFtGmBn4txuMq5Dn2k5yNpywIDAQAB",//日志路径'log_path' => "",);// halt($data);$payRequestBuilder = new \AlipayTradePagePayContentBuilder();// 订单的各种信息,说明,主体,订单号,订单金额,支付成功后返回$payRequestBuilder->setBody($data['WIDsubject']);$payRequestBuilder->setSubject($data['WIDbody']);$payRequestBuilder->setTotalAmount(floatval($data['WIDtotal_amount']));$payRequestBuilder->setOutTradeNo($data['WIDout_trade_no']);$aop = new \AlipayTradeService($config);$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);echo $response;echo '<pre>';var_dump($data);die();}

 

支付的时候,可能会有一个报错,each 可能会报错
需要修改 AopClient.php 415行代码,把while 改成foreach,因为php 更新后,就不支持each了。需要注意下!

 

     //    while (list ($key, $val) = each ($para_temp)) {foreach ($para_temp as $key =>$val){if (false === $this->checkEmpty($val)) {//$val = $this->characet($val, $this->postCharset);$val = str_replace("'","&apos;",$val);//$val = str_replace("\"","&quot;",$val);$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";}}//}

 

支付宝沙箱支付可能遇见的问题

https://blog.csdn.net/weixin_51324855/article/details/124098732

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/66204.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

无法访问你试图使用的功能所在的网络位置

无法访问你试图使用的功能所在的网络位置、无法删除 xxxx工具的旧版本问题如标题,被这个问题搞吐了。报错如下如:     起因是公司的产品有些周边工具,在分析和排查问题的过程中,遇到上图这个问题,因为要反复卸载和重装,还涉及到不同版本,最后玩坏了。卸载以后,Wind…

EKP qhky 附件A4纸张打印效果

一.需求背景 需求:EKP V16,对于附件打印 开发者一般情况下使用的是 请求直接预览打印 ,但是对于 需要自定义打印文件的大小 需要特别定制!方案:使用 PDF.js 在 JSP 页面中显示 PDF 文件(EKPV16 项目中已引入 PDF.js 库) 定制前效果:定制后效果: 二.Code 其中附件链接 …

Orange Pi + SPI点亮 ws2812

开发板型号:OrangePi One 系统版本:Ubuntu 20.04 focal Desktop 接口:SPI1. 连线 TB上买的ws2812大概长这样:细节标在图上了。 带插头的一端连上即可。其带针脚一端是多组灯带串联时候用。DI接SPI的MOSI。 参考博客[1] 2. 启用硬件SPI 在设置里有一个orangepi-config的执行…

时间格式化标签说明

时间格式化标签和PHP时间格式化语法一致,可以使用不同的字母代替,中间可以穿插任意字符。常见的格式包括:Y:四位数的年份 m:两位数的月份 d:两位数的日期 H:两位数的小时 i:两位数的分钟 s:两位数的秒示例格式 以下是一些示例格式:Y-m-d:2023-09-15 Y/m/d:2023/09/…

PbootCMS模板添加栏目提示:该内容栏目编号已经存在,不能再使用

当你在PbootCMS中添加栏目时,如果提示“该内容栏目编号已经存在,不能再使用”,这通常是因为数据库中的栏目编号(scode)已经存在重复。解决这个问题的方法是修改数据库中对应的栏目编号。 解决办法 1. 使用数据库管理工具 推荐使用数据库管理工具(如Navicat Premium)来管…

大json字符串处理

背景: 当从API获取数据或与其他系统交换信息时。有时json字符串可能会非常庞大,以至于读取到内存中会导致内存溢出或者性能问题 流式处理: 如果JSON字符串过大,不适合一次性加载到内存中,可以考虑使用流式处理。例如,使用Jackson库的JsonParser,可以逐行解析JSON,从而避…

一文读懂 Git fetch 和 Git pull 的终极区别(带实验结果)

Git pull 是一个 Git 命令用来同时执行 git fetch 和 git merge。本文分享了这两个命令的区别和用法。 Git 命令是非常流行的,尤其是在分布式版本控制系统中,可以对远端的仓库进行同步。开发者需要根据项目实际所需来选择合适的命令。在本文章中,我们将解释 git fetch 和 g…

pbootcms的图片裁剪确保无论图片是横图还是竖图,都能居中裁剪

解决方案找到裁剪缩略图的方法:文件位置:/core/function/file.php 搜索:function cut_img,大约在447行优化cut_img方法:实现居中裁剪功能优化代码 以下是优化后的cut_img函数代码: // 剪切图片 function cut_img($src_image, $out_image = null, int $new_width = null, …