【支付宝】对接手机网站支付踩坑点记录

news2024/9/30 13:21:57

前言

简单记录一下对接Wap支付的问题,alipay和wxpay认证过程差不多,有个体商户或企业即可,前者文档不易懂后者还好,但是wxpay门槛高,个人认为pc网站支付(native支付)就是为了收300认证费!

应用公私钥

在这里插入图片描述
第一个,用于去支付宝开放平台获取支付宝私钥
在这里插入图片描述

第二个,应用私钥RSA2048是商户私钥

开放平台产品绑定问题

问题:接入检测未通过,显示未绑定,点击绑定后显示绑定成功,并跳转到图三,再次刷新依然没有绑定成功

图一:
在这里插入图片描述

图二:
在这里插入图片描述

图三:

在这里插入图片描述

解决方案:
支付宝工作人员说,不需要去管,显示已开通即可,直接通过代码调用实现即可
在这里插入图片描述

对接测试

在这里插入图片描述
测试通过,发现没有问题,能在正常拉起支付
在这里插入图片描述

支付DEMO

https://opendocs.alipay.com/common/02kkv5?pathHash=17e7ce50

PHP下载
JAVA下载
.NET下载

在这里插入图片描述

源码目录结构说明
├─src
│  └─com.alipay
│      └─config
│          ├─AlipayConfig        配置类
│      └─util
│          ├─logFile        日志类
├─WebContent
│  └─META-INF
│  └─ wappay 手机网站支付
│          ├─close.jsp 统一收单交易关闭接口调试入口页面
│          ├─downloadurl.jsp 查询对账单下载地址接口调试入口页面
│          ├─ pay.jsp 支付宝手机网站支付接口(alipay.trade.wap.pay)接口调试入口页面
│          ├─query.jsp 统一收单线下交易查询调试入口页面
│          ├─refund.jsp 统一收单交易退款接口调试入口页面
│          ├─ refundquery.jsp 统一收单交易退款查询调试入口页面
│  └─ META-INF
│      └─ lib 依赖类库
│          ├─alipay-sdk-java-3.3.0.jar
│          ├─alipay-sdk-java-3.3.0-source.jar
│          ├─ commons-logging-1.1.1.jar
│          ├─ commons-logging-1.1.1-sources.jar
│       ├─index.html
│       ├─notify_url.jsp
│       ├─ return_url.jsp

编写业务逻辑

新建数据库,存放下单信息
在这里插入图片描述

下单操作

<?php
/* *
 * 功能:支付宝手机网站支付接口(alipay.trade.wap.pay)接口调试入口页面
 * 版本:2.0
 * 修改日期:2016-11-01
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 请确保项目文件有可写权限,不然打印不了日志。
 */

header("Content-type: text/html; charset=utf-8");
include '../../api/conn.php';

require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'service/AlipayTradeService.php';
require_once dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'buildermodel/AlipayTradeWapPayContentBuilder.php';
require dirname ( __FILE__ ).DIRECTORY_SEPARATOR.'./../config.php';
if (!empty($_GET['openid'])){
    // 参数接收
    $out_trade_no =date("YmdHis").mt_rand(100,999).mt_rand(1000,9999);//订单创建
    $subject = ''; //订单名称,必填
    $openid= $_GET['openid'];//注册的手机号
    $recharge= $_GET['recharge'];//recharge 0余额1....
    $remaks = $_GET['remaks'];//remaks 各续费的服务id
    $money=$_GET['money'];//recharge为0时生效 付款金额,必填
    $body = '';//商品描述,可空
if ($recharge==0) {
    $total_amount=$money;
    $subject='鱿鱼助手-C币充值';
} else {
   //查询服务费
   $sql="SELECT * FROM `funtion` WHERE `id` = '$recharge'";
    $result = $conn->query($sql);



if ($roows=mysqli_fetch_assoc($result)) {
    
  //success
  $total_amount=$roows['price'];
  $subject='续费'.$roows['name'];
  
 
} else {
    die('请求余额出错');
}


   //查询服务费
   
}
    // 参数接收
   

    


   

    //超时时间
    $timeout_express="1m";

    $payRequestBuilder = new AlipayTradeWapPayContentBuilder();
    $payRequestBuilder->setBody($body);
    $payRequestBuilder->setSubject($subject);
    $payRequestBuilder->setOutTradeNo($out_trade_no);
    $payRequestBuilder->setTotalAmount($total_amount);
    $payRequestBuilder->setTimeExpress($timeout_express);

    $payResponse = new AlipayTradeService($config);
    // 
     //创建订单到数据库
    $insert="INSERT INTO `alipay_order` (`id`, `out_trade_no`, `openid`, `name`, `money`, `is_pay`, `recharge`, `remaks`, `create_time`) VALUES (NULL, '$out_trade_no', '$openid', '$subject', '$total_amount', '0', '$recharge', '$remaks', CURRENT_TIMESTAMP)";
    $r=$conn->query($insert);
    
    // 
    $result=$payResponse->wapPay($payRequestBuilder,$config['return_url'],$config['notify_url']);
    
    

    return ;
}
else{
    die("参数不正确拉起支付失败");
}
?>

异步通知操作

该部分回调简单,可根据自己的业务进行处理,部分构造demo已经提供,开发者做好自己的业务处理即可!

<?php
/* *
 * 功能:支付宝服务器异步通知页面
 * 版本:2.0
 * 修改日期:2016-11-01
 * 说明:
 * 以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。

 *************************页面功能说明*************************
 * 创建该页面文件时,请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试,请到服务器上做测试。请确保外部可以访问该页面。
 * 如果没有收到该页面返回的 success 信息,支付宝会在24小时内按一定的时间策略重发通知
 */
require_once("config.php");
require_once("../api/conn.php");
require_once 'wappay/service/AlipayTradeService.php';


$arr=$_POST;
$alipaySevice = new AlipayTradeService($config); 
$alipaySevice->writeLog(var_export($_POST,true));
$result = $alipaySevice->check($arr);

/* 实际验证过程建议商户添加以下校验。
1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email)
4、验证app_id是否为该商户本身。
*/
if($result) {
    //验证成功
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//请在这里加上商户的业务逻辑程序代

	
	//——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
	
    //获取支付宝的通知返回参数,可参考技术文档中服务器异步通知参数列表
	
	//商户订单号

	$out_trade_no = $_POST['out_trade_no'];

	//支付宝交易号

	$trade_no = $_POST['trade_no'];

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


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

		//判断该笔订单是否在商户网站中已经做过处理
			//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
			//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
			//如果有做过处理,不执行商户的业务程序
				
		//注意:
		//退款日期超过可退款期限后(如三个月可退款),支付宝系统发送该交易状态通知
    }
    else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
        $sq="UPDATE `alipay_order` SET `is_pay` = '1'  WHERE  out_trade_no='$out_trade_no'";
        $r=$conn->query($sq);
		//判断该笔订单是否在商户网站中已经做过处理
			//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
			//请务必判断请求时的total_amount与通知时获取的total_fee为一致的
			//如果有做过处理,不执行商户的业务程序			
		//注意:
		//付款完成后,支付宝系统发送该交易状态通知
    }
	//——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
        
	echo "success";		//请不要修改或删除
		
}else {
    //验证失败
    echo "fail";	//请不要修改或删除

}

?>


数据库

在这里插入图片描述

下单流程

拉起支付时,在下单页面pay.php(/alipay/wappay)中插入订单创建记录到数据库,存储拉起支付的用户及订单信息,通过异步通知notify_url.php (/alipay)进行回调

支付成功将对应的支付订单号,支付状态改为支付成功,最后根据自己的业务进行编写即可

 else if ($_POST['trade_status'] == 'TRADE_SUCCESS') {
       //下单成功操作
$sq="UPDATE `alipay_order` SET `is_pay` = '1'  WHERE  out_trade_no='$out_trade_no'";
$r=$conn->query($sq);

//查询订单数据进行奖励
    }

最后

《记一次云之家签到抓包》
《记一次视频抓包m3u8解密过程》
《抓包部分软件时无网络+过代理检测 解决办法 安卓黄鸟httpcanary+vmos》
《Python】记录抓包分析自动领取芝麻HTTP每日免费IP(成品+教程)》
《某课抓包视频 安卓手机:黄鸟+某课app+VirtualXposed虚拟框架》

推荐专栏:

《Python爬虫脚本项目实战》

该专栏往期文章:
《【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)》

