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

文章目录

  • 一 技术准备
    • 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: httpsgatewayHost: openapi-sandbox.dl.alipaydev.comsignType: RSA2appId: #沙箱应用的APPIDmerchantPrivateKey: #应用私钥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;// 签名类型 RSA2private String signType;// 应用IDprivate 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 {@Beanpublic 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.mzph.cn/news/604351.shtml

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

相关文章

揭秘六大热门认证考试

六大热门认证考试是什么❓今天为大家详细解读PMP、ACP、CDGA、软考中项、软考高项、NPDP、CISP等热门认证考试&#xff0c;让你不再彷徨&#x1f447; 1️⃣PMP &#x1f451;PMP认证是全qiu公ren的项目管理专业认证&#xff0c;旨在评估项目管理人员在项目过程中所需的知识、技…

05 Ciso模拟器连接腾讯云物联网开发平台

Ciso声明&#xff1a;本篇文章基于使用腾讯云物联网平台连接自定义esp8266物联网设备(腾讯连连控制开关实现) - CSDN App改编 一、总体概览 功能描述&#xff1a; 使用腾讯连连小程序进行控制&#xff0c; Alarm&#xff08;警铃&#xff09;&#xff1a;开的时候&#xff…

【软考中级-软件设计师】day3:程序设计语言基础知识

概述 练习题 程序设计语言的基本成分 练习题 编译程序基本原理 名词解释 词法分析 词法分析&#xff08;英语&#xff1a;lexical analysis&#xff09;是计算机科学中将字符序列转换为单词&#xff08;Token&#xff09;序列的过程。进行词法分析的程序或者函数叫作…

鸿蒙开发基础运用(ArkTS)-健康生活APP

健康生活应用&#xff0c;主要功能包括&#xff1a; 用户可以创建最多6个健康生活任务&#xff08;早起&#xff0c;喝水&#xff0c;吃苹果&#xff0c;每日微笑&#xff0c;刷牙&#xff0c;早睡&#xff09;&#xff0c;并设置任务目标、是否开启提醒、提醒时间、每周任务频…

迟到的总结:回望 2023 年,期盼 2024 新机会、新挑战

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、RocketMQ&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏…

航空公司管理系统(迷你版12306)

要求 今天分享一个之前辅导留学生的作业&#xff0c;作业要求如下&#xff1a; Project E: Airways Management System Overall description: Your team is employed by an Airways company for the implementation of a computer system responsible for a large part of th…

Python从入门到网络爬虫(异常处理详解)

前言 异常即是一个事件&#xff0c;该事件会在程序执行过程中发生&#xff0c;影响了程序的正常执行。一般情况下&#xff0c;在python无法正常处理程序时就会发生一个异常。异常是python对象&#xff0c;表示一个错误。当python脚本发生异常时我们需要捕获处理它&#xff0c;…

Python 全栈体系【四阶】(十一)

第四章 机器学习 机器学习&#xff1a; 传统的机器学习&#xff1a;以算法为核心深度学习&#xff1a;以数据和计算为核心 感知机 perceptron&#xff08;人工神经元&#xff09; 可以做简单的分类任务掀起了第一波 AI 浪潮 感知机不能解决线性不可分问题&#xff0c;浪潮…

Git提交代码发生冲突的场景与解决方案

问题 当我们在使用 Git 向远程仓库提交代码时&#xff0c;可能会遇到如下所述的错误提示&#xff1a; To https://github.com/xxxxx/gitmerge.git! [rejected] master -> master (fetch first) error: failed to push some refs to https://github.com/xxxxx/gitme…

Vue2:脚手架Vue-CLI的使用

一、环境准备 vue脚手架&#xff08;vue-CLI&#xff09;的使用是基于nodejs环境下的。 你可以简单理解为&#xff0c;Java项目需要再jvm虚拟机上才能编译运行 nodejs的作用就是将vue文件编译成html、css、js代码文件。 如何安装nodejs 参考&#xff1a;https://blog.csdn.net…

