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

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

ztj100 2025-03-24 22:45 4 浏览 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的使用,还有退款以及账单等相关操作后续使用到了会继续更新。

相关推荐

Whoosh,纯python编写轻量级搜索工具

引言在许多应用程序中,搜索功能是至关重要的。Whoosh是一个纯Python编写的轻量级搜索引擎库,可以帮助我们快速构建搜索功能。无论是在网站、博客还是本地应用程序中,Whoosh都能提供高效的全文搜...

如何用Python实现二分搜索算法(python二分法查找代码)

如何用Python实现二分搜索算法二分搜索(BinarySearch)是一种高效的查找算法,适用于在有序数组中快速定位目标值。其核心思想是通过不断缩小搜索范围,每次将问题规模减半,时间复杂度为(O...

路径扫描 -- dirsearch(路径查找器怎么使用)

外表干净是尊重别人,内心干净是尊重自己,干净,在今天这个时代,应该是一种极高的赞美和珍贵。。。----网易云热评一、软件介绍Dirsearch是一种命令行工具,可以强制获取web服务器中的目录和文件...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。...

从零开始学习 Python!2《进阶知识》 Python进阶之路

欢迎来到Python学习的进阶篇章!如果你说已经掌握了基础语法,那么这篇就是你开启高手之路的大门。我们将一起探讨面向对象编程...

白帽黑客如何通过dirsearch脚本工具扫描和收集网站敏感文件

一、背景介绍...

Python之txt数据预定替换word预定义定位标记生成word报告(四)

续接Python之txt数据预定替换word预定义定位标记生成word报告(一)https://mp.toutiao.com/profile_v4/graphic/preview?pgc_id=748...

假期苦短,我用Python!这有个自动回复拜年信息的小程序

...

Python——字符串和正则表达式中的反斜杠('\')问题详解

在本篇文章里小编给大家整理的是关于Python字符串和正则表达式中的反斜杠('\')问题以及相关知识点,有需要的朋友们可以学习下。在Python普通字符串中在Python中,我们用'\'来转义某些普通...

Python re模块:正则表达式综合指南

Python...

Python中re模块详解(rem python)

在《...

python之re模块(python re模块sub)

re模块一.re模块的介绍1.什么是正则表达式"定义:正则表达式是一种对字符和特殊字符操作的一种逻辑公式,从特定的字符中,用正则表达字符来过滤的逻辑。(也是一种文本模式;)2、正则表达式可以帮助我们...

MySQL、PostgreSQL、SQL Server 数据库导入导出实操全解

在数字化时代,数据是关键资产,数据库的导入导出操作则是连接数据与应用场景的桥梁。以下是常见数据库导入导出的实用方法及代码,包含更多细节和特殊情况处理,助你应对各种实际场景。一、MySQL数据库...

Zabbix监控系统系列之六:监控 mysql

zabbix监控mysql1、监控规划在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。要进行监控的系统规划需要对Zabbix很了解,这里只是...

mysql系列之一文详解Navicat工具的使用(二)

本章内容是系列内容的第二部分,主要介绍Navicat工具的使用。若查看第一部分请见:...

取消回复欢迎 发表评论: