支付宝扫码(Easy版)支付实现

news2024/11/14 5:51:02

文章目录

  • 一 技术准备
    • 1.1 二维码技术(java)
    • 1.2 支付宝沙箱环境准备
    • 1.3 内网穿透
  • 二 支付宝支付相关知识
    • 2.1 各种支付方式
    • 2.2 扫码付接入流程
    • 2.3 系统交互流程(时序图)
    • 2.4 加密逻辑
  • 三 扫码支付实现
    • 3.1 添加maven依赖(Easy版)
    • 3.2 完善配置文件和配属属性类
    • 3.3 扫码支付controller实现
    • 3.4 运行结果

一 技术准备

1.1 二维码技术(java)

  • 二维码 (dimensional barcode) ,又称二维条码,是在一维条码的基础上扩展出的一种具有可读性的条码。

  • 设备扫描二维条码,通过识别条码的长度和宽度中所记载的二进制数据,可获取其中所包含的信息

  • 总之:二维码是信息的载体

  • 纠错级别: L、M、Q、H 由低到高。

    • 低级别的像素块更大,可以远距离识别,但是遮挡就会造成无法识别。
    • 高级别则相反,像素块小,允许遮挡一定范围,但是像素块更密集。
    QrConfig config = new QrConfig();
    config.setErrorCorrection(ErrorCorrectionLevel.H);
    

  • Hutool是一个Java工具包类库,对文件、流、加密解密、转码、正则、线程、XML等JDK方法进行封装,组成各种Util工具类。
  • 实现步骤:
  1. 导入maven依赖
    <dependency>
                <groupId>com.google.zxing</groupId>
                <artifactId>core</artifactId>
                <version>3.3.3</version>
            </dependency>
            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>5.7.5</version>
            </dependency>
    
  2. 生成二维码
public static void main(String[] args) {
        QrConfig config = new QrConfig();
        config.setErrorCorrection(ErrorCorrectionLevel.H);
        config.setBackColor(Color.WHITE); // 设置背景颜色
        config.setForeColor(Color.blue); // 设置前景色
        config.setWidth(500);
        config.setHeight(500);
        QrCodeUtil.generate("yuanyou.blog.csdn.net",config,new File("path\\res.jpg"));
    }

在这里插入图片描述

1.2 支付宝沙箱环境准备

  • 沙箱环境:沙箱环境是协助开发者进行接口开发及主要功能联调的模拟环境
  1. 通过支付宝账号登录 支付宝开放平台
  2. 在控制台找到沙箱管理,手机、平板下载沙箱APP(沙箱环境目前只支持Android环境安装)
    在这里插入图片描述
  3. 使用沙箱账号进行的登录(有时候会出现错误,请多次尝试),账号和密码在沙箱账号页面有提供
    在这里插入图片描述

1.3 内网穿透

  • 参看window使用cpolar实现内网穿透
    在这里插入图片描述
  • 在支付包的通知回调地址会使用该公网IP(支付宝无法访问私网IP)

二 支付宝支付相关知识

  • 支付宝开放平台

2.1 各种支付方式

在这里插入图片描述

  1. 扫一扫支付:用户可以通过支付宝app的“扫一扫”功能,扫描商家的二维码进行支付,或者向商家展示自己的付款码供商家扫描。

  2. 付款码支付:用户打开支付宝app,展示付款码,由商家扫描用户的付款码完成交易。

  3. 条形码支付:用户展示支付宝app内的条形码,由商家扫描进行支付。

  4. 蓝牙支付:借助蓝牙技术,用户可以在支持蓝牙支付的设备附近完成支付。

  5. 在线支付(网页或APP内):在线购物时,选择支付宝作为支付方式,在跳转到支付宝支付页面后登录账户并确认支付。

  6. 面部识别支付:在具备面部识别功能的设备上,用户可以通过扫描面部信息来完成支付,称为“刷脸支付”。

  7. NFC支付:利用近场通讯(NFC)技术,用户只需将手机靠近支持NFC功能的POS机即可完成支付。

2.2 扫码付接入流程

在这里插入图片描述

2.3 系统交互流程(时序图)

在这里插入图片描述

2.4 加密逻辑

非对称加密:

  • 公钥:加密、验签
  • 私钥:解密、签名
  1. 支付宝公钥加密、应用私钥签名
  2. 支付宝私钥解密、应用公钥验签
  • 支付宝请求加密解密过程
    在这里插入图片描述
  • 支付宝响应加密解密过程
  1. 应用公钥加密,支付宝私钥签名
  2. 支付宝公钥验签,应用私钥解密

在这里插入图片描述

三 扫码支付实现

3.1 添加maven依赖(Easy版)

  • 两个版本SDK:easy版和通用版
  • Easy版maven地址
    <!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-easysdk -->
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-easysdk</artifactId>
        <version>2.2.3</version>
    </dependency>
    
  • 通用版maven地址
    <dependency>
        <groupId>com.alipay.sdk</groupId>
        <artifactId>alipay-sdk-java</artifactId>
        <version>4.38.183.ALL</version>
    </dependency>
    

3.2 完善配置文件和配属属性类


需要的信息和获取方式:

  • 沙箱应用APPID
    在这里插入图片描述
  • 应用私钥,应用公钥
    在这里插入图片描述
    在这里插入图片描述
  • 通知回调地址,使用coplar生成的https地址+/notify接口

  1. 在application.yml中添加配置
alipay:
  easy:
    protocol: https
    gatewayHost: openapi-sandbox.dl.alipaydev.com
    signType: RSA2
    appId: #沙箱应用的APPID
    merchantPrivateKey: #应用私钥
    alipayPublicKey: # 支付宝公钥
    notifyUrl: https://xxx.r6.cpolar.top/notify 
  1. 创建文件
    • AliPayProperties.java
    import lombok.Data;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @Data
    @ConfigurationProperties(prefix = "alipay.easy")
    public class AliPayProperties {
        //请求协议
        private String protocol;
        // 请求网关
        private String gatewayHost;
        // 签名类型 RSA2
        private String signType;
        // 应用ID
        private String appId;
        // 应用私钥
        private String merchantPrivateKey;
        // 支付宝公钥
        private String alipayPublicKey;
        // 异步通知接收服务地址
        private String notifyUrl;
        // 设置AES密钥
        private String encryptKey;
    }
    
    • AlipayConfig.java
    import com.alipay.easysdk.kernel.Config;
    import com.itheima.alipay.prop.AliPayProperties;
    import lombok.Data;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    @Data
    public class AlipayConfig {
        @Bean
        public Config config(AliPayProperties payProperties) {
            Config config = new Config();
            config.protocol = payProperties.getProtocol();
            config.gatewayHost = payProperties.getGatewayHost();
            config.signType = payProperties.getSignType();
            config.appId = payProperties.getAppId();
            config.merchantPrivateKey = payProperties.getMerchantPrivateKey();
            config.alipayPublicKey = payProperties.getAlipayPublicKey();
            //可设置异步通知接收服务地址(可选)
            config.notifyUrl = payProperties.getNotifyUrl();
            config.encryptKey = "";
            return config;
        }
    }
    

3.3 扫码支付controller实现

import cn.hutool.extra.qrcode.QrCodeUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.easysdk.factory.Factory;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.payment.common.models.AlipayTradeQueryResponse;
import com.alipay.easysdk.payment.facetoface.models.AlipayTradePrecreateResponse;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.File;

@RestController
@Slf4j
@AllArgsConstructor
public class EasyPayController {

    private final Config alipayConfig;


    @GetMapping("/pay")
    public String pay() throws Exception {
        Factory.setOptions(alipayConfig);
        //调用支付宝接口
        AlipayTradePrecreateResponse response = Factory.Payment.FaceToFace().preCreate("rtx 4090 24G", "1656235762657645", "20000");
        //解析结果
        String httpBody = response.getHttpBody();
        //转JSON对象
        JSONObject jsonObject = JSONObject.parseObject(httpBody);
        String qrUrl = jsonObject.getJSONObject("alipay_trade_precreate_response").get("qr_code").toString();
        //生成二维码
        QrCodeUtil.generate(qrUrl,300,300,new File("C:\\res.jpg"));
        return httpBody;
    }

