百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

java短信验证平台_JAVA实现利用第三方平台发送短信验证码

ztj100 2025-03-24 22:45 21 浏览 0 评论

一、前期准备工作

支付宝支付分为正式环境和沙箱环境,我这里使用的是正式环境。

沙箱环境和正式环境差距不是很大,唯一的差距就是正式环境需要营业执照。沙箱环境就可以很好避免这个问题。

创建应用

绑定应用

配置秘钥

上线应用

签约功能

官方API文档地址:
https://opendocs.alipay.com/open/270/01didh?ref=api

二、导入依赖

com.alipay.sdk

alipay-sdk-java

4.23.0.ALL

1

2

3

4

5

6

三、书写配置类

/**

* description:支付宝支付配置类

* author:maozl

* date:2022/8/1

*/

@Configuration

@PropertySource("
classpath:alipay.properties") //读取配置文件

@ConfigurationProperties(prefix="alipay") //读取wxpay节点

@Data //使用set方法将alipay节点中的值填充到当前类的属性中

@Slf4j

public class AliPayClientConfig {

/**

* APPID

*/

private String appId;

/**

* 商户PID

*/

private String sellerId;

/**

* 支付宝网关

*/

private String gatewayUrl;

/**

* 商户私钥

*/

private String merchantPrivateKey;

/**

* 支付宝公钥

*/

private String aliPayPublicKey;

/**

* 接口加密秘钥

*/

private String contentKey;

/**

* 页面跳转同步通知页面路径

*/

private String returnUrl;

/**

* 回调地址

*/

private String notifyUrl;

@Bean

public AlipayClient alipayClient() throws AlipayApiException {

AlipayConfig alipayConfig=new AlipayConfig();

//设置appId

alipayConfig.setAppId(appId);

//设置商户私钥

alipayConfig.setPrivateKey(merchantPrivateKey);

//设置支付宝公钥

alipayConfig.setAlipayPublicKey(aliPayPublicKey);

//设置支付宝网关

alipayConfig.setServerUrl(gatewayUrl);

//设置请求格式,固定值json.

alipayConfig.setFormat(AlipayConstants.FORMAT_JSON);

//设置字符集

alipayConfig.setCharset(AlipayConstants.CHARSET_UTF8);

//设置签名类型

alipayConfig.setSignType(AlipayConstants.SIGN_TYPE_RSA2);

//构造client

AlipayClient alipayClient=new DefaultAlipayClient(alipayConfig);

return alipayClient;

}

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

四、书写配置文件

# 支付宝支付相关参数

# 应用ID,你的APPID

alipay.app-id=

# 商户PID

alipay.seller-id=

# 支付宝网关

alipay.gateway-url=

# 商户私钥

alipay.merchant-private-key=

# 支付宝公钥

aliPay.aliPay-public-key=

# 接口内容加密秘钥,对称秘钥

alipay.content-key=

# 页面跳转同步通知页面路径

alipay.return-url=

# 支付宝支付成功回调地址

alipay.notify-url=

五、调用相关支付接口

1.流程图

2.创建支付

https://opendocs.alipay.com/apis/028r8t?scene=22

/**

* 发起支付

* @param orderNo

* @param uid

* @return

*/

@Override

public String createPay(String orderNo, String uid) {

//根据orderNo获取orderInfo

OrderInfo orderInfo = orderInfoService.getOne(new LambdaQueryWrapper()

.eq(OrderInfo::getOrderNo, orderNo)

.eq(OrderInfo::getUid, uid));

if (Objects.isNull(orderInfo)){

throw new ServiceErrorException(ResultCode.ERROR, "发起支付请求失败 - 订单不存在");

}

//更新订单的支付类型

orderInfoService.updatePayTypeByOrderNo(orderInfo.getOrderNo(), PayType.ALIPAY);

//创建支付宝请求对象

AlipayTradePagePayRequest request=new AlipayTradePagePayRequest();

//数据

AlipayTradePagePayModel bizModel=new AlipayTradePagePayModel();

bizModel.setOutTradeNo(orderInfo.getOrderNo());

//单位是元

bizModel.setTotalAmount(orderInfo.getTotalFee().toString());

bizModel.setSubject(orderInfo.getTitle());

//默认的

bizModel.setProductCode("FAST_INSTANT_TRADE_PAY");

request.setBizModel(bizModel);

request.setNotifyUrl(aliPayClientConfig.getNotifyUrl());

//用户支付后支付宝会以GET方法请求returnUrl,并且携带out_trade_no,trade_no,total_amount等参数.

request.setReturnUrl(aliPayClientConfig.getReturnUrl());

AlipayTradePagePayResponse response=null;

try{

//完成签名并执行请求

response=alipayClient.pageExecute(request);

if(response.isSuccess()){

log.debug("支付宝支付 - 调用成功");

return response.getBody();

}

else{

log.error("支付宝支付 - 调用失败");

log.error(response.getMsg());

return null;

}

}

catch(AlipayApiException e){

log.error("支付宝支付 - 创建支付交易失败");

throw new ServiceErrorException(ResultCode.ERROR, "支付宝支付 - 创建支付交易失败");

}

}

3.支付通知

https://opendocs.alipay.com/open/270/105902

/**

* 支付成功回调函数

* @param params

* @return

*/

@PostMapping("/callback")

public String callback(@RequestParam Map params){

log.debug("收到支付宝回调");

try{

//验签

boolean signVerified = AlipaySignature.rsaCheckV1(params,

aliPayClientConfig.getAliPayPublicKey(),

AlipayConstants.CHARSET_UTF8,


AlipayConstants.SIGN_TYPE_RSA2) ; //调用SDK验证签名

//验签成功

if(signVerified){

log.debug("验签成功");

//1.商家需要验证该通知数据中的 out_trade_no 是否为商家系统中创建的订单号

String orderNo = params.get("out_trade_no");

OrderInfo orderInfo = orderInfoService.getOrderByOrderNo(orderNo);

if (orderInfo == null){

log.error("订单不存在");

return "failure";

}

//2.判断 total_amount 是否确实为该订单的实际金额(即商家订单创建时的金额)

String totalAmount = params.get("total_amount");

if (!totalAmount.equals(orderInfo.getTotalFee().toString())){

log.error("金额校验失败");

return "failure";

}

//3.校验通知中的 seller_id(或者 seller_email ) 是否为 out_trade_no 这笔单据的对应的操作方

String sellerId = params.get("seller_id");

if (!aliPayClientConfig.getSellerId().equals(sellerId)){

log.error("商家PID校验失败");

return "failure";

}

//4.验证 app_id 是否为该商家本身

String appId = params.get("app_id");

if (!aliPayClientConfig.getAppId().equals(appId)){

log.error("应用APPID校验失败");

return "failure";

}

//5.在支付宝的业务通知中,只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时,

// 支付宝才会认定为买家付款成功。

String tradeStatus = params.get("trade_status");

if (!"TRADE_SUCCESS".equals(tradeStatus)){

log.error("支付未成功");

return "failure";

}

//支付成功后 - 处理订单

aliPayService.processOrder(params);

//除了success外其他返回均认为是失败

return "success";

}else{

log.error("验签失败");

return "failure";

}

}

catch(AlipayApiException e){

log.error("验签异常");

e.printStackTrace();

return "failure";

}

}

4.查询支付

https://opendocs.alipay.com/open/028woa

/**

* 查询订单

* @param orderNo

* @return

*/

@Override

public boolean query(String orderNo) {

//请求

AlipayTradeQueryRequest request=new AlipayTradeQueryRequest();

//数据

AlipayTradeQueryModel bizModel=new AlipayTradeQueryModel();

bizModel.setOutTradeNo(orderNo);

request.setBizModel(bizModel);

try{

//完成签名并执行请求

AlipayTradeQueryResponse response=alipayClient.execute(request);

if(response.isSuccess()){

log.debug("查询订单{}成功",orderNo);

Gson gson = new Gson();

HashMap resultMap=gson.fromJson(response.getBody(),HashMap.class);

String tradeStatus = (String) resultMap.get("trade_status");

if (tradeStatus.equals("TRADE_SUCCESS")){ //订单支付已完成

log.info("调用订单查询接口 - 订单已支付完成");

return true;

}

return false;

}

else{

log.error("查询订单{}失败,响应数据是{}.",orderNo,response.getBody());

return false;

}

}

catch(AlipayApiException e){

log.error("查询订单{}异常",orderNo);

return false;

}

}

5.取消支付

https://opendocs.alipay.com/open/028wob

/**

* 支付宝取消订单接口

* @param orderNo

*/

@Override

public void closeOrder(String orderNo) {

//请求

AlipayTradeCloseRequest request=new AlipayTradeCloseRequest();

//数据

AlipayTradeCloseModel bizModel=new AlipayTradeCloseModel();

bizModel.setOutTradeNo(orderNo);

request.setBizModel(bizModel);

try{

//完成签名并执行请求

AlipayTradeCloseResponse response=alipayClient.execute(request);

if(response.isSuccess()){

log.debug("订单:{}取消成功",orderNo);

}

else{

log.debug("订单:{}未创建,因此也可认为本次取消成功.",orderNo);

}

}

catch(AlipayApiException e){

log.error("订单{}取消异常",orderNo);

throw new ServiceErrorException(ResultCode.ERROR, "订单取消异常");

}

}

总结

支付回调中可能会存在验签一直失败的问题,出现这个问题的可能是公钥使用出错,验签使用的是支付宝公钥而不是应用公钥,如果开发者在开发过程中,出现验证一直不通过的问题可以尝试检查一下

以上就是就是全部内容,本文仅仅简单介绍了支付宝支付的部分API的使用,还有退款以及账单等相关操作后续使用到了会继续更新。

相关推荐

Linux集群自动化监控系统Zabbix集群搭建到实战

自动化监控系统...

systemd是什么如何使用_systemd/system

systemd是什么如何使用简介Systemd是一个在现代Linux发行版中广泛使用的系统和服务管理器。它负责启动系统并管理系统中运行的服务和进程。使用管理服务systemd可以用来启动、停止、...

Linux服务器日常巡检脚本分享_linux服务器监控脚本

Linux系统日常巡检脚本,巡检内容包含了,磁盘,...

7,MySQL管理员用户管理_mysql 管理员用户

一、首次设置密码1.初始化时设置(推荐)mysqld--initialize--user=mysql--datadir=/data/3306/data--basedir=/usr/local...

Python数据库编程教程:第 1 章 数据库基础与 Python 连接入门

1.1数据库的核心概念在开始Python数据库编程之前,我们需要先理解几个核心概念。数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它就像一个电子化的文件柜,能让我们高效...

Linux自定义开机自启动服务脚本_linux添加开机自启动脚本

设置WGCloud开机自动启动服务init.d目录下新建脚本在/etc/rc.d/init.d新建启动脚本wgcloudstart.sh,内容如下...

linux系统启动流程和服务管理,带你进去系统的世界

Linux启动流程Rhel6启动过程:开机自检bios-->MBR引导-->GRUB菜单-->加载内核-->init进程初始化Rhel7启动过程:开机自检BIOS-->M...

CentOS7系统如何修改主机名_centos更改主机名称

请关注本头条号,每天坚持更新原创干货技术文章。如需学习视频,请在微信搜索公众号“智传网优”直接开始自助视频学习1.前言本文将讲解CentOS7系统如何修改主机名。...

前端工程师需要熟悉的Linux服务器(SSH 终端操作)指令

在Linux服务器管理中,SSH(SecureShell)是远程操作的核心工具。以下是SSH终端操作的常用命令和技巧,涵盖连接、文件操作、系统管理等场景:一、SSH连接服务器1.基本连接...

Linux开机自启服务完全指南:3步搞定系统服务管理器配置

为什么需要配置开机自启?想象一下:电商服务器重启后,MySQL和Nginx没自动启动,整个网站瘫痪!这就是为什么开机自启是Linux运维的必备技能。自启服务能确保核心程序在系统启动时自动运行,避免人工...

Kubernetes 高可用(HA)集群部署指南

Kubernetes高可用(HA)集群部署指南本指南涵盖从概念理解、架构选择,到kubeadm高可用部署、生产优化、监控备份和运维的全流程,适用于希望搭建稳定、生产级Kubernetes集群...

Linux项目开发,你必须了解Systemd服务!

1.Systemd简介...

Linux系统systemd服务管理工具使用技巧

简介:在Linux系统里,systemd就像是所有进程的“源头”,它可是系统中PID值为1的进程哟。systemd其实是一堆工具的组合,它的作用可不止是启动操作系统这么简单,像后台服务...

Red Hat Enterprise Linux 10 安装 Kubernetes (K8s) 集群及高级管理

一、前言...

Linux下NetworkManager和network的和平共处

简介我们在使用CentoOS系统时偶尔会遇到配置都正确但network启动不了的问题,这问题经常是由NetworkManager引起的,关闭NetworkManage并取消开机启动network就能正...

取消回复欢迎 发表评论: