PHP实现支付宝支付

article/2025/10/4 19:34:56

支付宝付款,开发上比起微信支付要简单很多,今天就以支付宝手机网站支付为例,简单讲一下实现方法:
在这里插入图片描述
前期准备,当然就不多说了,当你想开发使用支付宝支付,必然需要在支付宝开放品台注册认证并且创建好应用并且具备手机网站支付功能!不明白可以查看支付宝官方文档(https://docs.open.alipay.com/203/107084/)
一.开发准备
开发之前,需要准备以下信息
1.支付宝应用appid
2.明确接口加密方式(RSA或者RSA2)
3.支付宝公钥
4.应用私钥

二.支付实现
话不多说,直接上代码

/*** 将要参与签名的参数按要求拼接* @param $data* author 江南极客* @return string*/
function signQueryString($data){// 去空$data = array_filter($data);//签名步骤一:按字典序排序参数ksort($data);$string_a = http_build_query($data);$string_a = urldecode($string_a);return $string_a;
}/*** 支付宝RSA签名加密* @param $data  要参与加密的参数* @param $private_key  应用私钥* author 江南极客* @return array|string*/
function RSASign($data,$private_key){//要签名的参数字符串$query_string = signQueryString($data);//应用私钥$private_key = chunk_split($private_key, 64, "\n");$private_key = "-----BEGIN RSA PRIVATE KEY-----\n$private_key-----END RSA PRIVATE KEY-----\n";$private_key_id = openssl_pkey_get_private($private_key);if ($private_key_id === false){return array(-1,'提供的私钥格式不对');}$rsa_sign = false;if($data['sign_type'] == 'RSA'){$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA1);}else if($data['sign_type'] == 'RSA2'){$rsa_sign = openssl_sign($query_string, $sign, $private_key_id,OPENSSL_ALGO_SHA256);}//释放资源openssl_free_key($private_key_id);if ($rsa_sign === false){return array(-1,'签名失败');}$signature = base64_encode($sign);return $signature;
}/*** 支付宝支付* @param array $params  构造好的支付参数* author 于先生吖* @return array|string*/
function aliPay(array $params){$public = ['app_id' => $params['app_id'],'method' => $params['method'],'sign_type' => $params['sign_type'],'format' => 'JSON','charset' => 'utf-8','version' => '1.0','timestamp' => date('Y-m-d H:i:s'),'biz_content' => $params['biz_content'],];if(!empty($params['notify_url'])){$public['notify_url'] = $params['notify_url'];}if(!empty($params['return_url'])){$public['return_url'] = $params['return_url'];}$sign = RSASign($public,$params['private_key']);if(is_array($sign)){return $sign;}$public['sign'] = $sign;$url = 'https://mapi.alipay.com/gateway.do?'. http_build_query($public,'', '&');return $url;
}

注:这里的支付网关,如果是新接口是(https://openapi.alipay.com/gateway.do)
调用实例:

$biz_content = ['body' => '测试商品x1','subject' => '测试商品','out_trade_no' => date('YmdHis').rand(1000,9999),'product_code' => 'QUICK_WAP_WAY','total_amount' => 0.01,
];
$notify_url = "https://xxxxxxxx/notify.php";					//通知回调地址(必须是可以无障碍访问没有登录验证的地址)
$params = ['app_id'  => '2017xxxxxxxxx6554',							//appid'method'  => 'alipay.trade.wap.pay',						//接口名称'sign_type'  => 'RSA2',										//签名加密方式'notify_url'  => $notify_url,'biz_content'  => json_encode($biz_content),				//请求参数
];
$params['private_key'] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";	//应用私钥
$data = aliPay($params);
print_r($data);

三.回调验签
对于手机网站支付产生的交易,支付宝会根据原始支付API中传入的异步通知地址notify_url,通过POST请求的形式将支付结果作为参数通知到商户系统。支付宝异步回调通知POST过来的数据如下
在这里插入图片描述
在拿到这个数据之后,为了安全防止数据被篡改,需要签证签名,方法如下:

/*** 支付宝验证签名* @param $return_data  支付宝服务器推送给notify_url的数据* @param $public_key 支付宝公钥* author 于先生吖* @return bool|int*/
function RSAVerify($return_data, $public_key){if(empty($return_data) || !is_array($return_data)){return false;}//支付宝公钥$public_key = wordwrap($public_key, 64, "\n", true);$public_key = "-----BEGIN PUBLIC KEY-----\n$public_key\n-----END PUBLIC KEY-----\n";$public_key_id = openssl_pkey_get_public($public_key);if($public_key_id === false){return false;}//除去sign、sign_type两个参数外,凡是通知返回回来的参数皆是待验签的参数。$sign = $return_data['sign'];$sign_type = trim($return_data['sign_type'],'"');unset($return_data['sign'], $return_data['sign_type']);$query_string = signQueryString($return_data);$sign = base64_decode($sign);$rsa_verify = 0;if($sign_type == 'RSA'){$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA1);}else if($sign_type == 'RSA2'){$rsa_verify = openssl_verify($query_string, $sign, $public_key_id,OPENSSL_ALGO_SHA256);}openssl_free_key($public_key_id);if($rsa_verify == 0 || $rsa_verify == -1){//Returns 1 if the signature is correct, 0 if it is incorrect, and -1 on error.return false;}return $rsa_verify;
}

其余支付宝其他支付方式(扫码支付,PC支付,APP支付等),实现方式大同小异,修改几个参数就OK了!


http://chatgpt.dhexx.cn/article/5h9eyCDc.shtml

相关文章

外包网站建设需要注意什么

外包网站建设需要注意什么 对于如今许多的公司来说,拥有一个属于公司的网站是非常必要的。但是并不是所有的公司都会拥有专业的人员来进行网站的建设,所以网站建设外包则成为了诸多公司的首选。但是外包网站建设都需要哪些问题呢? 外包网站…

苏州外包php,【苏州IT外包经验】Ubuntu 17.10系统下配置PHP+Apache+Mysql

发布于 2017年11月16日 星期四 01:15 点击数:20883 本文为Ubuntu 17.10系统下配置PHP7.1Apache2.4Mysql5.7 一、Apache2 安装apache sudo apt-get apache2 编辑apache主配置文件/etc/apache2/apache2.conf,修改KeepAlive设置 KeepAlive Off Apache默认的…

Linux任务之自动发邮件

Linux任务之自动发邮件 文章目录 Linux任务之自动发邮件1、虚拟机Centos7环境(1)先设置自己的邮箱,我这用qq邮箱:(2)获取到密码后,我们要在Linux上配置邮件文件:(3&#…

Mac 定时自动发送邮件

文章目录 WhyHow1. 在automator中创建application2. 创建calender 自动定时发送email3. 自行测试 Refer Why 工作中,有时需要发送固定格式的email,每次人工做,比较繁琐,本篇博客描述了一种可以自动定时发送email的方式。 下面例…

如何利用 Python 自动发邮件,打工人福音

在工作中,每天或者每周结束的时候我们都会发送相应的日报或者周报给上级领导,来汇报你做了那些工作,可是汇报工作内容的时候我们始终都是打开邮箱、写入内容,发送和抄送给固定的人,那么这么繁琐并且重复的一件事&#…

用Excel和OutLook实现自动批量发邮件

转自:https://zhuanlan.zhihu.com/p/25283201 作者:闲者秋山 闲者秋山 闲者秋山 相信不少人的工作中都有这样的情况,需要群发通知邮件的情况。 (比如财务付完款,要通知供应商,房东之类的) 但如…

JAVA实现自动发送邮件

JAVA实现发送邮件 做项目时用到的小工具 做个备份&#xff08; tips: 需要导入javax.mail 我使用了maven导入X <!-- JavaMail相关依赖 --><dependency><groupId>javax.mail</groupId><artifactId>javax.mail-api</artifactId><ver…

自动发送

自动发送 主要用于普通邮箱&#xff08;个人邮箱/企业邮箱&#xff09;群发&#xff0c;用户使用“群发单显”或“精准分发”生成邮件在“待发邮件”邮件夹中&#xff0c;开启自动发送&#xff0c;可按照设定的时间和速度进行邮件的自动发送。 最新功能&#xff08;版本&#x…

python---自动群发邮件

生活中我们经常发送邮件&#xff0c;那么我们能不能用Python写一个自动发送邮件的功能呢&#xff1f;答案是肯定的&#xff01;&#xff01;&#xff01; 开始实现功能之前我们需要开启我们邮箱的 IMAP/SMTP功能&#xff0c;我们先了解一下什么是IMAP/SMTP。 SMTP 的全称是“…

Python之邮箱自动发件

在使用python给好友发送邮件时&#xff0c;首先需要下载python中在对模块&#xff0c;以及打开邮箱IMAP/SMTP服务。接下来一步一步介绍读者如何来使用并实现发件。 1.下载python中在对模块 首先键盘点击winR键&#xff0c;输入pip search smtplib便可以看到smtplib模块下含有…

使用Python自动发送邮件

发送普通邮件 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;是简单传输协议。 python中对SMTP进行了简单的封装&#xff0c;可以发送纯文本邮件、HTML 邮件以及带附件的邮件。两个核心模块如下&#xff1a; email模块&#xff1a;负责构建邮件 smtplib模块&am…

通过SMTP协议自动发送邮件

通过SMTP协议实现训练结束自动发送邮件 为了更安心地摸鱼&#xff0c;想让大模型训练完之后自己发邮件给我。 开启SMTP服务与取得授权码 1.打开设置->账户->打开服务 然后会获得授权码 代码示例 #!/usr/bin/python\# -*- coding: utf-8 -*-import smtplib from e…

Java实现邮件自动发送

有时候我们会遇到自动发送邮件通知、邮件验证码、节假日祝福邮件发送、邮件自动发送广告功能&#xff0c;今天我们就谈谈邮件自动发送是怎么实现的。案例使用Java语言来编写&#xff0c;使用springBoot来搭建项目。 步骤一&#xff1a;添加邮件依赖&#xff1a;spring-boot-st…

sql自动发邮件功能

用SQL自动发邮件需要三步 1&#xff0c;做一个配置文件 2&#xff0c;调用存储过程msdb.dbo.sp_send_dbmail 3, 创建作业 1&#xff0c; 右键->【配置数据库邮件】 配置好了之后可以测试能否发送邮件 进去邮箱查看是否收到邮件或者数据库查询 select * from msdb.dbo.sys…

自动定时发送邮件的方法 —— 定时执行专家V6.8

目录 ▉ 定时发送简单邮件 ◆前提条件 ◆实现思路 ◆设置方法 ▉ 定时执行专家简介 ◆最新版下载链接 ◆2023-03-21 V6.8 - 更新日志 ▉ 定时发送简单邮件 ◆前提条件 - 电脑安装邮件客户端&#xff0c;使用这个邮件客户端&#xff0c;发送简单邮件。 ◆实现思路 组…

自动化发送邮件

自动化发送邮件 自动化发送邮件 背景SMTP了解一下邮件系统实现过程 1.连接建立2.邮件传输3.连接释放4.注意项目 信息格式MIME新增关键字multipart自动发邮件 构建过程 封装代码必要的设置 背景 室友选修的《机器学习》&#xff0c;结课作业是对8万的数据进行分析。他向我抱怨…

利用Python自动发送邮件

自动发送邮件 我们把报表做出来以后一般都是需要发给别人查看&#xff0c;对于一些每天需要发的报表或者是需要一次发送多份的报表&#xff0c;这个时候可以考虑借助Python来自动发送邮件。 使用邮箱的第一步 一般我们在使用QQ邮箱、163邮箱、126邮箱等这些比较常用的邮箱时…

Java实现发送邮件(定时自动发送邮件)

系列文章目录 Redis缓存穿透、击穿、雪崩问题及解决方法Spring Cache的使用–快速上手篇分页查询–Java项目实战篇全局异常处理–Java实战项目篇 该系列文章持续更新&#xff0c;更多的文章请点击我的主页查看哦&#xff01; 文章目录 目录 系列文章目录 文章目录 前言 一…

使用Excel和OutLook实现自动发送邮件

参考我的资源: https://download.csdn.net/download/paul50060049/11805973 问题的产生 我们在平时工作中可能会遇到要批量发送邮件的工作&#xff0c;例如财务部根据每个人的工资情况发放工资条到个人的邮箱&#xff0c;因为邮件因人而异&#xff0c;所以需要完成大量而细致…

Python实现自动发送邮件

最近比较闲的慌&#xff0c;在自己学习Python爬虫&#xff0c;学到了用Python发送邮件&#xff0c;觉得这个可能以后比较实用。以下项目用QQ邮箱为例。 需要用到的模块&#xff1a; smtplib&#xff0c;email 提醒&#xff01;QQ 邮箱一般默认关闭SMTP服务&#xff0c;我们得…