🥦如果感觉看完文章还不过瘾,欢迎查看我的其它专栏
🥦作者对python有很大的兴趣,完成过很多独立的项目:例如滇医通等等脚本,但是由于版权的原因下架了,爬虫这一类审核比较严谨,稍有不慎就侵权违规了,所以在保证质量的同时会对文章进行筛选

如果您对爬虫感兴趣请收藏或者订阅该专栏哦《Python爬虫脚本项目实战》,如果你有项目欢迎联系我,我会同步教程到本专栏!

🚀Python爬虫项目实战系列文章!!
⭐⭐欢迎订阅⭐⭐

【Python爬虫项目实战一】获取Chatgpt3.5免费接口文末付代码(过Authorization认证)
【Python爬虫项目实战二】Chatgpt还原验证算法-解密某宝伪知网数据接口

⭐⭐欢迎订阅⭐⭐
在这里插入图片描述

Python爬虫脚本项目实战
在这里插入图片描述

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

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

相关文章

《剑指 Offer》专项突破版 - 面试题 112 : 最长递增路径(C++ 实现)

题目链接&#xff1a;最长递增路径 题目&#xff1a; 输入一个整数矩阵&#xff0c;请求最长递增路径的长度。矩阵中的路径沿着上、下、左、右 4 个方向前行。例如&#xff0c;下图中矩阵的最长递增路径的长度为 4&#xff0c;其中一条最长的递增路径为 3->4->5->8&…

护眼落地灯哪个牌子好?落地灯十大知名品牌

一款优异的落地灯不只有照明的作用&#xff0c;更有装修作用。只不过&#xff0c;市面上的落地灯产品很多&#xff0c;质量良莠不齐&#xff0c;很多人不知道怎么挑选是好。小编的主张是从品牌下手&#xff0c;挑选口碑上佳的品牌落地灯产品。若问护眼落地灯哪个牌子好&#xf…

Flask-SQLAlchemy 中使用显式主主数据库设置

1、问题背景 在一个 Flask-SQLAlchemy 项目中&#xff0c;用户想要使用显式主主数据库设置。具体而言&#xff0c;他想要能够从默认数据库中读取数据&#xff0c;并将数据持久化到两个主数据库中。他希望知道是否可以使用 Flask-SQLAlchemy 和 binds 来实现这一目标。 2、解决…

【MySQL篇】mysqlpump和mysqldump参数区别总汇(第三篇,总共四篇)

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux&#xff0c;也在扩展大数据方向的知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&am…

Windows 的常用命令(不分大小写)

Net user &#xff08;查看当前系统所有的账户&#xff09; net user yourname password /add 添加新用户 net localgroup administrators yourname /add 添加管理员权限 net user yourname /delete 删除用户 net user 命令 [colorred]说明&#xff1a;以下命令仅限持管理员…

[创业之路-106] :经济学十大陷阱与核心思想:系统论、社会进化论、周期论、阴阳互转论

目录 前言&#xff1a; 一、流动性陷阱。 二、中等收入陷阱。 三、修昔底德陷阱。 四、塔西佗陷阱。 五、金德尔伯格陷阱。 六、卢梭陷阱。 七、拉美陷阱。 八、阿喀琉斯之踵。 九、布拉德伯里悖论。 十、李约瑟之谜 结论&#xff1a;上述陷阱的…

负载均衡集群——Nginx

目录 1.Nginx反向代理实战 2.Nginx 反向代理和负载均衡实践 实验操作步骤 步骤 1 Nginx1 和 Nginx2 配置 步骤2 测试资源是否可用 步骤 3 安装和配置 Nginx 代理 步骤 4 代理服务器配置检测 步骤 5 在 Nginx1 和 Nginx2 配置虚拟主机 步骤 6 将虚拟主机添加入后端主机组…

Linux--基础IO(上)

目录 1. 文件的边角知识 1.1 文件是什么&#xff1f; 1.2 文件是怎么打开的&#xff1f; 1.3 进程与文件 进程与文件的关系 2. 重温c语言文件接口 2.1 打开文件的方式 2.2 读写文件接口的重温 2.2.1 写文件 2.2.2 读文件 3. 系统文件I/O 3.1 系统接口 3.2 系…

零信任网络安全技术雷达图3.0正式发布