    @PostMapping("/notify")
    public String notify(HttpServletRequest request){
        log.info("收到支付成功通知");
        String out_trade_no = request.getParameter("out_trade_no");
        log.info("流水号:{}",out_trade_no);
        //TODO 后续业务流程
        return "success";
    }

    @GetMapping("/query")
    public String query() throws Exception {
        Factory.setOptions(alipayConfig);
        AlipayTradeQueryResponse response = Factory.Payment.Common().query("1656235762657645");
        return response.getHttpBody();
    }
}

3.4 运行结果

2024-01-07 21:30:49.127  INFO 6628 --- [nio-8080-exec-3] c.i.alipay.controller.EasyPayController  : 收到支付成功通知
2024-01-07 21:30:49.128  INFO 6628 --- [nio-8080-exec-3] c.i.alipay.controller.EasyPayController  : 流水号:1656235762657645
  • 访问localhost:8080/query即可查询到付款成功的结果
{
  "alipay_trade_query_response": {
    "code": "10000",
    "msg": "Success",
    "buyer_logon_id": "hro***@sandbox.com",
    "buyer_pay_amount": "20000.00",
    "buyer_user_id": "2088722025453088",
    "buyer_user_type": "PRIVATE",
    "fund_bill_list": [
      {
        "amount": "20000.00",
        "fund_channel": "ALIPAYACCOUNT"
      }
    ],
    //...
}    
  • 沙箱环境的支付宝中可以查询到支付记录
    在这里插入图片描述

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

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

相关文章

SSM农产品朔源管理系统----计算机毕业设计

项目介绍 本项目分为前后台&#xff0c;分为普通用户、管理员、企业用户三种角色&#xff1b; 普通用户无需登录&#xff0c;可在前台直接进行溯源查询&#xff0c;管理员、企业用户可登录后台进行管理&#xff1b; 超级管理员角色包含以下功能&#xff1a; 登录,管理企业,设…

Nacos与Eureka

一、前言 在构建和管理微服务架构时&#xff0c;选择适当的服务注册中心至关重要。Nacos和Eureka都是微服务体系结构中常用的服务注册和发现工具。本文将探讨它们之间的区别&#xff0c;帮助开发者在选择适合其项目需求的注册中心时做出明智的决策。 二、架构和适用场景 Nacos …

重生奇迹MU游戏中勇者大陆

玩重生奇迹MU&#xff0c;我们进入游戏首先会来到勇者大陆。在看到勇者大陆市场&#xff0c;有很多交易的玩家也在这里&#xff0c;在勇者市场里面有商店。接下来介绍主要的NPC 的作用和怪物有那些&#xff1f; 勇者大陆卖药的商店老板莉雅 商店里面会有卖治疗药水&#xff0…

API集群负载统计 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上,近期对客户端访问日志进行了采集,需要统计各个API的访问频次,根据热点信息在服务器节点之间做负载均衡,现在需要实现热点信息统计查询功能。 RESTf…

Python 操作 JMeter 探索:pymeter 实操指南

概要 JMeter 是一个流行的性能测试工具&#xff0c;用于测试 Web 应用程序的性能和负载。它通常与 GUI 一起使用&#xff0c;但如果您想在自动化测试中集成 JMeter&#xff0c;或者以编程方式创建和运行测试计划&#xff0c;那么 pymeter 库将是一个强大的工具。本文将介绍如何…

Camtasia2024苹果Mac电脑版(屏幕录制剪辑软件)

Camtasia Mac2024免费版是一款由TechSmith公司官方进行汉化推出的最新版本&#xff0c;借助Camtasia&#xff0c;您可以轻松记录屏幕并创建优美&#xff0c;专业的视频。记录所有内容-您的整个屏幕或只是一个窗口。或者&#xff0c;添加您已经拥有的视频&#xff0c;图像&#…

Spring Boot应用启动时自动执行代码的五种方式

Spring Boot为开发者提供了多种方式在应用启动时执行自定义代码&#xff0c;这些方式包括注解、接口实现和事件监听器。在本篇博客中&#xff0c;我们将探讨一些常见的方法&#xff0c;以及如何利用它们在应用启动时执行初始化逻辑。 1. PostConstruct注解 PostConstruct注解…

下载的 MongoDB bin目录下没有mongo.exe文件问题解决

MongoDB 4.4版本之前&#xff0c;我们可以在MongoDB的安装目录的bin文件夹中找到mongo.exe这个命令行工具。但是从MongoDB 4.4版本开始&#xff0c;MongoDB官方已经不再提供独立的mongo.exe可执行文件&#xff0c;而是将其整合到了mongosh这个新的交互式Shell中。 我们可以访问…

轻松识别几个小时的长音视频文件

前言 之前的文章绍一个准确率非常高的语音识别框架&#xff0c;但那个只能识别实时的短音频&#xff0c;如果想要识别一个非常长的音频&#xff0c;几十分钟&#xff0c;甚至几个小时&#xff0c;那之前的那个是做不到的所以就有了本文。本文介绍搭建一个长语音识别服务&#…

我的512天创作者纪念日,记录数字的不平凡

文章目录 512天创作者纪念日&#xff1a;2023年的12月31日CSDN的512天消息提醒第一篇文章&#xff0c;最后一篇文章总计847篇文章&#xff0c;每月发文分布512天&#xff0c;各专栏文章统计512天&#xff0c;互动总成绩 512天创作者纪念日&#xff1a;2023年的12月31日 2023年…

数据结构期中模拟

一、填空题 1.二叉树就是度为 2 的树。&#xff08;F&#xff09; 二叉树的度<2 2.线性表采用链式存储表示时&#xff0c;所有结点之间的存储单元地址可以连续也可以不连续。(T) 在顺序表中&#xff0c;逻辑上相邻的元素&#xff0c;其物理位置一定相邻。在单链表中&#x…

java数据结构与算法刷题-----LeetCode62. 不同路径

java数据结构与算法刷题目录&#xff08;剑指Offer、LeetCode、ACM&#xff09;-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难&#xff0c;但它就是固定套路而已。其实动态规划只…

算法第十三天-解码方法

解码方法 题目要求 解题思路 来自【宫水三叶】 基本分析 我们称一个解码内容为一个item。 根据题意&#xff0c;每个item可以由一个数字组成&#xff0c;也可以由两个数字组成。 数据范围为100&#xff0c;很具有迷惑性&#xff0c;可能会有不少同学会想使用DFS进行暴力搜索…

性能优化-OpenMP基础教程(二)

本文主要介绍OpenMP并行编程技术&#xff0c;编程模型、指令和函数的介绍、以及OpenMP实战的几个例子。希望给OpenMP并行编程者提供指导。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&am…

实现多级缓存(Redis+Caffeine)

文章目录 多级缓存的概述多级缓存的优势 多级缓存的概述 在高性能的服务架构设计中&#xff0c;缓存是一个不可或缺的环节。在实际的项目中&#xff0c;我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中&#xff0c;只有当缓存的访问没有命中时再查询数据库。在…

详解Java中的原子操作

第1章&#xff1a;什么是原子操作 大家好&#xff0c;我是小黑&#xff0c;面试中一个经常被提起的话题就是“原子操作”。那么&#xff0c;到底什么是原子操作呢&#xff1f;在编程里&#xff0c;当咱们谈论“原子操作”时&#xff0c;其实是指那些在执行过程中不会被线程调度…

thinkphp学习03-url访问模式

多应用&#xff1a;http://serverName/index.php/应用/控制器/操作/参数/值…&#xff1b;单应用&#xff1a;http://serverName/index.php/控制器/操作/参数/值…&#xff1b; http://localhost:8506/index.php Contoller下新建Test.php <?php namespace app\controlle…

电脑丢失dll文件怎么办,dll修复工具可一键修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中最常见的就是“找不到指定的模块”或“无法找到某某.dll文件”。这种情况通常是由于dll文件丢失或损坏导致的。那么&#xff0c;究竟是什么原因导致了dll文件的丢失呢&#xff1f;又该如何预防dll文件…

labelme的安装

首先尝试在(openmmlab)的python3.8的环境下安装&#xff08;失败&#xff09;。应该是我环境其他部分不对&#xff0c;和python版本应该没什么关系。&#xff08;后续&#xff0c;创建新的环境后成功&#xff0c;可直接看最后一部分。&#xff09; 首先安装是没问题的 pip in…