草庐IT

vue 支付宝支付笔记总结

Dear Sun 2023-07-14 原文

Vue 支付宝支付

1、支付宝介绍

支付宝(中国)网络技术有限公司成立于2004年,是国内的第三方支付平台,致力于为企业和个人提供“简单、安全、快速、便捷”的支付解决方案。支付宝公司从2004年建立开始,始终以“信任”作为产品和服务的核心。旗下有“支付宝”与“支付宝钱包”两个独立品牌。自2014年第二季度开始成为当前全球最大的移动支付厂商。
支付宝与国内外180多家银行以及VISA、MasterCard国际组织等机构建立战略合作关系,成为金融机构在电子支付领域最为信任的合作伙伴。
2020年2月,尼泊尔央行向支付宝颁发牌照。7月,支付宝入选区块链战“疫”优秀方案名单。10月,支付宝上线 “晚点付”功能。2021年12月,支付宝与中国银联在全国范围实现收款码扫码互认。
支付宝借呗改成信用贷。 12月2日,支付宝发布公告表示,支付宝与中国银联在2020年开始基于条码互联互通业务展开密切沟通和探索,并陆续在北京、天津、广州、深圳、成都、重庆、西安等多个城市实现收款码扫码互认 。
2022年2月,支付宝公布“支持中国女足发展工作小结”:已累计向中国足协拨款2.5亿元。
2022年8月,支付宝(中国)网络技术有限公司法定代表人、董事长将由井贤栋变更为倪行军。

百度百科介绍:

百度百科-支付宝

2、主要功能

1、支持余额宝,理财收益随时查看;
2、支持各种场景关系,群聊群付更方便;
3、提供本地生活服务,买单打折尽享优惠;
4、为子女父母建立亲情账户;
5、随时随地查询淘宝账单、账户余额、物流信息;
6、免费异地跨行转账,信用卡还款、充值、缴水电煤气费;
7、还信用卡、付款、缴费、充话费、卡券信息智能提醒;
8、行走捐,支持接入iPhone健康数据,可与好友一起健康行走及互动,还可以参与公益。 [63]
9、蚂蚁森林,通过特定方式获得能量,能量可以养成一棵树,养成后即可在现实某个地域种下一棵实体的树 [65] 。

3、日记风波

2016年11月支付宝推出圈子功能,发帖与芝麻信用分捆绑,甚至只限女性,由于出现大量美女自拍,甚至大尺度照片,因此被网友调侃为“支付鸨”。
在支付宝首页搜索框查找圈子功能的入口。其中“白领日记”和“校园日记”的圈子都显示有超过300万人看过,而这两个圈子都是在两三天前创建。但这些打着白领和校园标签的圈子,只允许女性发动态,而这些动态内容含有很多露骨的图片和暗示性语言。根据圈子的规则,明确规定只有女性有发帖权限,男性用户只能点赞、打赏和评论,且芝麻信用低于750分的用户也不允许评论。
支付宝已将一周内引起巨大争议的两大“圈子”悄悄下线。原本出现在支付宝首页的“白领日记”和“校园日记”等邀请,点进去已没有内容。

4、官方网站

支付宝-官网网站

第二节 支付宝沙箱环境开发

1、支付宝沙箱介绍

点击进入 支付宝沙箱环境

# 支付宝沙箱环境
https://opendocs.alipay.com/common/02kkv7
12

2、支付宝扫码登录进入沙箱环境

# 支付宝扫码登录进入沙箱环境
https://openhome.alipay.com/platform/developerIndex.htm
12

3、支付宝沙箱环境介绍

1)、沙箱应用

2)、沙箱账号

3)、沙箱工具

安装后,如下图:

参考文章

以上参考于恩师blog [参码踪 (shenmazong.com)]

支付界面如下所示:

当点击立即支付时,触发支付事件:


.png)]

了解一下支付流程:

​ 调用支付接口→拿到form表单→调起支付页面→查询支付结果

支付详解:

1、支付接口的参数并不是固定的,而是由后端决定,在接口发送成功后,我们会的得到响应数据,该数据并非JSON格式,而是一个表单数据!

开始使用支付宝沙箱完成支付功能》》》》

(1) 、首先引入Alipay依赖

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.10.97.ALL</version>
</dependency>

(2) 、写自己的配置文件 AlipayConfig

支付宝网关一定要使用dev沙箱版 正式开发时去掉即可
// 支付宝网关
public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

import java.io.FileWriter;
import java.io.IOException;

/**
 * @Author Sun
 * @Version 1.0
 * @description: 不可描述
 * @date 
 */

