个人商城系统开源(配置支付宝支付2)

原文地址:个人商城系统开源(配置支付宝支付2) - Pleasure的博客

下面是正文内容:

前言

在上一篇文章中我曾提到过关于网站支付宝支付的方法,接下来我们来介绍第二种。

个人博客地址:个人商城系统开源(配置支付宝支付!) - Pleasure的博客

CSDN地址:个人商城系统开源(配置支付宝支付!)-CSDN博客

正文

前情提要

在上一篇文章中我曾提到过一些注意事项。如果你不想通过正规申请开通电脑网站支付,而且你也没有相应的审核材料,那还是借助上一篇提到的第四方支付平台来进行操作吧。

而且操作涉及到财产,审核要求较高,所以如果不是真有需要大致看看就可以了。

我的开源商城系统是由PHP语言编写的(不是JAVA),语言不同的也可以跳过了。

需要准备的材料:两个支付宝账号,一张(个体工商户的)营业执照,完成网站ICP备案。

项目地址

其实这是一个前人栽树,后人乘凉的项目。在很早之前就存在了。

因为支付功能这个操作在php建站中是可以通过两三个文件独立出来实现的,只需要在回调函数中确认了支付成功这个操作就结束了,和商城系统内置文件并没有直接的关联。

在GitHub上的项目地址:

GitHub - dedemao/alipay: 一个PHP文件搞定支付宝支付系列,包括电脑网站支付,手机网站支付,现金红包、消费红包、扫码支付,JSAPI支付、单笔转账到支付宝账户、交易结算(分账、分润)、网页授权获取用户信息等

说明

我这里就只拿电脑网站支付来做示范。

而且光有营业执照还不行,如果没有网站经营授权函,支付界面截图等证明材料,就会有交易限额还只有30天时间用来补全材料。但毕竟只是用于示范,所以相关材料就先不准备了。

一级审核是由机器人完成的,只要营业执照号码和ICP备案查得到基本上就可以通过。

营业执照的审核基本上一天就可以完成,但是查询企业信息平台的同步就需要大概一天的时间,所以需要耐心等待。(申请一个网店经营的营业执照就可以了,具体操作就不示范了)

支付宝收款方和付款方不能是同一个账号。

每一个php文件都对应支付宝中应用需要开通的产品。

如果不开通在访问这个界面的时候就会报错!

获得应用私钥

首先在支付宝开放平台申请应用,

支付宝开放平台:登录 - 支付宝

产品大全地址:登录 - 支付宝

针对前面申请的应用记录下对应的appid

下载支付宝开放平台密钥工具!

选择RSA2加密方式

生成密钥,一个应用公钥,一个应用私钥,记录下生成的应用私钥,后面需要用到

然后在支付宝开放平台中选择开发设置,接口加签方式,上传刚刚生成的应用公钥,记录下返回的支付宝公钥

参考文档

小程序文档 - 支付宝文档中心

小程序文档 - 支付宝文档中心

最后在支付宝商家平台开通并绑定产品。

上传后等待一分钟基本上就短信提示通过了,下面就可以直接来进行代码操作了。

修改项目代码

以电脑网站支付为例

将下载好并解压的文件夹放在网站根目录下

比如说我就放在https://shop2.yiming1234.cn/alipay-master/pc.php 这个位置

打开相应文件,有几个参数需要修改为自己支付相关的信息,分别是:

$appid,$returnUrl,$notifyUrl,$rsaPrivateKey,$alipayPublicKey。就位于头部配置信息处,也就是下面的代码内容

相应参数修改完成后直接访问就可以到支付页面!

pc.php的内容:

