新版支付宝开放平台 手机网页支付 整个流程

2023-11-04

新版支付宝开放平台  手机网页支付 整个流程

在支付宝签约如下产品

然后,使用支付宝最新的签名工具生成商户的私钥和公钥


值得注意的是,如果是.net c# 请选择PKCS1,我只采用1024密钥长度。

然后来到支付宝的账号管理中心:

在如图的开放平台密钥页所示处,将上述软件生成的商户公钥设置到应用公钥处,然后设置授权回调地址,设置完后,点开查看并保存支付宝公钥,用于加密及验签。

基它地方不要设置,不要动。

下载最新的.net 支付宝SDK,引入工程



然后,在自己工程中配置支付宝参数 :

发起支付:

IAopClient client = new DefaultAopClient(AlipayConfig.Alipay_Server, AlipayConfig.APPID, AlipayConfig.APP_PRIVATE_KEY, "json", "1.0", "RSA", AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, false);
AlipayTradeWapPayRequest request = new AlipayTradeWapPayRequest();
request.SetNotifyUrl(AlipayConfig.Asynchronous_Notice_Location_Alipay);
request.SetReturnUrl(AlipayConfig.Synchronous_Notice_Location_Alipay);
string desc = "商城充值";
string subject = "hahahaha";
string out_trade_no = payDetail.Id.ToString();
string total_amount = payDetail.Price.ToString("F2");
request.BizContent = "{" +
"    \"body\":\" " + desc + "\"," +
"    \"subject\":\"" + subject + "\"," +
"    \"out_trade_no\":\"" + out_trade_no + "\"," +
"    \"timeout_express\":\"90m\"," +
"    \"total_amount\":+"+ total_amount + "," +
"    \"product_code\":\"QUICK_WAP_WAY\"" +
"  }";
AlipayTradeWapPayResponse response = client.pageExecute(request);
string form = response.Body;
form = form.Replace("<script>document.forms['alipaysubmit'].submit();</script>", "");
form = form.Replace("<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST'>", 
    "<form id='alipaysubmit' name='alipaysubmit' action='https://openapi.alipay.com/gateway.do?charset=UTF-8' method='POST' style='display:none;'>");
ViewBag.Content = form;




然后在页面上调用表单提交:

function check() {
        var ua = window.navigator.userAgent.toLowerCase();
        if (ua.match(/MicroMessenger/i) == 'micromessenger') {
            alert('请点击右上角菜单,在浏览器中打开本页面完成支付。');
        } else {
      
                document.forms['alipaysubmit'].submit();
            
        }
    }

然后,异步通知页验签:

         public Dictionary<string, string> GetRequestPost(HttpRequestBase request)
        {
            int i = 0;
            Dictionary<string, string> sArray = new Dictionary<string, string>();
            System.Collections.Specialized.NameValueCollection coll;
            coll = request.Form;
            String[] requestItem = coll.AllKeys;
            for (i = 0; i < requestItem.Length; i++)
            {
                sArray.Add(requestItem[i], request.Form[requestItem[i]]);
            }
            return sArray;
        }
      
  try
            {
                bool flag = Aop.Api.Util.AlipaySignature.RSACheckV1(GetRequestPost(Request), AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA", false);
                if(flag)
                {
                    log4net.LogManager.GetLogger("root").Info("支付宝签名验证成功");
                    //1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号,
                    //2、判断total_amount是否确实为该订单的实际金额(即商户订单创建时的金额),
                    //3、校验通知中的seller_id(或者seller_email) 是否为out_trade_no这笔单据的对应的操作方(有的时候,一个商户可能有多个seller_id/seller_email),
                    //4、验证app_id是否为该商户本身。上述1、2、3、4有任何一个验证不通过,则表明本次通知是异常通知,务必忽略。
                    //在上述验证通过后商户必须根据支付宝不同类型的业务通知,正确的进行不同的业务处理,并且过滤重复的通知结果数据。
                    //在支付宝的业务通知中,只有交易通知状态为TRADE_SUCCESS或TRADE_FINISHED时,支付宝才会认定为买家付款成功。

                    //商户订单号
                    string out_trade_no = Request.Form["out_trade_no"] ;
                    log4net.LogManager.GetLogger("root").Info("商户订单号" + out_trade_no);

                    string app_id = Request.Form["app_id"];
                    log4net.LogManager.GetLogger("root").Info("app_id:" + app_id);
                    if (app_id != AlipayConfig.APPID)
                    {
                        log4net.LogManager.GetLogger("root").Info("app_id != AlipayConfig.APPID" );
                        return Content("fail");
                    }
                    string trade_no = Request.Form["trade_no"] ;
                    log4net.LogManager.GetLogger("root").Info("支付宝交易号" + trade_no);

                    //交易状态
                    string trade_status =  Request.Form["trade_status"] ;
                    log4net.LogManager.GetLogger("root").Info("交易状态" + trade_status);

                    string gmt_payment= Request.Form["gmt_payment"] ;
                    log4net.LogManager.GetLogger("root").Info("交易支付时间:" + gmt_payment);

                    string total_amount= Request.Form["total_amount"] ;
                    log4net.LogManager.GetLogger("root").Info("交易金额:" + total_amount);
                    decimal money=total_amount.ParseTo<decimal>(0);

                    if (Request.Form["trade_status"] == "TRADE_FINISHED" || Request.Form["trade_status"] == "TRADE_SUCCESS")
                    {
                        DealPay_Alipay(out_trade_no, trade_no, gmt_payment, money);
                        return Content("success");
                    }
                    else
                    {
                        return Content("fail");
                    }
                    //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——
                }
            }
            catch (CustomerException ex)
            {
                log4net.LogManager.GetLogger("root").Info("ex:" + ex.Message);
                return Content("fail");
            }
            catch (Exception ex)
            {
                log4net.LogManager.GetLogger("root").Info("ex:" + ex.Message + ex.InnerException.Message + ex.StackTrace);
                return Content("fail");
            }
            return Content("fail");


同步通知页:

  if (!String.IsNullOrEmpty(Request.Form["trade_no"]) || !String.IsNullOrEmpty(Request.QueryString["trade_no"]))
            {
                return View();
            }
            else
            {
                return RedirectToAction("AlipayFail");
            }



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

新版支付宝开放平台 手机网页支付 整个流程 的相关文章

  • 在 Vulkan 中,图形队列系列与当前队列系列分离是否有益?

    据我所知 队列系列可能支持呈现到屏幕但不支持图形 假设我有一个同时支持图形和呈现的队列系列 以及另一个仅支持呈现的队列系列 我应该为两个进程使用第一个队列系列 还是应该将第一个队列系列委托给图形 将后者委托给呈现 或者这两种方法之间没有明显
  • 使用链表进行堆排序

    我想知道是否有人曾经使用链表进行堆排序 如果他们可以提供代码 我已经能够使用数组进行堆排序 但尝试在链表中进行排序似乎不切实际 而且在你知道的地方很痛苦 我必须为我正在做的项目实现链接列表 任何帮助将不胜感激 我也用C 答案是 你不想在链表
  • C# SmtpClient编程中如何设置带有中文的附件文件名?

    我的代码如下 ContentType ct new ContentType ct MediaType MediaTypeNames Application Octet ct Name 这是一个很长的中文文件名希望能用它在附件名中 Doc A
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • 捕获 .aspx 和 .ascx 页面中的异常

    问题说明了一切 请看以下示例代码 ul li li ul
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • 在 C 语言中,为什么数组的地址等于它的值?

    在下面的代码中 指针值和指针地址与预期不同 但数组值和地址则不然 怎么会这样 Output my array 0022FF00 my array 0022FF00 pointer to array 0022FF00 pointer to a
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • OpenGL:如何检查用户是否支持glGenBuffers()?

    我检查了文档 它说 OpenGL 版本必须至少为 1 5 才能制作glGenBuffers 工作 用户使用的是1 5版本但是函数调用会导致崩溃 这是文档中的错误 还是用户的驱动程序问题 我正在用这个glGenBuffers 对于VBO 我如
  • 如何从 Boost.PropertyTree 复制子树

    我有一些boost property tree ptree 我需要树来删除一些具有特定标签名称的元素 例如 xml 表示源ptree如下
  • SQLAPI++ 的免费替代品? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何免费 也许是开源 的替代品SQLAPI http www sqlapi com 这个库看起来
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h
  • 在哪里可以找到 Microsoft.Build.Utilities.v3.5

    如何获取 Microsoft Build Utilities v3 5 我正在使用 StyleCop 4 7 Stylecop dll 中的 StyleCop msbuild 任务似乎依赖于 Microsoft Build Utilitie
  • 如何在C#中控制datagridview光标移动

    我希望 datagridview 光标向右移动到下一列 而不是在向单元格输入数据后移动到下一行 我试图通过 dataGridView1 KeyDown 事件捕获键来控制光标 但这并不能阻止光标在将数据输入到单元格后移动到下一行 提前感谢你的
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 任何人都可以清楚地告诉如何在不使用像 这样的预定义函数的情况下找到带有小数值或小数值的指数吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 例如 2 0 5 1 414 所以想要 我是 c 的新手 所以请解释简单的逻辑 如果不是复杂的逻辑也足够了 在数学中 从整数取幂到实数

随机推荐

  • 登录界面

  • 华为OD机试真题- 字符串解密【2023Q1】【JAVA、Python、C++】

    题目描述 给定两个字符串string1和string2 string1是一个被加扰的字符串 string1由小写英文字母 a z 和数字字符 0 9 组成 而加扰字符串由 0 9 a f 组成 string1里面可能包含0个或多个加扰子串
  • 如何使用策略模式处理多种类型请求

    1 需求简述 现在有一个活动 活动场景包含布置书籍作业 布置短文作业 布置一课一练作业 以后还可能会新增其它类型的活动 每一种活动场景有自己对应的完成逻辑和奖励 现在定义对应的场景值如下 活动名称 活动场景值 布置书籍作业 11 布置短文作
  • PaxosLease:实现租约的无盘Paxos算法

    PaxosLease 实现租约的无盘Paxos算法 英文 PaxosLease Diskless Paxos for Leases 中文 http dsdoc net paxoslease index html
  • JavaScript 解决计算误差

    JavaScript 解决计算误差 在 JavaScript 中执行计算时 精度误差是一个常见的问题 这是因为 JavaScript 使用二进制表示浮点数 因此不能精确表示所有十进制数 这会导致在 JavaScript 中执行精确的计算时出
  • springboot切换使用log4j

    修改pom xml
  • 计算两个时间之间的进度百分比

    获取两个时间之间的日期
  • Mask-RCNN应用 - 批量生成训练所需文件并训练自己的数据集(技巧与防坑)

    MaskRCNN入门路径 gt Mask RCNN应用研究方法 持续更新中 如有问题或需要指导 请私聊留下联系方式用手机打开https m tb cn h fINaraE tk PCzA2jPp4V0进行咨询 本文介绍标注数据和训练过程并提
  • XMPP客户端库Smack 4.1.4版官方开发文档之三

    本文转载自 博客主页 http blog csdn net chszs 三 XMPPConnection管理 1 创建连接 org jivesoftware smack XMPPConnection类可管理到XMPP服务器的连接 它默认的连
  • 主流Java静态bug分析工具

    1 CheckStyle 2 FindBugs 3 PMD 4 idea中相关代码检查的插件及其使用方式 1 CheckStyle CheckStyle 是SourceForge的开源项目 通过检查 对代码的编码格式 命名约定 JavaDo
  • 【第62篇】ConvNeXt V2论文翻译:ConvNeXt V2与MAE碰撞

    文章目录 摘要 1 简介 2 相关工作 3 全卷积掩码自编码器 4 全局响应归一化 5 ImageNet实验 6 迁移学习实验 7 结论 摘要 论文链接 ConvNeXt V2 在改进的架构和更好的表示学习框架的推动下 视觉识别领域在21世
  • emi滤波matlab,【原创】EMI 滤波器设计从入门到精通(三)

    原标题 原创 EMI 滤波器设计从入门到精通 三 07 一些重要的基本概念 1 电磁场 电场和磁场总是联系在一起的 电场和磁场的混合就是电磁场 英文也专门创建了这么一个单词 Electromagnetic Field 电磁场 以下图为例 图
  • 基于RISC-V架构的45条指令单周期CPU设计——第1章

    完整目录 完整代码和论文 指令选取 前言 本次设计选取 RV32I 和 RV32M 大部分可实现的指令 其中囊括 R 型 I 型 U 型 S 型 B 型 J 型指令 R 型指令 R 型指令格式 I 型指令 I 型指令格式 U 型指令 U 型
  • qt平台插件问题(Ubuntu 16.04)

    问题描述 在运行python的可视化库的时候 报错提示 Qt平台插件异常 可以尝试重新安装qt库 度娘之后发现解决方法是将PyQt加入环境变量 但是尝试之后是没有效果的 所以卡了很久 最后分析了一下 应该是Ubuntu基于Python的GU
  • 微信小程序开发搜索功能(前端+后端+数据库)

    2019年5月7日更新 这是写的最新的一篇文章 大家看这篇 https blog csdn net weixin 39927850 article details 87990384 界面比较丑 主要实现逻辑 超级简单的界面 表单 提交按钮
  • 刷脸支付现已引领了新一轮科技开展浪潮

    人脸验证前 平台需要采集目标对象的人像数据 经过算法提取图画中的人脸特征值 树立个人独特的生物数据库 假定您的特征值存储在数据库中 在您的付出过程中 系统将您的人脸信息放入数据库进行云比较 从而到达辨认和付出的目的 刷脸支付有多重好处 将会
  • mysql中groupby用法_详解SQL中GroupBy的用法

    GROUP BY 语句用于结合合计函数 根据一个或多个列对结果集进行分组 1 概述 Group By 从字面意义上理解就是根据 By 指定的规则对数据进行分组 所谓的分组就是将一个 数据集 划分成若干个 小区域 然后针对若干个 小区域 进行
  • Unity 简单的虚拟摇杆

    需求 点击创建一个虚拟摇杆底盘 鼠标拖拽时候上方摇杆会跟随鼠标方向移动 并且不会超出摇杆盘范围 摇杆功能另外实现 UI显示 using System Collections using System Collections Generic
  • C语言---malloc函数详解

    引言 为什么使用动态内存分配 当你声明数组时 你必须用一个编译时常量指定数组的长度 但是 数组的长度常常在运行时才知道 这是由于它所需要的内存空间取决于输入数据 例如 一个用于计算学生等级和平均分的程序可能需要存储一个班级所有学生的数据 但
  • 新版支付宝开放平台 手机网页支付 整个流程

    新版支付宝开放平台 手机网页支付 整个流程 在支付宝签约如下产品 然后 使用支付宝最新的签名工具生成商户的私钥和公钥 值得注意的是 如果是 net c 请选择PKCS1 我只采用1024密钥长度 然后来到支付宝的账号管理中心 在如图的开放平