ARMv8-AArch64 的异常处理模型详解之异常等级、执行状态以及安全状态

ARMv8-AArch64 的异常处理模型详解 一&#xff0c;特权和异常等级1.1 异常等级 Exception levels 二&#xff0c;特权的类型2.1 内存特权2.2 访问寄存器的特权 三&#xff0c;执行状态和安全状态3.1 执行状态 Execution states3.2 执行状态切换 3.3 安全状态 Security states3.…

第16课 播放rtsp流

在现实生活中有许多rtsp摄像头&#xff0c;这些摄像头如果能充分利用起来可以生成很多有趣、有用的应用&#xff1a;比如户外互动大屏等。在第4课&#xff0c;我们实现了一个播放器&#xff0c;当时来用它播放rtmp流和mp4时它好象工作的很好。这节课我们就用它来播放rtsp流试试…

二进制介绍

十进制转相应进制 (十进制)231 转 八进制 除八取余法 从下而上取余 231/828 ....7 28/83.......4 3/80........3 (十进制)231(八进制)0o347 (十进制)231 转 16进制 除十六取余法 从下而上取余 231/1614......7 14/160..........14 (十进制) 231(十六进制)0xe7 (十进制)231.3 转…

C++动态内存分配(动态内存分配函数)栈区

内存拷贝函数&#xff1a; void *memcpy(void *dest,const void *src,size_tn);#include<string.h>功能&#xff1a;从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest内存地址的起始位置 分配内存使用new 例如&#xff1a;salarynew int[num]; 最后需要释放…

Linux文件操作命令(touch、cat、more、cp、mv、rm)

之前我们学习了对目录&#xff08;即文件夹的操作&#xff0c;那么现在我们来一起看一下怎么操作文件吧&#xff09; 1.touch命令 功能&#xff1a;创建文件 语法&#xff1a;touch 参数 参数&#xff1a;被创建的文件路径 注意&#xff1a;touch命令无选项&#xff0c;参…

【Docker-Dev】Mac M2 搭建docker的redis环境

Redis的dev环境docker搭建 1、前言2、官方文档重点信息提取2.1、创建redis实例2.2、使用自己的redis.conf文件。 3、单机版redis搭建4、redis集群版4.1、一些验证4.2、一些问题 结语 1、前言 本文主要针对M2下&#xff0c;相应进行开发环境搭建&#xff0c;然后做一个文档记录…

面试算法88:爬楼梯的最少成本

题目 一个数组cost的所有数字都是正数&#xff0c;它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本&#xff0c;在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。假设台阶至少有2级&#xff0c;既可以从第0级台阶出发&#xff0c;也可以从第1级台阶出发&#xff…

window使用cpolar实现内网穿透

文章目录 cpolar下载和安装启动和配置cpolar卸载 cpolar下载和安装 进入spolar官网&#xff0c;完成注册&#xff0c;下载相应的cploar版本解压和运行安装文件 配置安装路径&#xff0c;然后选择next&#xff0c;完成即可 启动和配置 点击首页的快捷图标打开网页&#xf…

Defi安全-Monox攻击事件Foundry复现

其它相关内容可见个人主页 Mono攻击事件的介绍见&#xff1a;Defi安全–Monox攻击事件分析–phalconetherscan 1. 前情提要和思路介绍 Monox使用单边池模型&#xff0c;创建的是代币-vCash交易对&#xff0c;添加流动性时&#xff0c;只需添加代币&#xff0c;即可进行任意代…

Jmeter相关概念

Jmeter相关概念 jmeter性能指标 Aggregate Report 是 JMeter 常用的一个 Listener&#xff0c;中文被翻译为“聚合报告”。今天再次有同行问到这个报告中的各项数据表示什么意思&#xff0c;顺便在这里公布一下&#xff0c;以备大家查阅。 如果大家都是做Web应用的性能测试&a…