<?php
header('Content-type:text/html; Charset=utf-8');
/*** 请填写以下配置信息 ***/
$appid = '';			//https://open.alipay.com 账户中心->密钥管理->开放平台密钥,填写添加了电脑网站支付的应用的APPID
$returnUrl = 'return.php';     //付款成功后的同步回调地址
$notifyUrl = 'notify.php';     //付款成功后的异步回调地址
$outTradeNo = uniqid();     //你自己的商品订单号,不能重复
$payAmount = 0.01;          //付款金额,单位:元
$orderName = '支付测试';    //订单标题
$signType = 'RSA2';			//签名算法类型,支持RSA2和RSA,推荐使用RSA2
$rsaPrivateKey='';		//商户私钥,填写对应签名算法类型的私钥,如何生成密钥参考:https://docs.open.alipay.com/291/105971和https://docs.open.alipay.com/200/105310
/*** 配置结束 ***/
$aliPay = new AlipayService();
$aliPay->setAppid($appid);
$aliPay->setReturnUrl($returnUrl);
$aliPay->setNotifyUrl($notifyUrl);
$aliPay->setRsaPrivateKey($rsaPrivateKey);
$aliPay->setTotalFee($payAmount);
$aliPay->setOutTradeNo($outTradeNo);
$aliPay->setOrderName($orderName);
$sHtml = $aliPay->doPay();
echo $sHtml;class AlipayService
{protected $appId;protected $returnUrl;protected $notifyUrl;protected $charset;//私钥值protected $rsaPrivateKey;protected $totalFee;protected $outTradeNo;protected $orderName;public function __construct(){$this->charset = 'utf8';}public function setAppid($appid){$this->appId = $appid;}public function setReturnUrl($returnUrl){$this->returnUrl = $returnUrl;}public function setNotifyUrl($notifyUrl){$this->notifyUrl = $notifyUrl;}public function setRsaPrivateKey($saPrivateKey){$this->rsaPrivateKey = $saPrivateKey;}public function setTotalFee($payAmount){$this->totalFee = $payAmount;}public function setOutTradeNo($outTradeNo){$this->outTradeNo = $outTradeNo;}public function setOrderName($orderName){$this->orderName = $orderName;}/*** 发起订单* @return array*/public function doPay(){//请求参数$requestConfigs = array('out_trade_no'=>$this->outTradeNo,'product_code'=>'FAST_INSTANT_TRADE_PAY','total_amount'=>$this->totalFee, //单位 元'subject'=>$this->orderName,  //订单标题);$commonConfigs = array(//公共参数'app_id' => $this->appId,'method' => 'alipay.trade.page.pay',             //接口名称'format' => 'JSON','return_url' => $this->returnUrl,'charset'=>$this->charset,'sign_type'=>'RSA2','timestamp'=>date('Y-m-d H:i:s'),'version'=>'1.0','notify_url' => $this->notifyUrl,'biz_content'=>json_encode($requestConfigs),);$commonConfigs["sign"] = $this->generateSign($commonConfigs, $commonConfigs['sign_type']);return $this->buildRequestForm($commonConfigs);}/*** 建立请求,以表单HTML形式构造(默认)* @param $para_temp 请求参数数组* @return 提交表单HTML文本*/protected function buildRequestForm($para_temp) {$sHtml = "正在跳转至支付页面...<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=".$this->charset."' method='POST'>";foreach($para_temp as $key=>$val){if (false === $this->checkEmpty($val)) {$val = str_replace("'","&apos;",$val);$sHtml.= "<input type='hidden' name='".$key."' value='".$val."'/>";}	}//submit按钮控件请不要含有name属性$sHtml = $sHtml."<input type='submit' value='ok' style='display:none;''></form>";$sHtml = $sHtml."<script>document.forms['alipaysubmit'].submit();</script>";return $sHtml;}public function generateSign($params, $signType = "RSA") {return $this->sign($this->getSignContent($params), $signType);}protected function sign($data, $signType = "RSA") {$priKey=$this->rsaPrivateKey;$res = "-----BEGIN RSA PRIVATE KEY-----\n" .wordwrap($priKey, 64, "\n", true) ."\n-----END RSA PRIVATE KEY-----";($res) or die('您使用的私钥格式错误,请检查RSA私钥配置');if ("RSA2" == $signType) {openssl_sign($data, $sign, $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256); //OPENSSL_ALGO_SHA256是php5.4.8以上版本才支持} else {openssl_sign($data, $sign, $res);}$sign = base64_encode($sign);return $sign;}/*** 校验$value是否非空*  if not set ,return true;*    if is null , return true;**/protected function checkEmpty($value) {if (!isset($value))return true;if ($value === null)return true;if (trim($value) === "")return true;return false;}public function getSignContent($params) {ksort($params);$stringToBeSigned = "";$i = 0;foreach ($params as $k => $v) {if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {// 转换成目标字符集$v = $this->characet($v, $this->charset);if ($i == 0) {$stringToBeSigned .= "$k" . "=" . "$v";} else {$stringToBeSigned .= "&" . "$k" . "=" . "$v";}$i++;}}unset ($k, $v);return $stringToBeSigned;}/*** 转换字符集编码* @param $data* @param $targetCharset* @return string*/function characet($data, $targetCharset) {if (!empty($data)) {$fileType = $this->charset;if (strcasecmp($fileType, $targetCharset) != 0) {$data = mb_convert_encoding($data, $targetCharset, $fileType);//$data = iconv($fileType, $targetCharset.'//IGNORE', $data);}}return $data;}
}

return.php的内容(同步回调通知)

<?php
header('Content-type:text/html; Charset=utf-8');
//支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥
$alipayPublicKey='';$aliPay = new AlipayService($alipayPublicKey);
//验证签名
$result = $aliPay->rsaCheck($_GET,$_GET['sign_type']);
if($result===true){//同步回调一般不处理业务逻辑,显示一个付款成功的页面,或者跳转到用户的财务记录页面即可。echo '<h1>付款成功</h1>';exit();
}
echo '不合法的请求';exit();
class AlipayService
{//支付宝公钥protected $alipayPublicKey;protected $charset;public function __construct($alipayPublicKey){$this->charset = 'utf8';$this->alipayPublicKey=$alipayPublicKey;}/***  验证签名**/public function rsaCheck($params) {$sign = $params['sign'];$signType = $params['sign_type'];unset($params['sign_type']);unset($params['sign']);return $this->verify($this->getSignContent($params), $sign, $signType);}function verify($data, $sign, $signType = 'RSA') {$pubKey= $this->alipayPublicKey;$res = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($pubKey, 64, "\n", true) ."\n-----END PUBLIC KEY-----";($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');//调用openssl内置方法验签,返回bool值if ("RSA2" == $signType) {$result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);} else {$result = (bool)openssl_verify($data, base64_decode($sign), $res);}
//        if(!$this->checkEmpty($this->alipayPublicKey)) {
//            //释放资源
//            openssl_free_key($res);
//        }return $result;}/*** 校验$value是否非空*  if not set ,return true;*    if is null , return true;**/protected function checkEmpty($value) {if (!isset($value))return true;if ($value === null)return true;if (trim($value) === "")return true;return false;}public function getSignContent($params) {ksort($params);$stringToBeSigned = "";$i = 0;foreach ($params as $k => $v) {if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {// 转换成目标字符集$v = $this->characet($v, $this->charset);if ($i == 0) {$stringToBeSigned .= "$k" . "=" . "$v";} else {$stringToBeSigned .= "&" . "$k" . "=" . "$v";}$i++;}}unset ($k, $v);return $stringToBeSigned;}/*** 转换字符集编码* @param $data* @param $targetCharset* @return string*/function characet($data, $targetCharset) {if (!empty($data)) {$fileType = $this->charset;if (strcasecmp($fileType, $targetCharset) != 0) {$data = mb_convert_encoding($data, $targetCharset, $fileType);//$data = iconv($fileType, $targetCharset.'//IGNORE', $data);}}return $data;}
}

notify.php的内容(异步回调通知)

<?php
header('Content-type:text/html; Charset=utf-8');
//支付宝公钥,账户中心->密钥管理->开放平台密钥,找到添加了支付功能的应用,根据你的加密类型,查看支付宝公钥
$alipayPublicKey='';$aliPay = new AlipayService($alipayPublicKey);
//验证签名
$result = $aliPay->rsaCheck($_POST,$_POST['sign_type']);
if($result===true && $_POST['trade_status'] == 'TRADE_SUCCESS'){//处理你的逻辑,例如获取订单号$_POST['out_trade_no'],订单金额$_POST['total_amount']等//程序执行完后必须打印输出“success”(不包含引号)。如果商户反馈给支付宝的字符不是success这7个字符,支付宝服务器会不断重发通知,直到超过24小时22分钟。一般情况下,25小时以内完成8次通知(通知的间隔频率一般是:4m,10m,10m,1h,2h,6h,15h);echo 'success';exit();
}
echo 'error';exit();
class AlipayService
{//支付宝公钥protected $alipayPublicKey;protected $charset;public function __construct($alipayPublicKey){$this->charset = 'utf8';$this->alipayPublicKey=$alipayPublicKey;}/***  验证签名**/public function rsaCheck($params) {$sign = $params['sign'];$signType = $params['sign_type'];unset($params['sign_type']);unset($params['sign']);return $this->verify($this->getSignContent($params), $sign, $signType);}function verify($data, $sign, $signType = 'RSA') {$pubKey= $this->alipayPublicKey;$res = "-----BEGIN PUBLIC KEY-----\n" .wordwrap($pubKey, 64, "\n", true) ."\n-----END PUBLIC KEY-----";($res) or die('支付宝RSA公钥错误。请检查公钥文件格式是否正确');//调用openssl内置方法验签,返回bool值if ("RSA2" == $signType) {$result = (bool)openssl_verify($data, base64_decode($sign), $res, version_compare(PHP_VERSION,'5.4.0', '<') ? SHA256 : OPENSSL_ALGO_SHA256);} else {$result = (bool)openssl_verify($data, base64_decode($sign), $res);}
//        if(!$this->checkEmpty($this->alipayPublicKey)) {
//            //释放资源
//            openssl_free_key($res);
//        }return $result;}/*** 校验$value是否非空*  if not set ,return true;*    if is null , return true;**/protected function checkEmpty($value) {if (!isset($value))return true;if ($value === null)return true;if (trim($value) === "")return true;return false;}public function getSignContent($params) {ksort($params);$stringToBeSigned = "";$i = 0;foreach ($params as $k => $v) {if (false === $this->checkEmpty($v) && "@" != substr($v, 0, 1)) {// 转换成目标字符集$v = $this->characet($v, $this->charset);if ($i == 0) {$stringToBeSigned .= "$k" . "=" . "$v";} else {$stringToBeSigned .= "&" . "$k" . "=" . "$v";}$i++;}}unset ($k, $v);return $stringToBeSigned;}/*** 转换字符集编码* @param $data* @param $targetCharset* @return string*/function characet($data, $targetCharset) {if (!empty($data)) {$fileType = $this->charset;if (strcasecmp($fileType, $targetCharset) != 0) {$data = mb_convert_encoding($data, $targetCharset, $fileType);//$data = iconv($fileType, $targetCharset.'//IGNORE', $data);}}return $data;}
}

效果展示

尾声

至此,开源商城系统支付板块的编辑就告一段落了。

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

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

相关文章

GPT模型支持下的Python-GEE遥感云大数据分析、管理与可视化技术及多领域案例应用

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+GTX 8b/10b编解码SFP光口传输,提供2套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI…

C++:类和对象(上篇)

目录&#xff1a; 一&#xff1a;面向对象和过程的介绍 二&#xff1a;类的引入 三&#xff1a;类的定义 四&#xff1a;类的访问限定符以及封装 五&#xff1a;类的作用域 六&#xff1a;类的实例化 七&#xff1a;类对象大小的计算 八&#xff1a;类成员函数的this指…

【Linux】编译器-gcc/g++的使用(预处理、编译、汇编、连接)

目录 01.预处理&#xff08;宏替换&#xff09; 02.编译&#xff08;生成汇编&#xff09; 03.汇编&#xff08;生成机器可识别码&#xff09; 04.连接&#xff08;生成可执行文件或库文件&#xff09; 05.选项 编译器在编译代码时包含以下四个步骤&#xff1a;1.预处理 2…

MongoDB启动报错

spring boot 引入MongoDB启动报错 java.lang.IllegalStateException: Failed to introspect Class [io.micrometer.core.instrument.binder.mongodb.DefaultMongoConnectionPoolTagsProvider] from ClassLoader [sun.misc.Launcher$AppClassLoader18b4aac2] at org.springfra…

爬虫综合案例-获取房源信息并在地图上显示

文章目录 1.项目介绍2.项目分析3.爬取房源信息4. 导入高德地图5.地图上显示房源信息6.运行程序 1.项目介绍 本次案例将从 58 同城信息网爬取相关城市的房源出租信息&#xff0c;然后通过高德地图把房源信息地图显示&#xff0c;通过地图进行浏览&#xff0c;点击相应的热点文字…

[运维] 可视化爬虫易采集-EasySpider(笔记)

一、下载 ​下载地址 下滑到Assets页面&#xff0c;选择下载 二、解压运 ​解压压缩包&#xff0c;打开文件夹 在此文件夹下打开Linux Terimal, 并输入以下命令运行软件&#xff1a; ./easy-spider.sh 注意软件运行过程中不要关闭terminal。 三、使用 1.开始 首先点击…