伴随零信任理念的发展和实施&#xff0c;零信任技术体系的演进变革也日趋完善。易安联力图通过持续更新并优化零信任雷达图&#xff0c;以反映零信任技术在应对新型网络安全挑战中的创新和发展&#xff0c;为企业和组织提供前瞻性的技术建议&#xff0c;助力其构建更为强大和灵…

前端JS必用工具【js-tool-big-box】,日期时间相关工具二

上一节我们说到了工具中关于日期的详细转换&#xff0c;还有获取年月日时分秒的详细转换方法使用&#xff0c;同时可以灵活添加自己需要的单位&#xff0c;很便捷。这一节我们继续学习几个相关的方法 目录 1 安装和引入 2 某个时间距离现在的显示 3 获取某一年是是平年还是…

dataguard环境破坏后采用rman备份集重新部署

dataguard环境破坏后采用rman备份集重新部署 1. 环境 主库: 192.168.1.118 备库: 192.168.1.85 OS: Centos7 DB: 11.2.0.4 前提条件:dataguard之前已经搭建好,从库的spfile和密码文件不需要创建,主库的数据文件目录在从库必须存在&#xff0c;这里的场景是主库…

请编写一个函数void fun(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入xx所指的数组中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法和详细的解析。 题干 请编写一个函…

TVbox三端助手MAC+Windows+手机版带接口

Vbox这个目前大热的电视播放器&#xff0c;由于是空壳&#xff0c;于是接口成为非常核心的一环&#xff0c;很多网友制作的接口会进行加密&#xff0c;以防被人复制使用。 最近发现有人对此做了个专门解密的工具&#xff0c;解不解密的不重要的&#xff0c;分享迷倒是觉得这工…

树莓集团与企业协同育人,打造成都数字产业人才培养高地

树莓集团&#xff0c;作为成都数字产业的重要力量&#xff0c;深知企业协同育人的重要性。我们坚信&#xff0c;通过校企合作的模式&#xff0c;可以从供给侧结构性改革的角度出发&#xff0c;开展精准、高效的人才培养工作。我们既是企业&#xff0c;也是产业的代表&#xff0…

VUE识别图片文字OCR(tesseract.js)

效果:1&#xff1a; 效果图2&#xff1a; 一、安装tesseract.js npm i tesseract.js 二、静态页面实现 <template><div><div style"marginTop:100px"><input change"handleChage" type"file" id"image-input"…

uniapp使用腾讯地图实现商家定位

uniapp使用腾讯地图实现商家定位 一丶申请腾讯位置服务开发者密钥二丶下载微信小程序JavaScriptSDK三丶安全域名设置四、代码编写五、实现效果 一丶申请腾讯位置服务开发者密钥 官网教程&#xff1a;微信小程序JavaScript SDK | 腾讯位置服务 点击申请密钥 创建应用&#xf…

Hive 中常用的函数以及数据类型

数据类型 1.基本数据类型: 数据类型大小范围示例TINYINT1byte-128 ~ 127100YSMALLINT2byte-32768 ~ 32767100SINT4byte-2^32~ 2^32-1100BIGINT8byte-2^64~ 2^64-1100LFLOAT4byte单精度浮点数5.21DOUBLE8byte双精度浮点数5.21DECIMAL-高精度浮点数DECIMAL(9,8)BOOLEAN-布尔型tr…

Windows系统下安装paddle

开始使用_飞桨-源于产业实践的开源深度学习平台 (paddlepaddle.org.cn) 命令行下&#xff1a; python -m pip install --upgrade pip --user python -m pip install paddlepaddle2.6.1 -i https://pypi.tuna.tsinghua.edu.cn/simple 报异常 ERROR: Could not install packa…

力扣HOT100 - 24. 两两交换链表中的节点

解题思路&#xff1a; 递归 class Solution {public ListNode swapPairs(ListNode head) {if (head null || head.next null) {return head;}ListNode newHead head.next;head.next swapPairs(newHead.next);newHead.next head;return newHead;} }

nvm版本控制nvm list available报错

# 配置node镜像&#xff1a; node_mirror: https://npmmirror.com/mirrors/node/ # 配置npm镜像&#xff1a; npm_mirror: https://npmmirror.com/mirrors/npm/ 2024.4.22换域名了&#xff0c;改成这个才能用别的不行