/* *
 *类名:AlipayConfig
 *功能:基础配置类
 *详细:设置帐户有关信息及返回路径
 *修改日期:2017-04-05
 *说明:
 *以下代码只是为了方便商户测试而提供的样例代码,商户可以根据自己网站的需要,按照技术文档编写,并非一定要使用该代码。
 *该代码仅供学习和研究支付宝接口使用,只是提供一个参考。
 */

public class AlipayConfig {

//↓↓↓↓↓↓↓↓↓↓请在这里配置您的基本信息↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    // 应用ID,您的APPID,收款账号既是您的APPID对应支付宝账号
    public static String app_id = "支付宝账号";

    // 商户私钥,您的PKCS8格式RSA2私钥
    public static String merchant_private_key = "填写自己的商户私钥";

    // 支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
    public static String alipay_public_key = "支付宝公钥";

    // 服务器异步通知页面路径  需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
    public static String notify_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/notify_url.jsp";

    // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问
//    public static String return_url = "http://工程公网访问地址/alipay.trade.page.pay-JAVA-UTF-8/return_url.jsp";
    public static String return_url = "http://localhost:9013/order/getResult";

    // 签名方式
    public static String sign_type = "RSA2";

    // 字符编码格式
    public static String charset = "utf-8";

    // 支付宝网关
    public static String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";

    // 支付宝网关
    public static String log_path = "D:\\";


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑

    /**
     * 写日志,方便测试(看网站需求,也可以改成把记录存入数据库)
     * @param sWord 要写入日志里的文本内容
     */
    public static void logResult(String sWord) {
        FileWriter writer = null;
        try {
            writer = new FileWriter(log_path + "alipay_log_" + System.currentTimeMillis()+".txt");
            writer.write(sWord);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (writer != null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

配置信息完成后来看看接口怎么写的吧

Controller层

/**
     * 支付宝支付
     * @param payWeChatOrderVo
     * @return
     * @throws AlipayApiException
     */
    @PostMapping("alipay-pay")
    public ResultResponse pay(@RequestBody PayWeChatOrderVo payWeChatOrderVo) throws AlipayApiException {
        return tbOrderService.aliPay(payWeChatOrderVo);
    }

	/*
	PayWeChatOrderVo自己定义的订单信息根据自己项目变更即可(也可以使用官方给出的参数)
	@Data
        public class PayWeChatOrderVo implements Serializable {
            private Long outTradeNo;
            private String description;
            private Long amount;
            private String attach;
        }
	*/

Service Impl

   @Override
    public ResultResponse aliPay(PayWeChatOrderVo payWeChatOrderVo) throws AlipayApiException {
//获得初始化的AlipayClient
        AlipayClient alipayClient = new DefaultAlipayClient(AlipayConfig.gatewayUrl, AlipayConfig.app_id, AlipayConfig.merchant_private_key, "json", AlipayConfig.charset, AlipayConfig.alipay_public_key, AlipayConfig.sign_type);

        //设置请求参数
        AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
        alipayRequest.setReturnUrl(AlipayConfig.return_url);
        alipayRequest.setNotifyUrl(AlipayConfig.notify_url);

        //商户订单号,商户网站订单系统中唯一订单号,必填
        Long out_trade_no = payWeChatOrderVo.getOutTradeNo();
        //付款金额,必填
        Long total_amount = payWeChatOrderVo.getAmount();
        //订单名称,必填
        String subject = payWeChatOrderVo.getAttach();
        //商品描述,可空
        String body = payWeChatOrderVo.getDescription();

        alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
                + "\"total_amount\":\""+ total_amount +"\","
                + "\"subject\":\""+ subject +"\","
                + "\"body\":\""+ body +"\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");

        //若想给BizContent增加其他可选请求参数,以增加自定义超时时间参数timeout_express来举例说明
        //alipayRequest.setBizContent("{\"out_trade_no\":\""+ out_trade_no +"\","
        //		+ "\"total_amount\":\""+ total_amount +"\","
        //		+ "\"subject\":\""+ subject +"\","
        //		+ "\"body\":\""+ body +"\","
        //		+ "\"timeout_express\":\"10m\","
        //		+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        //请求参数可查阅【电脑网站支付的API文档-alipay.trade.page.pay-请求参数】章节

        //请求
        String result = alipayClient.pageExecute(alipayRequest).getBody();
        return ResultResponse.SUCCESS().data("result", result);
    }

最后返回结果:

 "result": "<form name=\"punchout_form\" method=\"post\" action=\"https://openapi.alipaydev.com/gateway.do?charset=utf-8&method=alipay.trade.page.pay&sign=YVU9IIZLSal7va53ep%2B46Z2ZFtEE%2BDGiA9abXrKKzJfSHMbXRxxyQNEzRQbrkzY3LsFIJvPkwucDWFH7kBzWSMLnAZptD%2BZymd4byKsNBrVPLba39yw9sO7YgxlJLc9G9v5hd3CPTW2zQYaJXE14rUFVZi%2F5tk7Q4NXvPVVXGcnj%2BfwTjHh0XVJZ4GFb8D7McuVDcVeHy4sXDMCKPZ7BYKbfmDnKCQhwUrF%2B2uMZClUc6xNdyB%2FKS%2FOCJ4pE4LB50aJfUFNKU%2FY2pboCmo9mOnl41LoSMizOGtIhydR6%2FrVPA%2Bnd93lwJ%2FjgxC3ySmnDZ49fHi9YBieAjMmMkdnhTw%3D%3D&return_url=http%3A%2F%2Flocalhost%3A9013%2Forder%2FgetResult&notify_url=http%3A%2F%2F%E5%B7%A5%E7%A8%8B%E5%85%AC%E7%BD%91%E8%AE%BF%E9%97%AE%E5%9C%B0%E5%9D%80%2Falipay.trade.page.pay-JAVA-UTF-8%2Fnotify_url.jsp&version=1.0&app_id=2021000122606111&sign_type=RSA2&timestamp=2022-12-25+16%3A00%3A57&alipay_sdk=alipay-sdk-java-dynamicVersionNo&format=json\">\n<input type=\"hidden\" name=\"biz_content\" value=\"{&quot;out_trade_no&quot;:&quot;852963741&quot;,&quot;total_amount&quot;:&quot;1&quot;,&quot;subject&quot;:&quot;1&quot;,&quot;body&quot;:&quot;1&quot;,&quot;product_code&quot;:&quot;FAST_INSTANT_TRADE_PAY&quot;}\">\n<input type=\"submit\" value=\"立即支付\" style=\"display:none\" >\n</form>\n<script>document.forms[0].submit();</script>"

2、接下来如何将得到的数据调起支付界面呢?我们需要在页面中有一个可以提供渲染的元素,该元素可以在网页的任何位置

<div ref="alipayWap" v-html="alipay" />

3、在接口响应成功后,将数据渲染到元素内,通过触发表单的提交事件,就可以调起支付接口了,是不是非常简单

// 调用支付接口

//支付宝
    alipayhandleBuy(index, row) {
      console.log(index, row);
      this.aliPaydialogTableVisible = true;
      let param = {};
      param.outTradeNo = row.orderNo;
      param.description = row.productName;
      param.amount = row.orderAmount;
      param.attach = row.productName;
      this.orderNoa = row.orderNo;
      apipay(param).then((res) => {
        // 渲染支付页面
        this.alipay = res.data.data.result;
        // 防抖避免重复支付
        this.$nextTick(() => {
          // 提交支付表单
          this.$refs.alipayWap.children[0].submit();
          setTimeout(() => {
            // this.toPayFlag = false;
          }, 500);
        });
      });
    },

4、最后就是回调函数了

在填写之前的配置信息时同步回调路径写上自己的函数(同步)

 /**
     * 得到支付结果   以下代码均来自于支付宝官网
     * @param request
     * @param response
     * @return
     * @throws AlipayApiException
     */
    @Override
    public void aliPayResult(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException {
        //获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map<String,String[]> requestParams = request.getParameterMap();
        for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            //乱码解决,这段代码在出现乱码时使用
            // valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
            params.put(name, valueStr);
        }

        boolean signVerified = AlipaySignature.rsaCheckV1(params, AlipayConfig.alipay_public_key, AlipayConfig.charset, AlipayConfig.sign_type); //调用SDK验证签名

        //——请在这里编写您的程序(以下代码仅作参考)——
        String out_trade_no="";
        if(signVerified) {
            //商户订单号
             out_trade_no = request.getParameter("out_trade_no");

            //支付宝交易号
            String trade_no = request.getParameter("trade_no");

            //付款金额
            String total_amount = request.getParameter("amount");

            System.out.println("trade_no:"+trade_no+"<br/>out_trade_no:"+out_trade_no+"<br/>total_amount:"+total_amount);
            log.info("成功转发到产品列表");
            //支付成功修改状态
            OrderNoInfoVo orderNoInfoVo = new OrderNoInfoVo();
            orderNoInfoVo.setOrderNo(out_trade_no);
            updateState(orderNoInfoVo);
            response.sendRedirect("http://localhost:8080/#/order?orderNo="+out_trade_no);
        }else {
            System.out.println("验签失败");
            log.error("失败转发到订单列表");
            //0000 失败订单编号
            String fail="0000";
            response.sendRedirect("http://localhost:8080/#/order?orderNo="+fail);
        }
    }

验证成功返还正常的订单编号,失败则返回-0000

这时候重定向到订单列表地址栏取得商品订单编号就可以校验订单是否成功

就绪函数
created() {
    this.LoadList();
    //取得地址信息
    let orderOnInfo=this.$route.query.orderNo
    console.log("orderOnInfo====",orderOnInfo)
    if(orderOnInfo != null && orderOnInfo!='000'){
      this.$message.success("支付成功")
      //清除地址栏
      let path = this.$route.path; //先获取路由路径
      this.$router.push(path); //再跳转路由路径,query参数没带过去,所以被清除了
    }
  }

单列表地址栏取得商品订单编号就可以校验订单是否成功

就绪函数
created() {
    this.LoadList();
    //取得地址信息
    let orderOnInfo=this.$route.query.orderNo
    console.log("orderOnInfo====",orderOnInfo)
    if(orderOnInfo != null && orderOnInfo!='000'){
      this.$message.success("支付成功")
      //清除地址栏
      let path = this.$route.path; //先获取路由路径
      this.$router.push(path); //再跳转路由路径,query参数没带过去,所以被清除了
    }
  }

参考链接:【https://blog.csdn.net/Goodboygo/article/details/120153900】

有关vue 支付宝支付笔记总结的更多相关文章

  1. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  2. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  3. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  4. ruby-on-rails - 与 ActiveMerchant 一起使用的最佳支付网关是什么? - 2

    我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http

  5. Unity Shader 学习笔记(5)Shader变体、Shader属性定义技巧、自定义材质面板 - 2

    写在之前Shader变体、Shader属性定义技巧、自定义材质面板,这三个知识点任何一个单拿出来都是一套知识体系,不能一概而论,本文章目的在于将学习和实际工作中遇见的问题进行总结,类似于网络笔记之用,方便后续回顾查看,如有以偏概全、不祥不尽之处,还望海涵。1、Shader变体先看一段代码......Properties{ [KeywordEnum(on,off)]USL_USE_COL("IsUseColorMixTex?",int)=0 [Toggle(IS_RED_ON)]_IsRed("IsRed?",int)=0}......//中间省略,后续会有完整代码 #pragmamulti_c

  6. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  7. Tcl脚本入门笔记详解(一) - 2

    TCL脚本语言简介•TCL(ToolCommandLanguage)是一种解释执行的脚本语言(ScriptingLanguage),它提供了通用的编程能力:支持变量、过程和控制结构;同时TCL还拥有一个功能强大的固有的核心命令集。TCL经常被用于快速原型开发,脚本编程,GUI和测试等方面。•实际上包含了两个部分:一个语言和一个库。首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一些互交程序如文本编辑器、调试器和shell。由于TCL的解释器是用C\C++语言的过程库实现的,因此在某种意义上我们又可以把TCL看作C库,这个库中有丰富的用于扩展TCL命令的C\C++过程和函数,所以,Tcl是

  8. Simulink方法总结和避坑指南(一)——Simulink入门与基本调试方法 - 2

    文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景  最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。  在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记

  9. 计算机网络笔记:TCP三次握手和四次挥手过程 - 2

    TCP是面向连接的协议,连接的建立和释放是每一次面向连接的通信中必不可少的过程。TCP连接的管理就是使连接的建立和释放都能正常地进行。三次握手TCP连接的建立—三次握手建立TCP连接①若主机A中运行了一个客户进程,当它需要主机B的服务时,就发起TCP连接请求,并在所发送的分段中用SYN=1表示连接请求,并产生一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x。主机B收到A的连接请求报文,就完成了第一次握手。客户端发送SYN=1表示连接请求客户端发送一个随机发送序号x,如果连接成功,A将以x作为其发送序号的初始值:seq=x②主机B如果同意建立连接,则向主机A发送确认报

  10. vue 实现内容超出两行显示展开更多功能,可依据需求自定义任意行数! - 2

    平时开发中我们经常会遇到这样的需求,在一个不限高度的盒子中会有很多内容,如果全部显示用户体验会非常不好,所以可以先折叠起来,当内容达到一定高度时,显示展开更多按钮,点击即可显示全部内容,先来看看效果图: 这样做用户体验瞬间得到提升,接下来看看具体细节。0">主要操作在内容这里{{item.username}},……展开更多样式大家可依据自己项目需求进行设计,这里就不贴了,主要说几个关键的。1、在data中定义三个属性isShowMore:false, //控制展开更多的显示与隐藏textHeight:null, //框中内容的高度status:false, //内容状态是否打开2.计算内容是否

随机推荐