使用 CSS 实现毛玻璃效果

在现代 Web 设计中,毛玻璃效果越来越受欢迎。它能够让界面元素看起来更加柔和、朦胧,同时又不会完全遮挡背景内容,给人一种透明而又不失质感的视觉体验。虽然过去实现这种效果需要借助图像编辑软件,但现在只需要几行 CSS 代码,就可以在网页上呈现出令人惊艳的毛玻璃效果。 使用…

IDEA 配置阿里规范检测

IDEA中安装插件 配置代码风格检查规范 使用代码风格检测 在代码类中&#xff0c;右键 然后会给出一些不符合规范的修改建议&#xff1a; 保存代码时自动格式化代码 安装插件&#xff1a; 配置插件&#xff1a;

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比

CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比 —— 杭州 2024-03-19 夜 code review! 文章目录 CMake笔记之PROJECT_SOURCE_DIR、CMAKE_SOURCE_DIR、CMAKE_CURRENT_BINARY_DIR对比1.三者区别2.具体示例说明3.CMAKE_SOURCE_DIR 和 PROJECT_S…

Sora没体验资格?开源项目:Open-Sora,复现类Sora视频生成方案

项目简介 Open-Sora项目是一项高效制作高质量视频的工作&#xff0c;明确所有权使用其模型、工具和内容的计划。通过采用开源原则&#xff0c;Open-Sora 不仅实现了先进的视频生成技术的普及&#xff0c;还提供了一个专业且用户界面的方案&#xff0c;简化了视频制作的复杂性。…

php 对接Pangle海外广告平台收益接口Reporting API

今天对接的是Pangle广告reporting api接口&#xff0c;拉取广告收益回来自己做统计。记录分享给大家 首先是文档地址,进入到Pangle后台就能看到文档地址以及参数&#xff1a; 文档地址&#xff1a;https://www.pangleglobal.com/zh/integration/reporting-api-v2 在这里插入图片…

算法---二分查找练习-2(寻找旋转排序数组中的最小值)

寻找旋转排序数组中的最小值 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;点这里 2. 讲解算法原理 首先&#xff0c;检查数组的最后一个元素是否大于第一个元素。如果是&#xff0c;说明数组没有进行旋转&#xff0c;直接返回第一个元素作为最小值…

稀碎从零算法笔记Day22-LeetCode:

题型&#xff1a;链表 链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;Leet 题目描述 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 …

vue项目:使用xlsx导出Excel数据

文章目录 一、安装xlsx二、报错及解决三、编写公共方法四、方法使用 一、安装xlsx 执行命令&#xff1a;npm i xlsx file-saver --save 二、报错及解决 使用时&#xff1a;import XLSX from "xlsx"; 发现如下报错信息 报错原因&#xff1a;xlsx版本不兼容。 解…

Java项目基于SpringBoot和Vue的时装购物系统的设计与实现

今天要和大家聊的是一款基于SpringBoot和Vue的时装购物系统。 &#x1f495;&#x1f495;作者&#xff1a;李同学 &#x1f495;&#x1f495;个人简介&#xff1a;混迹在java圈十年有余&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可…

web前端之不一样的下拉菜单、不选中第一个元素的样式效果、伪类排除第一个元素、符号选择器、hover、not、first、child

MENU 效果图htmlcssJShtmlcss 效果图 htmlcssJS html <nav><ul><li class"navli"><h4>HTML5</h4><ul class"ulson"><li class"lison">HTML5</li></ul></li><li class"na…

Django单表数据库操作

单表操作 测试脚本 当你只想测试django某一个py文件的内容,可以不用书写前后端的交互,直接写一个测试脚本即可 单表删除 数据库操作方法: 1.all():查询所有的数据 2.filter():带有过滤条件的查询 3.get():直接拿数据对象,不存在则报错 4.first():拿queryset里面的第一个元素…

天童知识课堂|“春分”

春色正中分&#xff0c;人间恰良辰。春分&#xff0c;也称升分&#xff0c;是二十四节气之一。春分的到来&#xff0c;意味着春天已经过去一半了&#xff0c;气候也逐渐温暖&#xff0c;阳光更加明媚。而关于春分的知识&#xff0c;你知道多少呢&#xff1f;来和天童美语一起了…